Convertir DataTable a CSV en C#

Muhammad Zeeshan 12 octubre 2023
Convertir DataTable a CSV en C#

Este artículo lo guiará a través de la conversión de un DataTable a un archivo CSV usando C#. Para empezar, debemos saber qué es CSV, así que entremos en materia.

Los datos en un Coma Split Values, también conocido como archivo CSV, están separados en sus respectivas columnas por comas en lugar de espacios. Otro uso de un archivo CSV es abrir el archivo en Excel inmediatamente cuando los datos se colocan automáticamente en las celdas correspondientes de Excel.

Convertir DataTable a CSV en C#

El primer paso para convertir un DataTable en un archivo CSV es crear un DataTable. Los pasos necesarios para hacerlo se describen en los siguientes párrafos.

Crear y llenar la tabla de datos

  • Para comenzar, debemos importar las siguientes bibliotecas:

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
  • Creamos una clase llamada datacreation con un método llamado CreateData() que genera un DataTable como valor de retorno.

    public static class datacreation {
      public static DataTable CreateData() {}
    }
    
  • Para comenzar con la entrada de datos, tenemos que crear un objeto DataTable llamado dt en CreateData().

    DataTable dt = new DataTable();
    
  • Después de inicializar el objeto, el siguiente paso es agregar columnas de datos a la DataTable dt. Hemos incluido los campos Rollnum, Firstname, Lastname y Subject, y puede agregar cualquier otra área que necesite.

    dt.Columns.Add("RollNum", typeof(int));
    dt.Columns.Add("Firstname", typeof(string));
    dt.Columns.Add("Lastname", typeof(string));
    dt.Columns.Add("Subjects", typeof(string));
    
  • A continuación, complete la información en estas columnas o campos.

    dt.Rows.Add(3227, "Zeeshan", "Khan", "C#");
    dt.Rows.Add(3290, "Bubby", "Zeeshan", "Java");
    dt.Rows.Add(3247, "Osama", "shanii", "C++");
    dt.Rows.Add(3156, "Haseeb", "Bhatti", "Python");
    dt.Rows.Add(3223, "Saad", "Shukhri", "Mongo Db");
    dt.Rows.Add(3267, "Sheraz", "Malik", "MySQl");
    dt.Rows.Add(3288, "Nabeel", "Sindho", "PHP");
    dt.Rows.Add(3299, "Ahsan", "Chishti", "C");
    
  • La función CreateData() devolverá una tabla del tipo DataTable.

    return dt;
    

Convierta el DataTable a CSV en C#

Después de haber creado el DataTable, el siguiente paso es escribir el código que convertirá el DataTable a CSV.

  • Hemos agregado un nuevo método llamado ConvertTocsv a la clase implementCSV. Las variables dt y path son los parámetros que toma.

    public static class implementCSV {
      public static void ConvertTocsv(this DataTable dt, string path) {}
    }
    
  • En el método ConvertTocsv, hemos creado un objeto StreamWriter llamado s, que escribirá datos en la ruta especificada.

    StreamWriter s = new StreamWriter(path, false);
    
  • Usaremos un bucle for para dividir los datos de DataTable insertando comas entre cada columna.

    for (int i = 0; i < dt.Columns.Count; i++) {
      s.Write(dt.Columns[i]);
      if (i < dt.Columns.Count - 1) {
        s.Write(",");
      }
    }
    s.Write(s.NewLine);
    
  • Después de eso, ahora utilizaremos un bucle foreach, que escribirá datos de DataTable dt con una coma.

    foreach (DataRow dr in dt.Rows) {
      for (int i = 0; i < dt.Columns.Count; i++) {
        if (!Convert.IsDBNull(dr[i])) {
          string value = dr[i].ToString();
          if (value.Contains(',')) {
            value = String.Format("\"{0}\"", value);
            s.Write(value);
          } else {
            s.Write(dr[i].ToString());
          }
        }
        if (i < dt.Columns.Count - 1) {
          s.Write(",");
        }
      }
      s.Write(s.NewLine);
    }
    

