简化/清理DOCX Word文档的XML

26

我有一个Microsoft Word文档(docx),我使用Open XML SDK 2.0 Productivity Tool从中生成C#代码。

我想要通过编程将一些数据库值插入到文档中。为此,我在程序应该替换占位符的位置输入了简单的文本,例如[[place holder 1]]

不幸的是,XML输出混乱不堪。例如,我有一个带有两个相邻单元格的表格,它们除了占位符外不应该有区别。但其中一个占位符被分成了几个运行。

[[good place holder]]

<w:tc xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:tcPr>
    <w:tcW w:w="1798" w:type="dxa" />
    <w:shd w:val="clear" w:color="auto" w:fill="auto" />
  </w:tcPr>
  <w:p w:rsidRPr="008C2E16" w:rsidR="001F54BF" w:rsidP="000D7B67" w:rsidRDefault="0009453E">
    <w:pPr>
      <w:spacing w:after="0" w:line="240" w:lineRule="auto" />
      <w:rPr>
        <w:rFonts w:cstheme="minorHAnsi" />
        <w:sz w:val="20" />
        <w:szCs w:val="20" />
      </w:rPr>
    </w:pPr>
    <w:r w:rsidRPr="0009453E">
      <w:rPr>
        <w:rFonts w:cstheme="minorHAnsi" />
        <w:sz w:val="20" />
        <w:szCs w:val="20" />
      </w:rPr>
      <w:t>[[good place holder]]</w:t>
    </w:r>
  </w:p>
</w:tc>

对比 [[坏的占位符]]
<w:tc xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:tcPr>
    <w:tcW w:w="1799" w:type="dxa" />
    <w:shd w:val="clear" w:color="auto" w:fill="auto" />
  </w:tcPr>
  <w:p w:rsidRPr="008C2E16" w:rsidR="001F54BF" w:rsidP="000D7B67" w:rsidRDefault="00EA211A">
    <w:pPr>
      <w:spacing w:after="0" w:line="240" w:lineRule="auto" />
      <w:rPr>
        <w:rFonts w:cstheme="minorHAnsi" />
        <w:sz w:val="20" />
        <w:szCs w:val="20" />
      </w:rPr>
    </w:pPr>
    <w:r w:rsidRPr="00EA211A">
      <w:rPr>
        <w:rFonts w:cstheme="minorHAnsi" />
        <w:sz w:val="20" />
        <w:szCs w:val="20" />
      </w:rPr>
      <w:t>[[</w:t>
    </w:r>
    <w:proofErr w:type="spellStart" />
    <w:r w:rsidRPr="00EA211A">
      <w:rPr>
        <w:rFonts w:cstheme="minorHAnsi" />
        <w:sz w:val="20" />
        <w:szCs w:val="20" />
      </w:rPr>
      <w:t>bad</w:t>
    </w:r>
    <w:proofErr w:type="spellEnd" />
    <w:r w:rsidRPr="00EA211A">
      <w:rPr>
        <w:rFonts w:cstheme="minorHAnsi" />
        <w:sz w:val="20" />
        <w:szCs w:val="20" />
      </w:rPr>
      <w:t xml:space="preserve"> place holder]]</w:t>
    </w:r>
  </w:p>
</w:tc>

有没有可能让微软Word清理我的文档,使得所有占位符在生成的XML中易于识别?


1
看起来你的内容被“拼写错误”标记切断了...我很好奇为什么单词“bad”被识别为拼写问题(也许文档没有设置为英语?),但是不管那个;正如amurra指定的那样,你需要想出一个占位符,它不会出现在目标文本中,但也不被认为是多个单词。 - Tao
4个回答

24
我找到了一个解决方案:Open XML PowerTools Markup Simplifier。 我按照这里描述的步骤进行操作,但它没有一对一地工作(可能是因为现在是Power Tools的2.2版本?)。因此,我以“发布”模式编译了PowerTools 2.2,并在我的TestMarkupSimplifier.csproj中引用了OpenXmlPowerTools.dll。在Program.cs中,我只更改了我的DOCX文件的路径。 我运行了程序一次,现在我的文档似乎相当干净了。 引自Eric博客链接中的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenXmlPowerTools;
using DocumentFormat.OpenXml.Packaging;

class Program
{
    static void Main(string[] args)
    {
        using (WordprocessingDocument doc = WordprocessingDocument.Open("Test.docx", true))
        {
            SimplifyMarkupSettings settings = new SimplifyMarkupSettings
            {
                RemoveComments = true,
                RemoveContentControls = true,
                RemoveEndAndFootNotes = true,
                RemoveFieldCodes = false,
                RemoveLastRenderedPageBreak = true,
                RemovePermissions = true,
                RemoveProof = true,
                RemoveRsidInfo = true,
                RemoveSmartTags = true,
                RemoveSoftHyphens = true,
                ReplaceTabsWithSpaces = true,
            };
            MarkupSimplifier.SimplifyMarkup(doc, settings);
        }
    }
}

2
您需要摆脱Rsid信息。根据这个页面 Rsid信息

使合并两个已分叉的文档成为可能。

您需要安装才能运行下面的示例代码。最简单的方法是在程序包管理器控制台中运行以下命令。
Install-Package OpenXmlPowerTools

那么,您就可以运行以下代码了。(假设您已经将一个名为“Test.docx”的文件添加到您的文档中。如果您正在使用Visual Studio,则需要确保您在Debug或Release文件夹中有该文件的副本,具体取决于您的构建模式。)
//Sample code to remove Rsid information from a "Test.docx" document

 using (WordprocessingDocument doc = WordprocessingDocument.Open("Test.docx", true))
        {
            SimplifyMarkupSettings settings = new SimplifyMarkupSettings
            {  
                RemoveRsidInfo = true 
            };
            MarkupSimplifier.SimplifyMarkup(doc, settings);
        }

这将删除可能干扰处理Word文件的Rsid信息。

1

我不知道有什么方法可以清理XML,但我一直使用#placeholder作为我的占位符文本,这似乎比我过去尝试过的任何其他占位符文本都更容易保持在一个运行中。似乎占位符文本越长,就越有可能被分成多个运行。


那对我没用。它只是撤销了我手动修改的内容... 不管怎样,还是谢谢。 - K B

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接