正在将数据网格视图导出到csv文件

本文关键字:csv 文件 视图 网格 数据 数据网 | 更新日期: 2023-09-27 18:29:27

我正在开发一个应用程序,该应用程序将把名为scannerDataGridView的DataGridView导出到csv文件中。

找到了一些执行此操作的示例代码,但无法使其正常工作。顺便说一句,我的数据网格没有数据绑定到源。

当我尝试使用Streamwriter只写列标题时,一切都很顺利,但当我尝试导出包括数据在内的整个数据网格时,我会得到一个exeption trhown。

System.NullReferenceException:对象引用未设置为实例对象的。在Scanmonitor.Form1.button_Click(Object sender,EventArgs e)

这是我的代码,错误出现在以下行:

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());
    }

正在将数据网格视图导出到csv文件

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()));
}

事实上,c.Value.ToString()将抛出null值,而c.Value将正确地转换为空字符串。

DataGridView的一个鲜为人知的功能是能够以编程方式选择部分或全部DataGridCells,并使用方法DataGridView.GetClipboardContent()将它们发送到DataObject。那这样有什么好处呢?

DataObject不仅存储一个对象,而且还以各种不同的格式存储该对象的表示。这就是剪贴板发挥其魔力的方式;它存储了各种格式,不同的控件/类可以指定它们希望接受的格式。在这种情况下,DataGridView将以制表符分隔的文本格式、CSV格式或HTML(*)的形式存储DataObject中的选定单元格。

可以通过调用DataObject.GetData()DataObject.GetText()方法并指定预定义的数据格式枚举来检索DataObject的内容。在这种情况下,我们希望CSV的格式为TextDataFormat.CommaSeparatedValue,然后我们可以使用System.IO.File类将结果写入文件。

(*)实际上,严格地说,它返回的不是HTML。此格式还将包含一个您没有预料到的数据头。虽然头部确实包含HTML的起始位置,但我只是丢弃HTML标记上方的任何内容,如myString.Substring(IndexOf("<HTML>"));

遵守以下代码:

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));
}

现在,这不是更好吗?为什么要重新发明轮子?

希望这能帮助。。。

      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("");
        }

发现问题,编码很好,但我有一个空单元格。

您的代码就快到了。。。但我做了以下更正,效果很好。谢谢你的帖子。

错误:

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

更正:

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

错误:

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

更正:

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

行"csvFileWriter.WriteLine(dataFromGrid);"应该移到右括号下一行,否则会得到很多重复的结果:

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

我认为这对SaveToCSV函数来说是正确的:(否则为Null…)

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

不是:

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

这是我在项目中使用的:

void export_csv(string file, DataGridView grid)
{
    using (StreamWriter csv = new StreamWriter(file, false))
    {
        int totalcolms = grid.ColumnCount;
        foreach (DataGridViewColumn colm in grid.Columns) csv.Write(colm.HeaderText + ',');
        csv.Write(''n');
        string data = "";
        foreach (DataGridViewRow row in grid.Rows)
        {
            if (row.IsNewRow) continue;
            data = "";
            for (int i = 0; i < totalcolms; i++)
            {
                data += (row.Cells[i].Value ?? "").ToString() + ',';
            }
            if (data != string.Empty) csv.WriteLine(data);
        }
    }
}