读取大型 XLSX 文件

问题描述 投票:0回答:2

我有一个应用程序必须读取 Excel 并将其转换为数组。到目前为止,一切都很好。一切正常文件,直到我尝试转换更大的文件。我尝试 OpenXML 并尝试 SAX 方法:

using (SpreadsheetDocument xlsx = SpreadsheetDocument.Open(filePath, false))
{
   WorkbookPart workbookPart = xlsx.WorkbookPart;
   List<List<string>> parsedContent = new List<List<string>>();
   foreach (WorksheetPart worksheet in workbookPart.WorksheetParts)
       {
           OpenXmlReader xlsxReader = OpenXmlReader.Create(worksheet);

           while (xlsxReader.Read())
           {
           }
        }
 }

这对于 1 - 10MB 范围内的文件效果很好。我的问题是当我尝试加载 10+ MB 文件时。结果是 OutOfMemoryException。如何正确读取这么大的数据呢?如何做到记忆高效?

P.s.我尝试了 ClosedXML、EPPlus 等库。

每一个解决方案都将受到赞赏。先谢谢你了

c# asp.net .net excel web-services
2个回答
9
投票

如果您打算只读取 Excel 文件内容,我建议您使用 ExcelDataReader 库代替 Link

using (var stream = File.Open(filePath, FileMode.Open, FileAccess.Read))
{
    using (var reader = ExcelReaderFactory.CreateReader(stream))
    {
        do
        {
            // Read row
            while (reader.Read())
            {
                // Read column values
                for (int i = 0; i < reader.FieldCount; i++)
                {               
                    var cellValue = reader.GetValue(i);
                }
            }
        }
        while (reader.NextResult());
    }
}

0
投票

使用ExcelDataReader。通过 Nuget 很容易安装,只需要几行代码:

努吉特:

Install-Package ExcelDataReader

用途:

 using (FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read))
    {
        using (IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream))
        {
            DataSet result = excelReader.AsDataSet();
            foreach (DataRow dr in result[0])
            {
                //Do stuff
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.