2017-02-27 94 views
0

我試圖在段落上使用字處理InsertAt方法,但是當我使用此方法時,我的段落樣式始終設置爲null。我發現我使用的索引是0,是ParagraphProperties,Run是索引1.但是,當沒有設置段落屬性時,唯一的子元素段落是運行OpenXml - 在段落中查找第一個Run元素的索引

是否存在一致的查找方式指數運行在?或者它會一直在0或1?

代碼片段上下文

var run = new W.Run() { RunProperties = new W.RunProperties() { NoProof = new W.NoProof() } }; 
run.AppendChild(dr); 

para.InsertAt(run, 0); 

顯然,我可以做一些像Math.Min(1, para.Count - 1),但我不能確定是否有任何其他的元素可以被添加到該段和運行要素最終被中間元素

回答

1

段落可以包含多個運行。例如:

<w:p xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> 
    <w:r> 
    <w:t>Some text</w:t> 
    </w:r> 
    <w:r> 
    <w:rPr> 
     <w:noProof /> 
    </w:rPr> 
    <w:t>Other text</w:t> 
    </w:r> 
    <w:r> 
    <w:t>Last text in paragraph</w:t> 
    </w:r> 
</w:p> 

所以你的問題的答案真的取決於你想要完成什麼。根據你的回答,看起來你想在Paragraph已經運行之前添加一個新的Run

Paragraph類有一些方法是有用的喜歡InsertBeforeInsertAfter等,FX:

Paragraph p = ... 
Run r = new Run(...); 
p.InsertBefore(r, p.GetFirstChild<Run>()); 

這將使中的R段落中第一個Run - 假設已經存在的段落Run

您可以嘗試使用OpenXML Productivity Tool'查看'一些示例文檔。

+0

是的,我意識到可能有多個運行,我正在尋找第一個...更新問題標題,以反映:) 那麼'para.InsertAt(run,indexOfFirstRun)'和'para .InsertBefore(run,para.GetFirstChild ())'? InsertAt方法似乎在索引提供之前插入(或者將其他所有內容向下移動,並將其插入到該索引處) – p3tch

+0

我仍然不確定爲什麼在ParagraphProperties索引處的InsertAt空值屬性,但工作正常你插入一個運行的索引 – p3tch

0

我已經做到了「長」的方式,現在,如果有一個清潔的解決方案我所有的耳朵...

 int index = 0; 
     for (int i = 0; i < para.Count(); i++) 
     { 
      if (para.ElementAt(i) is W.Run) 
      { 
       index = i; 
       break; 
      } 
     } 
     para.InsertAt(run, index);