OpenXml - 查找段落中第一个Run元素的索引

时间:2017-02-27 12:04:28

标签: c# openxml

我试图在段落上使用wordprocessing InsertAt方法,但是当我使用此方法时,我的段落样式始终设置为null。我发现我使用的索引0表示ParagraphProperties,Run表示索引1.但是,当没有设置段落属性时,Paragraph唯一的子元素是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)之类的事情,但我不确定是否可以在段落中添加任何其他元素,并且Run元素最终成为中间元素

2 个答案:

答案 0 :(得分: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>

所以问题的答案实际上取决于你想要完成的事情。根据您的回答,您似乎想要在Run中已有的投放之前添加新的Paragraph

Paragraph类有一些有用的方法,如InsertBeforeInsertAfter等,fx:

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

这将使r成为段落中的第一个Run - 假设段落中已有Run

您可以尝试查看内部&#39;一些使用OpenXML Productivity Tool的单词文档。

答案 1 :(得分:0)

我已经完成了“长期”的工作。现在的方式,如果有一个更清洁的解决方案我全都听了......

asyncOne() async {
  print("asyncOne start");
  await Future.wait([1, 2, 3].map(asyncTwo));
  print("asyncOne end");
}