【问题标题】:Exporting empty cells to csv comma-delimited file from datagridview从 datagridview 将空单元格导出到 csv 逗号分隔文件
【发布时间】:2013-12-09 23:26:35
【问题描述】:

首先,我对编程还很陌生,所以请原谅我可能提供的知识或术语方面的任何失误。

我正在构建一个 C# 应用程序,它首先将数据从 Excel 工作簿导入一组 datagridviews(每个工作表一个 dgv)。用户可以从每个数据网格中选择自定义范围的单元格,然后单击按钮将所选范围导出到 CSV 文件。到目前为止,我已经完成了大部分工作,但我遇到的问题是它最后会跳过空白单元格,我需要将这些单元格包含在 csv 的最终输出中。例如,如果单元格 A1 到 A3 有值,但 A4 没有值,并且用户选择范围 A1 到 A4,则最终的 csv 需要输出为:

1,2,3,

但是,按照我现在的方式,它只输出1,2,3。如果范围末尾有多个空白单元格,它会做同样的事情,我们需要考虑这些。

请注意,如果空白单元格出现在范围内的任何位置,它工作正常...只有当单元格在范围的开头或结尾处为空时才会发生这种情况。

如果我将任何空白或空值重置为“”,它可以作为一种解决方法,但我希望最终文件中没有任何空白类型的值。

感谢您的帮助。这是我处理此导出功能的代码:

    private void exportClick(DataGridView dgv)
    {
        Int32 selectedCellCount = dgv.GetCellCount(DataGridViewElementStates.Selected);
        int CurrentRow = 0;
        int CurrentColumn = 0;

        Excel.Application xlApp;
        Excel.Workbook xlWorkBook;
        Excel.Worksheet xlWorkSheet;
        object misValue = System.Reflection.Missing.Value;

        xlApp = new Excel.Application();
        xlWorkBook = xlApp.Workbooks.Add(misValue);
        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

        if (selectedCellCount > 0)
        {
            for (int i = 0; i < selectedCellCount; i++)
            {
                // Get the Row and Column index values
                CurrentRow = Convert.ToInt16(dgv.SelectedCells[i].RowIndex.ToString());
                CurrentColumn = Convert.ToInt16(dgv.SelectedCells[i].ColumnIndex.ToString());

                // Set cell to current cells' value
                DataGridViewCell cell = dgv[CurrentColumn, CurrentRow];

                // Check if the cell Value is empty, set to ??? so a comma is written
                if (String.IsNullOrEmpty(cell.Value.ToString()))
                    cell.Value = " ";

                // Write the value to the worksheet 
                xlWorkSheet.Cells[CurrentRow + 1, CurrentColumn + 1] = cell.Value;
            }

            // Prompt to save the results as a csv file
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {

                xlWorkBook.SaveAs(saveFileDialog1.FileName, Excel.XlFileFormat.xlCSV, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
            }
        }

        xlWorkBook.Close(true, misValue, misValue);
        xlApp.Quit();

        releaseObject(xlWorkSheet);
        releaseObject(xlWorkBook);
        releaseObject(xlApp);
    }

【问题讨论】:

    标签: c# excel csv datagridview


    【解决方案1】:

    尝试使用ascii 添加non-breaking space,例如:

     if (String.IsNullOrEmpty(cell.Value.ToString()))
         cell.Value = char.ConvertFromUtf32(160);
    

    或 ascii 表中的任何其他不可见字符,例如:

     Delete - 127
     Soft Hyphen - 173
     Unknown - 129 or 141
    

    或者,也许您可​​以只使用一个特殊字符,将其表示为空 用户不太可能使用,例如那些字母e 上面的字符如:

     232 - with grave
     233 - with acute
     234 - with circumflex
     235 - with diaerisis
    

    然后当您稍后处理它时,您可以将这些字符识别为空或空格 使用您选择的角色。

    【讨论】:

    • 谢谢埃德珀。最终,我决定跳过输出到 Excel 并使用管道分隔符将输出写入文本文件。由于 Excel csv 默认情况下只是逗号分隔结果,因此我们需要为此找到不同的方法,因为我们的某些数据可能包含逗号。不过,我感谢您的反馈!
    • @svenGUTT 很高兴您可以根据自己的需要找到解决方法。编码快乐,上帝保佑!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    相关资源
    最近更新 更多