我正在使用 .net 7.0 和 Nuget NPOI 包读取不同类型的 excel 文件在 api.net 项目中。 问题是这个包只支持最大 8224 字节的 excel 文件。 有没有办法读取更大尺寸的 excel 文件(旧式和 openXml 格式样式)? 我不能将 excel 文件用作数据集阅读器,因为 excel 文件可以存在于多个工作表中,而且工作表并不总是完全设置为表格视图。
当尝试打开一个 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”,但找不到如何使用它?。
简版
那是一个坏文件,甚至 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 个字符。 记录规格说:
如果要为给定记录数据组件写入的总字节数大于 8224,则为 Continue(第 2.4.58 节)、ContinueFrt(第 2.4.60 节)、ContinueFrt11(第 2.4.61 节)或 ContinueFrt12 的集合(第 2.4.62 节)记录,如该记录的相应 ABNF 中指定的那样,用于包含剩余的记录数据。
或者,正如this similar SheetJS issue explains
一个单元格有一个非常长的字符串,其字节表示大约为10K字节。 Excel 强制执行此 8224 字节规则(因此编写者必须创建“Continue”记录并将原始字符串拆分为块),但其他工具则不然。由于我们没有生成连续结构,Excel 令人窒息。
搜索此特定错误会返回此 2007 年的旧 POI 错误 和 SheetJS 从 2018 年开始的新错误。在 this SO question from 2013 有人建议尝试自己处理记录。坦率地说,创建一个好的文件是制作该文件的人的工作,而不是你的。
xlsx
格式不存在此限制。该格式是一个包含 XML 文件的 ZIP 包,因此无需担心固定长度的记录。应用程序不需要 Excel 或 OLEDB 驱动程序来创建或读取它们,只需要处理 ZIP 和 XML 包的能力。这就是为什么 Office 365 不再支持xls
- 它太贵了,不再需要了。