简化/清理DOCX word文档的XML

本文关键字:文档 XML word DOCX 清理 简化 | 更新日期: 2023-09-27 18:11:13

我有一个Microsoft Word文档(docx),我使用Open XML SDK 2.0生产力工具从中生成c#代码。

我想以编程方式向文档插入一些数据库值。为此,我在程序应该用数据库值替换占位符的地方输入了简单的文本,如[[placeholder 1]]

不幸的是,XML输出有些混乱。例:我有一个有两个相邻单元格的表,它们不应该与其占位符区分开来。但其中一个占位符是分裂的分成几组

[[好占位符]]

<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>

是否有可能让Microsoft Word清理我的文档,以便在生成的XML中识别所有占位符?

简化/清理DOCX word文档的XML

我找到了一个解决方案:Open XML PowerTools Markup Simplifier。

我按照http://ericwhite.com/blog/2011/03/09/getting-started-with-open-xml-powertools-markup-simplifier/上描述的步骤操作,但它不能1:1工作(可能是因为它现在是2.2版本的Power Tools?)因此,我在"发布"中编译了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);
        }
    }
}

您需要去掉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信息。

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

对于那些寻找手动非编程解决方案的人:

http://www.translationtribulations.com/2010/06/cleaning-up-superfluous-tags-in-docx.html

我已经测试过,memoQ 2014的免费试用版确实可以用作清理Word拼写标签的庞大解决方案。

还在寻找一个更简单的现成的工具