为什么这个docx处理代码不能工作/编译

本文关键字:不能 工作 编译 代码 处理 docx 为什么 | 更新日期: 2023-09-27 18:13:22

我有这个代码,它处理一个Word docx文件:

void bookmarkReplace(BookmarkStart bms, Dictionary<string, string> values )
{
    foreach( var key in values)
    {
        string bookmarkName = bms.Name;
        if (bms.Name.Equals( key.Key))
        {
            bms.InsertBeforeSelf<BookmarkStart>(new Run(new Text(key.Value)));
            bms.Remove();
            break;
        }
    }
}

,它甚至不编译。InsertBeforeSelf给出一个错误:"有一些无效的参数",因为在BookmarkStart之前,您不能插入BookmarkStart以外的其他类型。奇怪。为什么会这样?我的Word docx文件显示<w:pRr>元素在BookmarkStart元素之前:

<w:p w14:paraId="49842CE1" w14:textId="1248047E" w:rsidR="000C7F1A" w:rsidRDefault="000C7F1A" w:rsidP="00BB4EA3">
    <w:pPr>
       <w:spacing w:after="0" w:line="240" w:lineRule="auto"/>
       <w:jc w:val="right"/>
       <w:rPr>
          <w:lang w:val="en-US"/>
       </w:rPr>
    </w:pPr>
    <w:bookmarkStart w:id="17" w:name="FlexLV"/>
    <w:bookmarkEnd w:id="17"/>
</w:p>

关于如何解决用文本run代替BookmarkStart的问题,有什么建议吗?顺便说一句:在程序的后面,我删除了所有的BookmarkStartBookmarkEnd元素。

为什么这个docx处理代码不能工作/编译

InsertBeforeSelf是泛型类型,泛型类型T是您要插入的新元素的类型,不是您之前插入它的元素的类型。这条线:

bms.InsertBeforeSelf<BookmarkStart>(new Run(new Text(key.Value)));

表示您想要在bms之前插入BookmarkStart,而您希望插入的BookmarkStartnew Run。显然,Run不是BookmarkStart,所以你会得到一个编译错误:

无法从"DocumentFormat.OpenXml.Wordprocessing"转换。运行' to 'DocumentFormat.OpenXml.Wordprocessing.BookmarkStart'

修复很简单,您需要将泛型类型定义为Run,因为这就是您实际插入的:

bms.InsertBeforeSelf<Run>(new Run(new Text(key.Value)));

更简单的是,您可以完全放弃类型,让编译器从形参中推断类型:

bms.InsertBeforeSelf(new Run(new Text(key.Value))); //the compiler infers that T is a Run