exportar create c# datagridview streamwriter

c# - create - Exportar datagridview a un archivo csv



c# exportar datagridview a csv (8)

Encontré el problema, la codificación estaba bien, pero tenía una celda vacía que me dio el problema.

Estoy trabajando en una aplicación que exportará mi DataGridView llamado scannerDataGridView a un archivo csv.

Encontré un código de ejemplo para hacer esto, pero no puedo hacerlo funcionar. Por cierto, mi cuadrícula de datos no está unida a una fuente.

Cuando intento usar Streamwriter para escribir solo los encabezados de las columnas, todo va bien, pero cuando intento exportar toda la cuadrícula de datos, incluidos los datos, obtengo una excepción.

System.NullReferenceException: referencia de objeto no establecida en una instancia de un objeto. en Scanmonitor.Form1.button1_Click (Object Sender, EventArgs e)

Aquí está mi código, el error se da en la siguiente línea:

dataFromGrid = dataFromGrid + '','' + dataRowObject.Cells [i] .Value.ToString ();

//csvFileWriter = StreamWriter //scannerDataGridView = DataGridView private void button1_Click(object sender, EventArgs e) { string CsvFpath = @"C:/scanner/CSV-EXPORT.csv"; try { System.IO.StreamWriter csvFileWriter = new StreamWriter(CsvFpath, false); string columnHeaderText = ""; int countColumn = scannerDataGridView.ColumnCount - 1; if (countColumn >= 0) { columnHeaderText = scannerDataGridView.Columns[0].HeaderText; } for (int i = 1; i <= countColumn; i++) { columnHeaderText = columnHeaderText + '','' + scannerDataGridView.Columns[i].HeaderText; } csvFileWriter.WriteLine(columnHeaderText); foreach (DataGridViewRow dataRowObject in scannerDataGridView.Rows) { if (!dataRowObject.IsNewRow) { string dataFromGrid = ""; dataFromGrid = dataRowObject.Cells[0].Value.ToString(); for (int i = 1; i <= countColumn; i++) { dataFromGrid = dataFromGrid + '','' + dataRowObject.Cells[i].Value.ToString(); csvFileWriter.WriteLine(dataFromGrid); } } } csvFileWriter.Flush(); csvFileWriter.Close(); } catch (Exception exceptionObject) { MessageBox.Show(exceptionObject.ToString()); }


La línea "csvFileWriter.WriteLine (dataFromGrid);" debe moverse una línea por debajo del corchete de cierre, de lo contrario obtendrás muchos resultados repetidos:

for (int i = 1; i <= countColumn; i++) { dataFromGrid = dataFromGrid + '','' + dataRowObject.Cells[i].Value.ToString(); } csvFileWriter.WriteLine(dataFromGrid);


LINQ FTW!

var sb = new StringBuilder(); var headers = dataGridView1.Columns.Cast<DataGridViewColumn>(); sb.AppendLine(string.Join(",", headers.Select(column => "/"" + column.HeaderText + "/"").ToArray())); foreach (DataGridViewRow row in dataGridView1.Rows) { var cells = row.Cells.Cast<DataGridViewCell>(); sb.AppendLine(string.Join(",", cells.Select(cell => "/"" + cell.Value + "/"").ToArray())); }

Y, de hecho, c.Value.ToString() lanzará en valor nulo, mientras que c.Value se convertirá correctamente en una cadena vacía.


Tu código estaba casi ahí ... Pero hice las siguientes correcciones y funciona muy bien. Gracias por la publicacion.

Error:

string[] output = new string[dgvLista_Apl_Geral.RowCount + 1];

Corrección:

string[] output = new string[DGV.RowCount + 1];

Error:

System.IO.File.WriteAllLines(filename, output, System.Text.Encoding.UTF8);

Corrección:

System.IO.File.WriteAllLines(sfd.FileName, output, System.Text.Encoding.UTF8);


Sé que esto probablemente ya está muerto, pero hice un código simple que crea un archivo CSV basado en un objeto DataGridView y le pregunta dónde quiere guardarlo.

Es bastante sencillo, solo pega la función y úsalo. Ya tiene un manejo básico de excepciones por lo que es bastante seguro de usar. disfrutar.

