我有一个500mb excel(.xlsb / .xlsm)文件。我需要一种方法来使用C#读取/写入/修改大型(.xlsb / .xlsm)文件而不将整个文件加载到内存中,而是将其加载到块中,或者至少一次加载一个页面。
答案 0 :(得分:0)
Excel文件本质上是包含XML文件的zip文件。如果您使用任何zip工具打开Excel文件,您将看到Excel文档的内容。你需要修改的是:
xl / sharedStrings.xml - excel通过在此文件中对它们进行索引来优化字符串使用(不是可视化的,但您可以将它们迭代到最后并计算 - 第一个有索引0,第二个具有索引1,依此类推......)。使用这些索引更改/添加工作表文件中的字符串,以免损坏文档。
xl / workbook.xml - 包含工作表'名。例如,你可以发现sheet1被命名为"本月'收入"在excel中。如果愿意,可以使用它来按名称查找工作表。
xl / worksheets / * .xml - 这是您的实际工作表。要更改/添加字符串,请使用共享字符串XML文件。要更改/添加数字,请直接进行。包含共享字符串值的单元格被标记为这样。
现在你只需要解析/编辑这些XML文件,同时逐行读取它们而不是将整个文件加载到内存中,你就能够以非常小的内存占用来处理大量数据。
在C#中,我使用ZipArchive临时提取我需要的文件,编辑它们然后更新zip。不要提取所有内容然后再次压缩它,因为您将损坏文件。至少我不知道如何拉链它会使它再次可用。