尝试保存打开时没有问题的文件时,PowerPoint 发出错误

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

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 openxml-sdk
1个回答
0
投票

事实证明,用于生成 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”。

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