为什么这个docx处理代码无法工作/编译?

时间:2015-09-19 09:52:12

标签: c# ms-word openxml

我有这个代码,它处理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会出错:&#34;有一些无效的参数&#34;,因为在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>

有关如何解决使用文字BookmarkStart替换run的问题的任何建议? 顺便说一下:在程序的后面部分,我删除了所有BookmarkStartBookmarkEnd元素。

1 个答案:

答案 0 :(得分:1)

InsertBeforeSelf是通用的,通用类型T是您要插入的新元素的类型,不是的类型您之前插入的元素。这一行:

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

表示您要在BookmarkStart之前插入bms,而您希望插入的BookmarkStartnew Run。显然,Run不是BookmarkStart,因此您收到编译错误:

  

无法转换为&#39; DocumentFormat.OpenXml.Wordprocessing.Run&#39; to&#39; DocumentFormat.OpenXml.Wordprocessing.BookmarkStart&#39;

修复很简单,您需要将通用类型定义为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