【问题标题】:OutOfMemory errors using large datatables with ClosedXML使用带有 ClosedXML 的大型数据表时出现 OutOfMemory 错误
【发布时间】:2017-04-17 20:07:43
【问题描述】:

添加大型数据表时,我在创建工作表时遇到问题。我正在摆脱内存错误。我按照建议关闭了事件跟踪以提高性能和内存消耗,但我仍然遇到这些错误。

这里是一些示例代码:

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);
    }
}

问题当然是当数据表很大时。像成千上万的记录或更多。我尝试对大型数据表使用另一种方法,例如使用具有较小记录数的临时表,然后将它们刷新到工作表,清除数据表,然后用新数据重新填充它。填充,冲洗,清除,重复。或者InsertData方法()

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

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

这是使用InsertData 方法的代码sn-p。我使用 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 行并尝试在创建工作表后添加它。

谁能分享一些对此的见解?

谢谢

【问题讨论】:

  • 旁注,您是否关心工作簿中的样式(字体、颜色等)?是样式导致内存使用过多。
  • 不,我不关心样式。在编写完成后打开 excel 文件时,我关心列宽,仅此而已。
  • 对于列宽,需要样式。字体大小会影响列的宽度。那么我还没有适合你的解决方法。

标签: c# excel datatable streamreader closedxml


【解决方案1】:

这是 ClosedXML 中的一个已知问题。目前没有解决办法。在https://github.com/ClosedXML/ClosedXML/issues/264查看问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 2016-08-28
    相关资源
    最近更新 更多