Código fuente completo

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DataTableExport {
  public static class datacreation {
    public static DataTable CreateData() {
      DataTable dt = new DataTable();
      dt.Columns.Add("RollNum", typeof(int));
      dt.Columns.Add("Firstname", typeof(string));
      dt.Columns.Add("Lastname", typeof(string));
      dt.Columns.Add("Subjects", typeof(string));

      dt.Rows.Add(3227, "Zeeshan", "Khan", "C#");
      dt.Rows.Add(3290, "Bubby", "Zeeshan", "Java");
      dt.Rows.Add(3247, "Osama", "shanii", "C++");
      dt.Rows.Add(3156, "Haseeb", "Bhatti", "Python");
      dt.Rows.Add(3223, "Saad", "Shukhri", "Mongo Db");
      dt.Rows.Add(3267, "Sheraz", "Malik", "MySQl");
      dt.Rows.Add(3288, "Nabeel", "Sindho", "PHP");
      dt.Rows.Add(3299, "Ahsan", "Chishti", "C");
      return dt;
    }
  }
  public static class implementCSV {
    public static void ConvertTocsv(this DataTable dt, string path) {
      StreamWriter s = new StreamWriter(path, false);
      for (int i = 0; i < dt.Columns.Count; i++) {
        s.Write(dt.Columns[i]);
        if (i < dt.Columns.Count - 1) {
          s.Write(",");
        }
      }
      s.Write(s.NewLine);
      foreach (DataRow dr in dt.Rows) {
        for (int i = 0; i < dt.Columns.Count; i++) {
          if (!Convert.IsDBNull(dr[i])) {
            string value = dr[i].ToString();
            if (value.Contains(',')) {
              value = String.Format("\"{0}\"", value);
              s.Write(value);
            } else {
              s.Write(dr[i].ToString());
            }
          }
          if (i < dt.Columns.Count - 1) {
            s.Write(",");
          }
        }
        s.Write(s.NewLine);
      }
      s.Close();
    }
  }
}

Crear un formulario de Windows

Después de crear los datos en el DataTable y separarlos con comas, el siguiente paso es construir un Windows Form donde se pueden mostrar los datos y luego convertirlos al formato .csv.

  • Para empezar, vamos a crear un Windows Form, como se muestra a continuación, y dentro de él pondremos un DataGridView y un botón llamado Convertir datos a CSV. Se incluye un DataGridView que muestra los datos creados y un botón que convierte el DataTable en CSV.

    Formulario de tabla de datos

  • Cuando haya terminado de ejecutar Windows Form, se verá así:

    Formulario de ejecución

Escriba el código para el formulario de Windows

Después de haber creado el Windows Form, el siguiente paso es escribir el código para el botón Convertir datos a CSV.

  • Inicialice un objeto y rellénelo con datos llamando a los métodos que se enumeran a continuación.

    DataTable dt = datacreation.CreateData();
    
  • OpenSavefileDialog() se puede utilizar para guardar el archivo con el nombre dado.

    string filename = OpenSavefileDialog();
    
  • ConvertTocsv se utilizará para crear un archivo CSV a partir de los datos que hemos creado.

    dt.ConvertTocsv(filename);
    

Código fuente del formulario de Windows

public Form1() {
  InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e) {
  DataTable dt = datacreation.CreateData();
  dataGridView1.DataSource = dt;
}

private void btnCSV_Click(object sender, EventArgs e) {
  DataTable dt = datacreation.CreateData();
  string filename = OpenSavefileDialog();
  dt.ConvertTocsv(filename);
}

private string OpenSavefileDialog() {
  string filename = null;
  SaveFileDialog saveFileDialog = new SaveFileDialog();
  saveFileDialog.Filter = "csv File|*.csv";
  saveFileDialog.Title = "Save";
  DialogResult dialogResult = saveFileDialog.ShowDialog();
  if (dialogResult == DialogResult.OK) {
    filename = saveFileDialog.FileName;
  }
  return filename;
}
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn

Artículo relacionado - Csharp CSV

Artículo relacionado - Csharp DataTable