如何读/写/修改大型Excel XLSB / XLSM文件?(C#)



我有一个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:testfile.csv");
csv.Read();
using (XlsbWriter xlsb = new XlsbWriter(@"C:testfile.xlsb"))
{
    xlsb.AddSheet("sheetName");
    xlsb.WriteSheet(csv);
}

Dislimer - 我是 SpreadSheetTasks 的创建者链接

  • https://www.nuget.org/packages/SpreadSheetTasks/

最新更新