如何通过OpenXML SDK插入时保持当前样式?

时间:2011-03-30 07:54:42

标签: c# .net ms-office openxml-sdk

我有一个docx文档,我想通过OpenXML SDK修改。该文档的表格中包含书签。这些单元格有特定的字体设置,比方说它是Times New Roman,14pt。当我尝试插入一些这样的文字时:

    public void ReplaceBookmark(string bookMarkName, string text)
    {
        var bookmarkStart =
            _document.MainDocumentPart.RootElement.Descendants<BookmarkStart>()
        .Where(p => p.Name == bookMarkName)
        .FirstOrDefault();
        if (bookmarkStart == null)
            return;

        bookmarkStart.InsertAfterSelf(new Run(new Text(text)));            
    }

插入文本,但其样式设置为Calibri,11pt(默认样式)。如何插入文本以保留字体设置?重要的是我不应在代码中定义任何样式设置,而是使用原始文档的样式设置。

感谢。

1 个答案:

答案 0 :(得分:1)

我对docx文件格式进行了一些调查。显然我不能专门谈论你正在使用的文件......但我认为你可能对我发现的文件感兴趣。

如果您创建docx文件的副本并为其指定.zip扩展名,则可以提取文档的内容。在我的情况下,也可能在你的情况下,文档的主要部分在提取的文件[Extraction Base Path]\word\document.xml中。

以下XML代码段似乎适用于表格中的第一个单元格(对于我创建的文档):

<w:tc>
    <w:tcPr>
        <w:tcW w:w="3192" w:type="dxa"/>
    </w:tcPr>
    <w:p w:rsidR="006C4430" w:rsidRPr="006C4430" w:rsidRDefault="006C4430">
        <w:pPr>
            <w:rPr>
                <w:rFonts w:ascii="Ariel" w:hAnsi="Ariel"/>
                <w:sz w:val="28"/>
                <w:szCs w:val="28"/>
            </w:rPr>
        </w:pPr>
        <w:bookmarkStart w:id="0" w:name="First"/>
        <w:bookmarkEnd w:id="0"/>
        <w:r w:rsidRPr="006C4430">
            <w:rPr>
                <w:rFonts w:ascii="Bauhaus 93" w:hAnsi="Bauhaus 93"/>
                <w:sz w:val="28"/>
                <w:szCs w:val="28"/>
            </w:rPr>
            <w:t>Here is some text</w:t>
        </w:r>
    </w:p>
</w:tc>

如您所见,w:bookmarkStartw:bookmarkEnd标记出现在表格的实际内容之外(它似乎是书签后面的w:r标记)。即使我在创建书签之前选择了整个单元格内容,也会发生这种情况。因此,我怀疑对bookmarkStart.InsertAfterSelf的任何调用都将使用默认字体设置,而不是与表格单元格关联的任何设置。它看起来好像你需要在书签后立即导航到运行,然后在那里插入文本,或者将设置(可能是w:rPr标签的内容)从下一次运行复制到新的运行你创建的。

希望这会指出你的方向。祝你好运!