OpenXML,SDK中的错误?

时间:2014-06-17 08:01:59

标签: c# openxml openxml-sdk

编辑:

正如我在本主题中解释的那样:https://stackoverflow.com/questions/24282732/how-to-fix-a-corrupted-zip-file,我认为程序损坏了zip元数据。

你知道为什么以及如何解决它?


当我发现一个非常奇怪的错误时,我正在关注此链接:http://openxmldeveloper.org/blog/b/openxmldeveloper/archive/2011/03/28/132189.aspx

程序结束后,如果我尝试打开docx,Word会告诉我文件已损坏。实际上,docx没有被破坏。嵌入式电子表格已损坏。

导致此问题的文件是sheet1.xml。除数据更改外,程序还会更改命名空间。但文件是正确的。

如果从docx中提取电子表格,则从电子表格中提取文件sheet1.xml,最后将文件注入电子表格,将电子表格注入docx,文件不再损坏。

我只是提取了sheet1.xml,仅此而已。我不明白发生了什么......可能你们其中一人会有解释。

提前致谢!

1 个答案:

答案 0 :(得分:1)

这就是我修复它的方法。不是更好的方法,但没有任何更好的解决方案,我与你分享:

首先:打开Word文档并找到图表。找到图表后,检索链接电子表格的名称:

xlsx = chartPart.EmbeddedPackagePart.Uri.OriginalString;

然后,从Word文档中提取电子表格(我使用的是.NET 4.5 ZipArchive API):

using (var archivePPT = ZipFile.Open("Template3.docx", ZipArchiveMode.Read))
{
    var entry = archivePPT.GetEntry(xlsx.Remove(0,1));
    entry.ExtractToFile("c:\\tmp\\" + xlsx.Split('/').Last());
}

然后,我将编辑提取的电子表格数据和单词缓存数据,如博客文章中所述。

最后,我将电子表格添加回word文档:

using (var archivePPT = ZipFile.Open("Test3.docx", ZipArchiveMode.Update))
{
    archivePPT.GetEntry(xlsx.Remove(0, 1)).Delete();
    archivePPT.CreateEntryFromFile("c:\\tmp\\" + xlsx.Split('/').Last(), xlsx.Remove(0,1));
}