首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个docx处理代码不能工作/编译?

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

Stack Overflow用户
提问于 2015-09-19 09:52:11
回答 1查看 83关注 0票数 0

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

代码语言:javascript
复制
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元素:

代码语言:javascript
复制
<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元素。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-23 16:33:24

InsertBeforeSelf是泛型的,泛型类型T是插入的新元素的类型,而不是之前插入的元素的类型。这一行:

代码语言:javascript
复制
bms.InsertBeforeSelf<BookmarkStart>(new Run(new Text(key.Value)));

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

无法从“'DocumentFormat.OpenXml.Wordprocessing.BookmarkStart‘”转换为“DocumentFormat.OpenXml.Wordprocessing.Run”

修复非常简单,您需要将泛型类型定义为Run,因为这正是您实际要插入的内容:

代码语言:javascript
复制
bms.InsertBeforeSelf<Run>(new Run(new Text(key.Value)));

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

代码语言:javascript
复制
bms.InsertBeforeSelf(new Run(new Text(key.Value))); //the compiler infers that T is a Run
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32666780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档