将列表传递给列表<t>

时间:2017-08-09 16:18:49

标签: c# asp.net list asp.net-web-api openxml

我正在使用openxml,并且有一些东西可以拉我的头发,基本上我正在编辑pré现有文档,它是一个模板,模板应该保留第一页和第二页,所以我添加的每个部分(段落,表等。)它应该在2页之间添加,我已经完成了,我可以插入一个简单的表这样

      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);

我基本上搜索第1页末尾的pargraph并在之后插入表格。我的问题是:我没有从frontEnd网页收到一个部分,我收到一个部分列表,我将此列表定义为没有定义类型的对象列表,因为它可以有表,段落和其他东西。

基本上我有这个:

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,它必须是列表我无法添加单个对象,因为在我插入第一个之后,下一个部分将在段落之后添加它或者它带给我一个问题,因为我希望订单与sections.atributes中的订单相同。

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

我可以投射我的物品清单或做其他事情吗?需要一些帮助。

1 个答案:

答案 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

最后,迭代4

  

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

这是期望的结果。