PowerPoint 打开演示文稿没有问题,但在尝试保存时出现错误,然后保存文件没有问题,即文件在保存后工作正常。
我寻求的解决方案是如何修改演示文稿的XML文件(我假设是chart1.xml),以便PowerPoint在尝试保存文件时不会发出错误。
我浏览过此论坛和其他网站是否有类似问题,但没有一个有效的解决方案。
我们不能使用 Office 来修复文件,因为它需要我们手动打开数千个文件。我们不能使用 Visual Studio 工具进行办公,因为它运行时间太长。我们也许可以使用 OpenXML SDK,因为它不需要 Office 并且运行速度很快。我们可以通过运行解压缩文件的脚本、修改每个文件的 xml,然后再次压缩它们来自动修复此类文件的错误。
这里是包含 PowerPoint 文件 test.pptx 的文件夹的链接 - 该文件包含一个包含四行的单线图表:
https://drive.google.com/drive/folders/1d8-NNkmOJ_Nww4pTCZAoMkKhiyyy87cg?usp=drive_link
以下是 PowerPoint 在尝试保存文件时显示的错误对话框图像的链接:
https://imgur.com/a/lz0LvRr
为了方便起见,我重复 PowerPoint 显示的错误消息:
PowerPoint couldn't read some content in test.pptx and removed it.
Please check your presentation to see if the rest of it looks ok.
PowerPoint 的问题似乎在于为每个系列定义标识符的扩展列表。在这里您可以看到演示文稿图表的前两个扩展列表(chart1.xml):
<c:ser>
...
<c:extLst>
<c:ext xmlns:c16="http://schemas.microsoft.com/office/drawing/2014/chart"
uri="{C3380CC4-5D6E-409C-BE32-E72D297353CC}">
<c16:uniqueID val="{00000000-2153-43F5-A17B-C2679033F518}" />
</c:ext>
</c:extLst>
</c:ser>
<c:ser>
...
<c:extLst>
<c:ext xmlns:c16="http://schemas.microsoft.com/office/drawing/2014/chart"
uri="{C3380CC4-5D6E-409C-BE32-E72D297353CC}">
<c16:uniqueID val="{00000001-2153-43F5-A17B-C2679033F518}" />
</c:ext>
</c:extLst>
</c:ser>
如果我删除扩展名列表,则 PowerPoint 将打开该文件(再次像以前一样没有问题),并且现在还可以毫无问题地保存文件,即不显示错误消息。
如果我不删除扩展名列表,那么 PowerPoint 就会出现上述问题,当我单击“确定”让 PowerPoint 保存文件时,它基本上会用相同的扩展名列表替换扩展名列表,只是 uniqueID 的值不同已经改变了。
不幸的是,我需要每个系列的标识符,因此无法删除它们。
应该如何修改演示文稿中的 xml,以便 PowerPoint 不会发出错误?
在具有不同版本 Windows(10 和 11)的多台 PC 上,问题是相同的,但当前都在使用:
Microsoft® PowerPoint® for Microsoft 365 MSO (Version 2405 Build 16.0.17628.20006) 64-bit
事实证明,用于生成 PowerPoint 文件的
OpenXML SDK 3.0.1
库为 c16:uniqueID
创建了错误的大小写。应该是c16:uniqueId
。所以这是 SDK 中的一个错误。
问题有两种解决方案,具体取决于我们在链条中的位置。
如果我们是 PowerPoint 文件的接收者,则将 xml 文件中所有出现的
c16:uniqueID
替换为 c16:uniqueId
。
如果我们是 PowerPoint 文件的制作者(使用
OpenXML SDK
),则更改将唯一标识符附加到扩展名的代码:
var uniqueId = new C16.UniqueID() { Val = $"{{{seriesGuid}}}" };
ext.Append(uniqueId);
到
ext.InnerXml = $"<c16:uniqueId xmlns:c16=\"http://schemas.microsoft.com/office/drawing/2014/chart\" val=\"{{{seriesGuid}}}\" />";
其中
seriesGuid
是系列的标识符,例如“00000000-2153-43F5-A17B-C2679033F518”。