我有一个第三方库,它创建XLSX文件。它不使用OpenXmlSDK,它从XML的标记的片段结合文件。对于荏苒有使用ZipArchive类。但是,当我尝试OpenXmlSDK做
var document = SpreadsheetDocument.Open(fileStream, false);
它失败,错误:
DocumentFormat.OpenXml.Packaging.OpenXmlPackageException:“指定的包是无效的。主要的部分缺失。”
MS Excel中打开,通常这个文件。从Excel重新保存帮助。
此外,我再解压缩文件,然后再压缩它们(没有任何变化),尝试上面的代码中调用和它的作品。
问题出在哪儿?如何邮政编码为OpenXmlSDK XLSX文件准备好了吗?
解
问题是由第三方库保存文件。文件,包括以拉链有\
条目名称,而不是/
。该库的代码编辑为解决这个问题,一切都OK。
经过一番研究,我发现有人抱怨这个例外,在两种情况下:
因为你从流中打开该文件,第二个原因是,而不是适用于这种情况。
如果字体的使用不是原因,尝试前,利用Excel进行开放式XML生产力工具(https://www.microsoft.com/en-us/download/details.aspx?id=30425)保存后手动比较文件版本。
如果在文档内容没有差异,尝试比较档案压缩设置。
UPDATE
看来我发现关于这个问题,可以帮助找到解决方案的更多信息。
我能够重现的主要部分缺失。 ZipFile.CreateFromDirectory(@"C:\DirToCompress", destFilePath, CompressionLevel.Fastest, false);
:通过创建归档错误。
然后,我检查在打开文件与实际Package.Open(destFilePath, FileMode.Open, FileAccess.Read)
列出的文件中找到0件。
验证一些不同之处后,我注意到,在正确的XLSX文件,嵌套在存档文件夹内的条目必须使用FullName
字符,例如/
路径提出:_rels/.rels
。在损坏的文件,名字用\
字符写,例如:_rels\.rels
。和检查ZipArchive
收集:您可以通过使用new ZipArchive(archiveStream, ZipArchiveMode.Read, false, UTF8Encoding.UTF8);
类(Entries
例如)打开文件进行调查。
需要注意的重要一点是,有命名的的Office Open XML规范描述的部分规则:https://www.ecma-international.org/news/TC45_current_work/Office%20Open%20XML%20Part%202%20-%20Open%20Packaging%20Conventions.pdf
作为测试,我写了使用ZipArchive
类打开损坏的xlsx档案改写通过复制其内容,并与\
更换/
为重建项目的每个项目名称代码。此操作后,生成的文件似乎是SpreadsheetDocument.Open(...)
方法正确打开。
请注意,我使用的名称固定方法很简单,可能是不够或在某些情况下正常工作。然而,这些笔记可以帮助找到问题所需的解决方案。