private void SaveToCSV(DataGridView DGV) { string filename = ""; SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "CSV (*.csv)|*.csv"; sfd.FileName = "Output.csv"; if (sfd.ShowDialog() == DialogResult.OK) { MessageBox.Show("Data will be exported and you will be notified when it is ready."); if (File.Exists(filename)) { try { File.Delete(filename); } catch (IOException ex) { MessageBox.Show("It wasn''t possible to write the data to the disk." + ex.Message); } } int columnCount = DGV.ColumnCount; string columnNames = ""; string[] output = new string[DGV.RowCount + 1]; for (int i = 0; i < columnCount; i++) { columnNames += DGV.Columns[i].Name.ToString() + ","; } output[0] += columnNames; for (int i = 1; (i - 1) < DGV.RowCount; i++) { for (int j = 0; j < columnCount; j++) { output[i] += DGV.Rows[i - 1].Cells[j].Value.ToString() + ","; } } System.IO.File.WriteAllLines(sfd.FileName, output, System.Text.Encoding.UTF8); MessageBox.Show("Your file was generated and its ready for use."); } }

EDITAR: cambiado '';'' a '','' ya que estamos hablando de archivos CSV


Una característica poco conocida de DataGridView es la capacidad de seleccionar mediante programación algunas o todas las DataGridCells, y enviarlas a un DataObject utilizando el método DataGridView.GetClipboardContent() . ¿Cuál es la ventaja de esto, entonces?

Un DataObject no solo almacena un objeto, sino la representación de ese objeto en varios formatos diferentes. Así es como el Portapapeles puede hacer su magia; tiene varios formatos almacenados y diferentes controles / clases pueden especificar qué formato desean aceptar. En este caso, DataGridView almacenará las celdas seleccionadas en DataObject como un formato de texto delimitado por tabuladores, un formato CSV o como HTML (*).

El contenido de DataObject se puede recuperar llamando a los DataObject.GetData() o DataObject.GetText() y especificando un formato de datos predefinido enum. En este caso, queremos que el formato sea TextDataFormat.CommaSeparatedValue para CSV, luego podemos simplemente escribir ese resultado en un archivo usando la clase System.IO.File .

(*) En realidad, lo que devuelve no es, estrictamente hablando, HTML. Este formato también contendrá un encabezado de datos que no esperaba. Si bien el encabezado contiene la posición de inicio del HTML, simplemente descarto cualquier elemento que myString.Substring(IndexOf("<HTML>")); encima de la etiqueta HTML como myString.Substring(IndexOf("<HTML>")); .

Observe el siguiente código:

void SaveDataGridViewToCSV(string filename) { // Choose whether to write header. Use EnableWithoutHeaderText instead to omit header. dataGridView1.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText; // Select all the cells dataGridView1.SelectAll(); // Copy selected cells to DataObject DataObject dataObject = dataGridView1.GetClipboardContent(); // Get the text of the DataObject, and serialize it to a file File.WriteAllText(filename, dataObject.GetText(TextDataFormat.CommaSeparatedValue)); }

Ahora, ¿no es eso mejor? ¿Por qué reinventar la rueda?

Espero que esto ayude...


Creo que este es el correcto para su función SaveToCSV: (de lo contrario, nulo ...)

for (int i = 0; i < columnCount; i++)

No:

for (int i = 1; (i - 1) < DGV.RowCount; i++)


Please check this code.its working fine try { //Build the CSV file data as a Comma separated string. string csv = string.Empty; //Add the Header row for CSV file. foreach (DataGridViewColumn column in dataGridView1.Columns) { csv += column.HeaderText + '',''; } //Add new line. csv += "/r/n"; //Adding the Rows foreach (DataGridViewRow row in dataGridView1.Rows) { foreach (DataGridViewCell cell in row.Cells) { if (cell.Value != null) { //Add the Data rows. csv += cell.Value.ToString().TrimEnd('','').Replace(",", ";") + '',''; } // break; } //Add new line. csv += "/r/n"; } //Exporting to CSV. string folderPath = "C://CSV//"; if (!Directory.Exists(folderPath)) { Directory.CreateDirectory(folderPath); } File.WriteAllText(folderPath + "Invoice.csv", csv); MessageBox.Show(""); } catch { MessageBox.Show(""); }