【问题标题】:Modify a Docx with links using an XML使用 XML 修改带有链接的 Docx
【发布时间】:2012-06-12 15:14:05
【问题描述】:

我目前的目标有点复杂,但我会尽力解释它。我们有一个软件在过去几个月一直在生成所有使用的 XML 日志。其他人已经从这些数据中解析出他们认为需要的文档并将其全部放入可读的 HTML 格式中。

我的工作是找到一种方法,将他们生成的可读 HTML 文件与预先存在的 Word (.docx) 文档链接起来。我目前有一个 NAnt 脚本,它读取包含日志的目录并创建一个 XML 文档,格式如下:

<root> 
    <HTML address=...>
        <ProductName name=...>
            <FunctionName name=...>
            </FunctionName>
        </ProductName>
    </HTML>
</root>

word 文档本身包含保存函数名称的表。这些表格位于包含产品名称的标题下方。我需要在表内的函数名周围加上与函数关联的地址的链接,以便阅读文档的人可以轻松单击函数名并查看函数的文档。

我没有在程序上修改 word 文档的经验,所以我真的很想得到这方面的帮助,因为这似乎是一个相当复杂的过程。如果可以以任何方式简化流程,我可以轻松地重新排序 XML 节点。

到目前为止我研究过的东西:

  • 在研究 docx 的格式之前,我想编写另一个脚本来简单地搜索相关数据,然后将超链接标签包裹在它周围。不幸的是,一旦我查看了 docx,格式似乎比这要复杂得多。

  • 在那之后,我决定通过 Visual Studio 2010 来研究使用 C#。不幸的是,由于我没有使用 C# 的经验(我只使用过 C 和 C++),所以它相当混乱。我花了几天时间寻找指南和参考资料,但都非常分散,我似乎找不到我要找的东西。

【问题讨论】:

    标签: xml hyperlink ms-word nant docx


    【解决方案1】:

    工具包的三种技巧:

    1. 自定义 XML 数据绑定。有了这个,您可以将 XML 文档注入您的 docx,并自动显示数据(通过 XPath 链接)。虽然不在超链接内,所以这可能不适合您。虽然您可以在 Word 中首次打开 docx 时运行 AutoOpen 宏,以将文本转换为超链接。

    2. AltChunk。有了这个,你可以在你的 docx 中包含 HTML。不过,您需要修改 docx。 (见下文 3)

    3. 平面 OPC XML。这是将 docx 表示为单个 XML 文件,Word 2007 或更高版本可以愉快地读取或写入。使用它,您可以使用您选择的工具对超链接的内容进行字符串替换。如果需要,您还可以使用这种表示形式轻松地将内容注入 AltChunks。

    替换超链接的小挑战是您必须在两个地方进行。首先,在文档本身 (document.xml) 中向用户显示的链接文本,其次是目标 URL(在关系部分中)。这些通过 relId 绑定在一起。

    如果你使用 AltChunk,你可以在一个地方替换。不确定您的文档有多长,以及如果您有数百个 AltChunk(即使它们基本上只包含一个超链接),您是否会遇到性能问题。

    这是一个包含 HTML AltChunk 的 Flat OPC XML 文件的示例(您应该能够将其保存并拖动到 Word 或执行 File > Open):

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <pkg:package xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage">
        <pkg:part pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:name="/_rels/.rels">
            <pkg:xmlData>
                <rel:Relationships xmlns:rel="http://schemas.openxmlformats.org/package/2006/relationships">
                    <rel:Relationship Id="rId1" Target="word/document.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"/>
                </rel:Relationships>
            </pkg:xmlData>
        </pkg:part>
        <pkg:part pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml" pkg:name="/word/document.xml">
            <pkg:xmlData>
                <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" >
                    <w:body>
                        <w:altChunk r:id="rId2"/>
                        <w:sectPr>
                            <w:pgSz w:code="1" w:h="15840" w:w="12240"/>
                            <w:pgMar w:bottom="1440" w:left="1440" w:right="1440" w:top="1440"/>
                        </w:sectPr>
                    </w:body>
                </w:document>
            </pkg:xmlData>
        </pkg:part>
        <pkg:part pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:name="/word/_rels/document.xml.rels">
            <pkg:xmlData>
                <rel:Relationships xmlns:rel="http://schemas.openxmlformats.org/package/2006/relationships">
                    <rel:Relationship Id="rId2" Target="../chunk.html" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/aFChunk"/>
                </rel:Relationships>
            </pkg:xmlData>
        </pkg:part>
        <pkg:part pkg:compression="store" pkg:contentType="text/html" pkg:name="/chunk.html">
            <pkg:binaryData>PGh0bWw+PGJvZHk+PHA+PGEgaHJlZj0iaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tIj5TdGFja092ZXJmbG93PC9hPjwvcD48L2JvZHk+PC9odG1sPg==</pkg:binaryData>
        </pkg:part>
        <pkg:part pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:name="/_rels/chunk.html.rels">
            <pkg:xmlData>
                <rel:Relationships xmlns:rel="http://schemas.openxmlformats.org/package/2006/relationships"/>
            </pkg:xmlData>
        </pkg:part>
    </pkg:package>
    

    二进制数据是

    "<html><body><p><a href="http://stackoverflow.com">StackOverflow</a></p></body></html>" 
    

    base64 编码(根据 Flat OPC XML 格式的要求)。

    【讨论】:

    • 我最大的问题之一是我什至不知道从哪里开始。 AltChunk 看起来会很好,只是我不知道如何首先找到要修改的数据。我目前正在研究 C# 中的 Word 互操作,希望它可以提供一些答案,但到目前为止我还没有运气。您可以在 Word 文档内容的实际导航方面提供任何帮助吗?
    • 查看我添加到答案中的工作示例。请注意 altChunk 标记是插入由 'rId2' 指示的 HTML 的位置。在这种方法中,每个 altChunk 都会提供 1 个超链接。您所要做的就是对其进行 base64 编码。
    • 哇哦。这是一个巨大的帮助。不过,我必须将其作为独立文件打开才能真正看到链接。我将如何将它插入到现有文档中?
    • 更新:我想我找到了。将文件作为对象插入似乎可行。非常感谢,示例代码是一个巨大的帮助。
    • 我想到你会以独立文件的形式打开它。我的建议是您将预先存在的 docx 保存为 Flat OPC XML,然后根据需要将 altChunk 元素添加到表格单元格中。或者 - 第四种方法 - 您可以将预先存在的 docx 保存为 HTML,然后插入普通的 HTML 超链接。 Word 能够重新打开自己的 HTML 而不会丢失格式。
    猜你喜欢
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    相关资源
    最近更新 更多