将列表传递给列表<T>
passing a list to a list<T>
我正在使用 openxml,有些事情让我很头疼,基本上我正在编辑一个现有的文档,它是一个模板,该模板应该保留第一页和第二页,所以我的每一节add(paragraph, table etc..) 它应该在两页之间添加,我已经做到了,我可以插入一个简单的 table 这种方式 :
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页末尾的段落并在后面插入table。我的问题是:我没有收到来自前端网页的单个部分,我收到了部分列表,我将此列表定义为没有定义类型的对象列表,因为它可以包含表格、段落和其他内容。
基本上我有这个:
List<Object> listOfSections = new List<Object>();
从前端接收sections,用key识别是什么:
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)
我可以投射对象列表或做其他事情吗?这里需要一些帮助。
您可以反向迭代列表,使列表中的第一个元素紧跟在 paragraph
之后,然后是第二个,然后是第三个,依此类推。
for (int i = listOfSections.Count - 1; i >= 0; i--)
{
mainPart.Document.Body.InsertAfter(listOfSections[i], paragraph);
}
如果您从包含以下元素的列表开始:
Element1
Element2
Element3
Element4
文档开头为:
Paragraph
然后在每次迭代之后你会得到:
迭代 1
Paragraph
Element4
迭代 2
Paragraph
Element3
Element4
迭代 3
Paragraph
Element2
Element3
Element4
最后,迭代 4
Paragraph
Element1
Element2
Element3
Element4
这是想要的结果。
我正在使用 openxml,有些事情让我很头疼,基本上我正在编辑一个现有的文档,它是一个模板,该模板应该保留第一页和第二页,所以我的每一节add(paragraph, table etc..) 它应该在两页之间添加,我已经做到了,我可以插入一个简单的 table 这种方式 :
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页末尾的段落并在后面插入table。我的问题是:我没有收到来自前端网页的单个部分,我收到了部分列表,我将此列表定义为没有定义类型的对象列表,因为它可以包含表格、段落和其他内容。
基本上我有这个:
List<Object> listOfSections = new List<Object>();
从前端接收sections,用key识别是什么:
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)
我可以投射对象列表或做其他事情吗?这里需要一些帮助。
您可以反向迭代列表,使列表中的第一个元素紧跟在 paragraph
之后,然后是第二个,然后是第三个,依此类推。
for (int i = listOfSections.Count - 1; i >= 0; i--)
{
mainPart.Document.Body.InsertAfter(listOfSections[i], paragraph);
}
如果您从包含以下元素的列表开始:
Element1
Element2
Element3
Element4
文档开头为:
Paragraph
然后在每次迭代之后你会得到:
迭代 1
Paragraph
Element4
迭代 2
Paragraph
Element3
Element4
迭代 3
Paragraph
Element2
Element3
Element4
最后,迭代 4
Paragraph
Element1
Element2
Element3
Element4
这是想要的结果。