OpenXmlPowerTools 中出现“文档修订跟踪已打开”错误

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

我正在尝试使用 OpenXmlPowerTools 替换 Word 文档中的文本。原始文件托管在 OneDrive 中,然后将副本下载到本地计算机。我正在本地副本上运行 OpenXmlPowerTools.WmlDocument 的 SearchAndReplace 函数。

我收到一个异常,“文档的修订跟踪已打开”。我已经在 Office365 的基于网络的文字编辑器中加载了原始文档。在审阅选项卡上,跟踪更改显示为“关闭”。如果我点击旁边的下一个更改或上一个更改按钮;我收到错误“您的文档中没有任何跟踪的更改。”

我不想进行修订跟踪。我只想将文本 [CaseNo] 替换为数字,然后保存文档。我怎样才能摆脱修订跟踪,或者让 OpenXmlPowerTools 忽略它并永久进行更改?

我的代码相当简单:

OpenXmlPowerTools.WmlDocument doc = new OpenXmlPowerTools.WmlDocument(FileName);

foreach (MergeCode mc in mergeCodes)
    doc = doc.SearchAndReplace(mc.Code, mc.Value, true);
ms-word openxml openxml-powertools
1个回答
0
投票

据我所知,微软已经更改了他们在在线编辑器中保存的 XML,并且它破坏了 OpenXmlPowerTools。

在 Open-Xml-PowerTools/OpenXmlPowerTools/TextReplacer.cs 第 230 行(Word 文档的 SearchAndReplace 函数)中,它检查文档是否具有 trackRevisions 标签,如果有则抛出错误。当我在 Office365 基于浏览器的编辑器中创建新文档并将修订版本设置为“关闭”时,此标签会显示在文档中:

<w:trackRevisions w:val="false" xmlns:w=http://schemas.openxmlformats.org/wordprocessingml/2006/main />

这会错误地导致 Open Xml PowerTools 认为它无法编辑文档,即使 trackRevisions 为 false。

我用以下行制作了我自己的 TextReplacer 版本:

if (xDoc.Descendants(W.trackRevisions).Any())

替换为这个:

if (xDoc.Descendants(W.trackRevisions).Any(x => !x.Attributes().Any(x => x.Name.LocalName == "val" && x.Value == "false")))

还在同一文件的第 152 行检查 textValue[0],但我新制作的文档有一个包含以下内容的元素:

<r xmlns=http://schemas.openxmlformats.org/wordprocessingml/2006/main>
  <rPr />
  <t></t>
</r>

这会导致索引超出范围异常,因为索引 0 处没有字符。将 if 语句更改为以下内容似乎可以解决此问题:

if (textValue.Length != 0 && (textValue[0] == ' ' || textValue[textValue.Length - 1] == ' '))

我已经向 openxmldeveloper.org 的团队发送了电子邮件,希望他们能够测试我的补丁并尽快发布新版本。

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