1

我目前的目标有点复杂,但我会尽力解释它。我们有一个软件在过去几个月一直在生成所有使用的 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++),所以它相当混乱。我花了几天时间寻找指南和参考资料,但这些都非常分散,我似乎找不到我要找的东西。

4

1 回答 1

2

工具包的三种技术:

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

  2. 替代块。有了这个,你可以在你的 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 格式的要求)。

于 2012-06-12T23:12:35.480 回答