C#将Excel转换为CSV并忽略空单元格

时间:2017-11-10 16:32:07

标签: c# excel

朋友,C#noob在这里,所以提前道歉!

我有以下方法循环我的Excel工作簿表作为数据表通过字符串生成器输出将其转换为CSV。

    public static string ToCSV(this DataTable table)
    {
        var result = new StringBuilder();
        for (int i = 0; i < table.Columns.Count; i++)
        {
            result.Append(table.Columns[i].ColumnName);
            result.Append(i == table.Columns.Count - 1 ? "\n" : ",");
        }

        foreach (DataRow row in table.Rows)
        {
            for (int i = 0; i < table.Columns.Count; i++)
            {
                result.Append(row[i].ToString());
                result.Append(i == table.Columns.Count - 1 ? "\n" : ",");
            }
        }
        return result.ToString();
    }

如果Excel文件是干净的,这可以正常工作。像这样:

enter image description here

但是,如果您向Excel文件添加任何格式或任何内容,C#方法会将单元格视为包含内容并将其输出到CSV文件。

像这样:

enter image description here

我试过这样做并检查行的长度......

if (String.IsNullOrWhiteSpace(row[i].ToString()))
{
 continue;
}

...但它打破了文件的结构。

问题;我究竟做错了什么?!我觉得我很近,但它只是没有表现。

提前感谢您的协助。

2 个答案:

答案 0 :(得分:0)

if (row[i] == DBNull.Value || String.IsNullOrWhiteSpace(row[i].ToString()))
{
    continue;
}

答案 1 :(得分:0)

从excel文件创建数据表时,您可以检查workheet.FirstColumnUsed,worksheet.LastColumnUsed同样适用于行。这样,您将只获得包含记录的行和列。

如果您使用ClosedXML读取Excel文件,那么我猜他们提供了UsedRange(), FirstRowUsed,LastRowUsed属性。 有关详细信息:ClosedXML GITHUB repository

如果您使用interop api阅读excel文件,则此答案可能会有所帮助:Stackoverflow:Remove empty row and column