OpenXmlSDK无法读取manualy创建XLSX文件:“指定的包是无效的。主要的部分缺失。”

问题描述 投票:0回答:1

我有一个第三方库,它创建XLSX文件。它不使用OpenXmlSDK,它从XML的标记的片段结合文件。对于荏苒有使用ZipArchive类。但是,当我尝试OpenXmlSDK

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

它失败,错误:

DocumentFormat.OpenXml.Packaging.OpenXmlPackageException:“指定的包是无效的。主要的部分缺失。”

MS Excel中打开,通常这个文件。从Excel重新保存帮助。

此外,我再解压缩文件,然后再压缩它们(没有任何变化),尝试上面的代码中调用和它的作品。

问题出在哪儿?如何邮政编码为OpenXmlSDK XLSX文件准备好了吗?

问题是由第三方库保存文件。文件,包括以拉链有\条目名称,而不是/。该库的代码编辑为解决这个问题,一切都OK。

c# openxml-sdk
1个回答
1
投票

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

因为你从流中打开该文件,第二个原因是,而不是适用于这种情况。

如果字体的使用不是原因,尝试前,利用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(...)方法正确打开。

请注意,我使用的名称固定方法很简单,可能是不够或在某些情况下正常工作。然而,这些笔记可以帮助找到问题所需的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.