c# NPOI读取大型Excel文件(>8224字节)

lyr7nygr  于 2023-03-04  发布在  C#
关注(0)|答案(1)|浏览(380)

我正在使用.net 7.0和Nuget NPOI包读取www.example.com项目中不同类型的excel文件api.net。问题是此包仅支持最多8224字节的excel文件。是否有读取excel文件的方法(旧样式和openXml格式样式)更大的尺寸?我不能使用excel文件作为数据集读取器,因为excel文件可以存在multiple工作表和工作表并不总是vcompletly设置为表格视图。
尝试打开59kb excel时,我看到“excel记录的内容不能超过8224字节”

public IWorkbook ConverByteArrayToExcelPackage(byte[] byteArray)
    {
        using (MemoryStream memStream = new MemoryStream(byteArray))
        {
            IWorkbook workbook = WorkbookFactory.Create(memStream);
            
            return workbook;
        }
    }

我第一次尝试使用其他软件包,如EPPlus,但它只支持OpenXml格式,不能打开Excel97文件,所以我选择了NPOI,因为它有一个通用的函数来打开文件,不管格式如何。
我发现了一个关于JavaScript的帖子,提到使用“DocumentInputStream”,但找不到如何使用它?。

w6lpcovy

w6lpcovy1#

    • 简短版本**

这是一个错误的文件,甚至Excel都可能无法打开它。请创建它的人使用xlsx创建一个新文件,而不是16年前废弃的xls
你也许可以使用ExcelDataReader这样的库来读取坏文件,但不要指望它。最坏的情况是,代码可能不会抛出,而只返回长文本的前8K个字符。我还没有测试过这个。
您可以在Excel中打开该文件并再次保存。如果可以打开该文件,Excel将以正确的格式保存该文件。Excel可能仍会抱怨或警告需要修复该文件。

    • 详细版本**

EPPlus, but this only supports the OpenXml format and does not open Excel97 files.这是因为xls已经过时了,在过去的16年里被xlsx所取代。像Google Sheets甚至Microsoft 365这样的云提供商几年前就放弃了对它的支持。使用xls文件绝对没有任何好处,当然也没有兼容性。
这就是问题的原因--文件很糟糕,是由一个不知道旧格式的库生成的。Excel工作表最多可以容纳100万行。但在过时的格式中,一个记录最多只能容纳8224个字符。The Record specs say
如果对于给定的记录数据分量要写入的字节总数大于8224,则使用如在用于该记录的相应ABNF中指定的Continue(2.4.58节)、ContinueFrt(2.4.60节)、ContinueFrt11(2.4.61节)或ContinueFrt12(2.4.62节)记录的集合来包含剩余的记录数据。
或者,如this similar SheetJS issue explains
一个单元格有一个非常长的字符串,其字节表示大约为10K字节。Excel强制执行这个8224字节规则(因此编写者必须创建"Continue"记录,并将原始字符串拆分为块),但其他工具没有。由于我们没有生成continue结构,Excel是窒息。
搜索这个特定的错误会返回这个old POI bug from 2007和一个newer one in SheetJS from 2018。在this SO question from 2013中有人建议尝试自己处理记录。坦率地说,创建一个好文件是生成该文件的人的工作,而不是你的。
xlsx中不存在这种限制。该格式是包含XML文件的ZIP包,因此无需担心固定长度的记录。应用程序不需要Excel或OLEDB驱动程序来创建或读取它们,只需要能够处理ZIP和XML包。这就是即使Office 365也不再支持xls的原因-它太昂贵,不再需要。

相关问题