2017-08-09 82 views
1

我正在使用openxml,并且有一些东西将我的头发拉起来,基本上我正在编辑现有文档,它是一个模板,模板应该保留第一页和第二页,所以每一个部分我加(段落,表格等)应该在2页之间增加,我已经做到这一点,我可以插入一个简单的表格这样将列表传递给列表<T>

 DocTable docTable = new DocTable(); 
     Paragraph paragraph = doc.MainDocumentPart.Document.Body.Descendants<Paragraph>() 
     .Where<Paragraph>(p => p.InnerText.Equals("some Text")).First(); 
     Table table = docTable.createTable(Convert.ToInt16(2), Convert.ToInt16(2)); 


     mainPart.Document.Body.InsertAfter(table, paragraph); 

我basicly搜索在第1页的末尾添加段落,然后插入表格。我的问题是:我没有从frontEnd网页收到单个节,我收到了一个节的列表,我将这个列表定义为没有定义类型的对象列表,因为它可以有表,段落和其他东西。

所以basicly我有这样的:

List<Object> listOfSections = new List<Object>(); 

在接收来自前端部分,并确定它是一个像这样的关键是什么:

foreach (DocumentAtributes section in sections.atributes) 
{ 
    if(section.key != "Document") 
    { 
     checkSection(mainPart, section, listOfSections); 
    } 
} 

public void checkSection(MainDocumentPart mainPart,DocumentAtributes section,List<Object> listOfSections) 
{ 
    switch (section.key) 
    { 
     case "Table": 
      DocTable docTable = new DocTable(); 
      Table table = docTable.createTable(Convert.ToInt16(section.rows), Convert.ToInt16(section.cols)); 
      listOfSections.Add(new Run(table)); 
      break; 
     case "Paragraph": 
      DocRun accessTypeTitle = new DocRun(); 
      Run permissionTitle = accessTypeTitle.createParagraph(section.text, PARAGRAPHCOLOR, Convert.ToInt16(section.fontSize), DEFAULTFONT,section.align); 
      listOfSections.Add(permissionTitle); 
      break; 
     case "Image": 
      DocImage docImage = new DocImage(); 
      Run image = docImage.imageCreatorFromDisk(mainPart, "abcd", Convert.ToInt16(section.width), Convert.ToInt16(section.height), section.align, null, null, section.wrapChoice, section.base64); 
      listOfSections.Add(image); 
      break; 
    } 
} 

我需要一种方法要将此列表添加到insertAfter,它必须是我无法添加单个对象的列表,因为在插入第一个后,下一个部分将添加到段落之后,或者它带给我一个问题,因为我希望订单成为与t中相同他分区。属性。

所以insertAfter接受一个列表,我有对象的列表的方法是这样的:insertAfter(列表,refChild)

我可以投我的对象列表或做其他事?这里需要一些帮助。

+0

难道你不能只使用列表或(最好)一些常见的超类型,而不是搞乱非泛型集合? – Casey

+0

没有,因为我从frontEnd收到一个复杂的json,它可以是任何东西 –

+0

或至少我不知道更好的解决方案 –

回答

2

您可以反向迭代列表,使列表中的第一个元素紧跟在paragraph之后,然后是第二个,然后是第三个元素等。

for (int i = listOfSections.Count - 1; i >= 0; i--) 
{ 
    mainPart.Document.Body.InsertAfter(listOfSections[i], paragraph); 
} 

如果你开始与元素的列表:

部件1
元素2
元素3
元素4

而且文档开头只是:

然后在每次迭代之后,你最终会得到:

迭代1


元素4

迭代2

段落
元素3
元素4

迭代3

段落
元素2
元素3
元素4

最后,Iterati 4

段落
元素1
元素2
元素3
元素4

这是期望的结果。

+0

谢谢你,是一个简单的解决方案,但从来没有这样说:D –