C# 使用ClosedXML的大型数据表时发生OutOfMemory错误

C# 使用ClosedXML的大型数据表时发生OutOfMemory错误,c#,excel,datatable,streamreader,closedxml,C#,Excel,Datatable,Streamreader,Closedxml,我在添加大型数据表时创建工作表时遇到问题。我的内存出了问题。我按照建议关闭了事件跟踪以提高性能和内存消耗,但我仍然遇到这些错误 以下是一些示例代码: public void SaveWorkBook(string xlFileName, DataSet dataSet) { using (var xlWorkBook = new XLWorkbook(XLEventTracking.Disabled)) { xlWorkBook.AddWorksheet(data

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

以下是一些示例代码:

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
方法()

问题是,每次我尝试使用可用的选项写入数据表时,只会写入第一列。然后将文件放低,我看到的是其他数据列,但是在工作表的第一个单元格中,而不是像假设的那样在一行中跨越这些列。只有一排。可能是写的最后一张唱片

有人能帮我理解这是怎么回事吗

下面是一个使用
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文件的一行。将整个文件加载到数据表会导致内存不足错误。因此,我一次读取一行文件,并尝试在创建工作表后添加它

有人能分享一些关于这方面的见解吗


谢谢

这是ClosedXML中的一个已知问题。目前没有解决办法。请参见

中的问题这是ClosedXML中的已知问题。目前没有解决办法。参见

侧注中的问题,您是否关心工作簿中的样式(字体、颜色等)?是样式导致了内存的过度使用。不,我不在乎样式。当excel文件被写入后打开时,我关心列宽,但仅此而已。列宽需要样式。字体大小将影响列的宽度。那么我还没有一个解决办法给你。顺便问一下,你是否关心你的工作簿中的样式(字体、颜色等)?是样式导致了内存的过度使用。不,我不在乎样式。当excel文件被写入后打开时,我关心列宽,但仅此而已。列宽需要样式。字体大小将影响列的宽度。所以我还没有解决办法。