代码之家  ›  专栏  ›  技术社区  ›  Dimitry

OpenXMLSDK无法读取手动创建的XLSX文件:“指定的包无效。”主要部分不见了。”

  •  0
  • Dimitry  · 技术社区  · 6 年前

    我有一个第三方库,它创建XLSX文件。它不使用OpenXMLSDK,它结合了XML标记片段中的文件。用于拉链的有 ZipArchive 班级。 但当我试图处理 OpenXmlSDK

    var document = SpreadsheetDocument.Open(fileStream, false);
    

    失败,错误:

    documentFormat.openxml.packaging.openxmlpackageexception:'指定的包无效。主要部分不见了。”

    MS Excel会正常打开此文件。从Excel重新保存有助于。

    另外,我解压文件,然后再次压缩它们(不做任何更改),尝试再次调用上面的代码,它就工作了。

    问题出在哪里?如何为OpenXMLSDK压缩XLSX文件?

    解决方案

    第三方库保存文件时出现问题。包含到zip的文件的条目名 \ 相反 / . 那个库的代码被编辑来修复这个问题,一切都正常。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Lukasz M    6 年前

    经过一些研究,我发现人们在两种情况下抱怨这个例外:

    由于从流中打开文件,第二个原因在这种情况下不太适用。

    如果不是字体使用的原因,请尝试在“打开XML生产力工具”中使用Excel保存文件前后手动比较文件版本。( https://www.microsoft.com/en-us/download/details.aspx?id=30425 )

    如果文档内容没有差异,请尝试比较存档压缩设置。

    更新

    似乎我找到了更多关于这个问题的信息,可以帮助找到解决方案。

    我可以复制 主体部分丢失。 创建存档时出错: ZipFile.CreateFromDirectory(@"C:\DirToCompress", destFilePath, CompressionLevel.Fastest, false); .

    然后,我检查了打开文件的方式 Package.Open(destFilePath, FileMode.Open, FileAccess.Read) 实际上市 在文件中找到部件。

    在验证了一些差异之后,我注意到在正确的XLSX文件中,嵌套在存档文件夹中的条目 FullName 路径显示使用 / 字符,例如: _rels/.rels . 在损坏的文件中,名称是用 \ 字符,例如: _rels\.rels . 您可以使用 ZipArchive 类(例如: new ZipArchive(archiveStream, ZipArchiveMode.Read, false, UTF8Encoding.UTF8); )和检查 Entries 收集。

    需要注意的是,OfficeOpenXML规范中描述的部件有命名规则: https://www.ecma-international.org/news/TC45_current_work/Office%20Open%20XML%20Part%202%20-%20Open%20Packaging%20Conventions.pdf

    作为测试,我编写了一个代码,用 齐帕奇 类并通过复制其内容并替换来重写每个条目 \ 具有 / 用于重新创建的条目的名称。执行此操作后,结果文件似乎被正确打开 SpreadsheetDocument.Open(...) 方法。

    请注意,我使用的名称固定方法非常简单,在某些情况下可能不够或工作不正常。但是,这些注释可能有助于找到问题的理想解决方案。