如何读/写/修改大型Excel XLSB / XLSM文件?(C#)
本文关键字:文件 XLSM Excel 何读 修改 大型 XLSB | 更新日期: 2023-09-27 17:56:21
我有一个500mb的excel(.xlsb/.xlsm)文件。我需要一种方法来使用 C# 读取/写入/修改大型 (.xlsb/.xlsm) 文件,而无需将整个文件加载到内存中,而是以块的形式加载它,或者至少一次加载一个工作表。
Excel文件本质上是包含XML文件的zip文件。如果您使用任何zip工具打开Excel文件,您将看到Excel文档的内容。您需要修改的是:
-
xl/sharedStrings.xml - excel 通过在此文件中索引字符串来优化字符串的使用(不是视觉上的,但您可以将它们迭代到最后并计数 - 第一个索引为 0,第二个索引为 1,依此类推......使用这些索引更改/添加工作表文件中的字符串,以免损坏文档。
-
XL/工作簿.xml - 包含工作表的名称。例如,您可以在Excel中找到工作表1被命名为"本月的收入"。如果您愿意,请使用它按名称查找工作表。
-
XL/工作表/*.xml - 这是您的实际工作表。要更改/添加字符串,请使用共享字符串 XML 文件。要更改/添加数字,请直接执行此操作。包含共享字符串值的单元格将这样标记。
现在,您只需解析/编辑这些XML文件,同时逐行读取它们,而不是将整个文件加载到内存中,您将能够以很少的内存占用处理大量数据。
在 C# 中,我使用 ZipArchive 临时提取我需要的文件,编辑它们,然后更新 zip。不要提取所有内容,然后再次压缩,因为会损坏文件。至少我不知道如何以使其再次可用的方式压缩它。
我基于 Mit 许可库的 xlsb 编写建议
C# 代码:
using Sylvan.Data.Csv;
using SpreadSheetTasks;
using var csv = CsvDataReader.Create(@"C:'test'file.csv");
csv.Read();
using (XlsbWriter xlsb = new XlsbWriter(@"C:'test'file.xlsb"))
{
xlsb.AddSheet("sheetName");
xlsb.WriteSheet(csv);
}
Dislimer - 我是 SpreadSheetTasks 的创建者链接
- https://www.nuget.org/packages/SpreadSheetTasks/