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

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

我有一个要通过 OpenXML SDK 修改的 docx 文档。该文档的单元格中有一个带有书签的表格。单元格有特定的字体设置,比方说它是 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(默认样式)。如何插入文本以保留字体设置?重要的是我不应该在代码中定义任何样式设置,而是使用原始文档中的样式设置。

谢谢。

最佳答案

我对 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 标 checkout 现在表格的实际内容之外(看起来是紧跟在书签)。即使我在创建书签之前选择了整个单元格内容,也会发生这种情况。因此,我怀疑对 bookmarkStart.InsertAfterSelf 进行的任何调用都会如您所见,使用默认字体设置,而不是与表格单元格关联的任何设置。在我看来,您似乎需要在书签后立即导航到运行,并在那里插入您的文本,或者从接下来运行到您创建的新运行。

希望这会为您指明正确的方向。祝你好运!

关于c# - 通过 OpenXML SDK 插入时如何保持当前样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5483480/

相关文章:

c# - 使用区域和 Controller 名称进行路由(asp.net core)

asp.net - App_Code 以 32 位模式编译并放置在 Framework64 temp 中

c# - 将 DesignerSerializationVisibility 的默认值设置为隐藏

c# - 防止用户附加到 MS-Office 进程的开发人员运行实例

.net - 轻松创建/更新 Office Open XML 图表(首选 PowerPoint)

c# - 解析邮件地址的正则表达式

c# - 简单讽刺解析器无法识别特定匹配项的超过 1 个实例

c# - 下载文件的线程 C#

c# - 在 DCOM 配置中找不到 Microsoft Word 文档

c# - 是否可以在没有配置或 svc 文件的情况下使用 caSTLe windsor fluent 配置来配置 WCF 服务?