从datagridview将空单元格导出到csv逗号分隔文件

时间:2013-12-09 23:26:35

标签: c# excel csv datagridview

首先,我仍然是编程的新手,所以请原谅我可能提供的任何知识或术语的失误。

我正在构建一个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);
    }

1 个答案:

答案 0 :(得分:0)

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

 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

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