繁体   English   中英

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

[英]Exporting empty cells to csv comma-delimited file from 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);
    }

尝试使用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

然后,当您稍后对其进行处理时,可以使用所选字符将这些字符标识为空白或空格。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM