我有一个Microsoft Word文档(docx),我使用Open XML SDK 2.0 Productivity Tool从中生成C#代码。
我想以编程方式将一些数据库值插入到文档中。 为此我输入了简单的文本,如 [[place holder 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中识别?
答案 0 :(得分:14)
我找到了一个解决方案:Open XML PowerTools Markup Simplifier。
我按照http://ericwhite.com/blog/2011/03/09/getting-started-with-open-xml-powertools-markup-simplifier/中描述的步骤进行操作,但它不能以1:1的方式工作(也许是因为它现在是Power Tools的2.2版本?)。所以,我在“Release”模式下编译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);
}
}
}
答案 1 :(得分:1)
我不知道清理XML的方法,但我总是使用#placeholder
作为我的占位符文本,这似乎比我尝试过的任何其他占位符文本保持一次运行。过去。看似占位符文本越长,分割成多次运行的可能性就越大。
答案 2 :(得分:1)
您需要摆脱Rsid信息。根据这个page Rsid信息
启用合并两个已分叉的文档。
您需要安装才能运行下面的示例代码。最简单的方法是在程序包管理器控制台中运行以下命令
Install-Package OpenXmlPowerTools
然后您将全部设置为运行以下代码。 (假设您已经在文档中添加了&#34; Test.docx&#34;文件。如果您使用的是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信息。
答案 3 :(得分:0)
对于那些寻找手动非程序化解决方案的人:
http://www.translationtribulations.com/2010/06/cleaning-up-superfluous-tags-in-docx.html
我已经测试过memoQ 2014的免费试用版确实可以用作清理Word拼写代码的大型解决方法。
仍然在寻找一种更容易开箱即用的工具。