使用ClosedXML

时间:2017-04-17 20:07:44

标签: c# excel datatable streamreader closedxml

添加大型DataTable时,我遇到了创建工作表的问题。我出现了内存错误。我建议关闭事件跟踪以提高性能和内存消耗,但我仍然遇到这些错误。

以下是一些示例代码:

public void SaveWorkBook(string xlFileName, DataSet dataSet)
{
    using (var xlWorkBook = new XLWorkbook(XLEventTracking.Disabled))
    {
        xlWorkBook.AddWorksheet(dataSet);
        xlWorkBook.SaveAs(xlFileName);
    }
}

public void SaveWorkBook(string xlFileName, params DataTable[] dataTables)
{           
    using (var xlWorkBook = new XLWorkbook(XLEventTracking.Disabled))
    {
        foreach (var dataTable in dataTables) xlWorkBook.AddWorksheet(dataTable);
        xlWorkBook.SaveAs(xlFileName);
    }
}

问题当然是DataTables庞大的时候。像成千上万的记录或更多。我尝试使用替代方法来处理大型数据表,例如使用具有较小记录计数的临时数据表,然后将它们刷新到工作表,清除数据表,然后用新数据重新填充它。填充,冲洗,清除,重复。那个或InsertData方法()

问题在于每次我尝试使用可用选项编写数据表时,只会编写第一列。然后降低文件,我看到其他数据列,但在工作表的第一个单元格中,而不是像他们想象的那样跨越单行中的列。而且只有1排。可能是写的最后一条记录。

有人可以帮我理解这是如何运作的吗?

以下是使用InsertData方法的代码段。我使用dataTable作为模板创建工作表,因为它定义了所有列。然后我得到该工作表并尝试添加它。

public void SaveWorkBook(string xlFileName, DataTable dataTable, string dataFileName, char delimitor)
{
    using (var xlWorkBook = new XLWorkbook(XLEventTracking.Disabled))
    {
        xlWorkBook.AddWorksheet(dataTable);

        var workSheet = xlWorkBook.Worksheets.First(ws => ws.Name == dataTable.TableName);                    

        using (var sr = new StreamReader(dataFileName))
        {
            var rowIndex = 1;

            sr.ReadLine();

            while (!sr.EndOfStream)
            {
                var line = sr.ReadLine() + string.Empty;
                workSheet.Cell(++rowIndex, 1).InsertData(line.Split(delimitor));
            }
        }

        xlWorkBook.SaveAs(xlFileName);
    }
}

正如您所看到的,我正在使用StreamReader一次读取我之前创建的CSV文件中的1行。将整个文件加载到数据中会导致内存不足错误。所以我一次读取文件1行,并在创建工作表后尝试添加它。

任何人都可以对此有所了解吗?

由于

1 个答案:

答案 0 :(得分:1)

这是ClosedXML中的已知问题。目前没有解决方案。请参阅https://github.com/ClosedXML/ClosedXML/issues/264

上的问题