.net 如何使用OpenXML将列插入Excel工作表
我提供了一个Excel工作簿(xlsx)来生成报告。 在某些情况下,我需要插入列。这是我正在尝试的代码。它运行正常,但不会在工作表中插入新列: 我怎样才能做到这一点.net 如何使用OpenXML将列插入Excel工作表,.net,openxml,openxml-sdk,.net,Openxml,Openxml Sdk,我提供了一个Excel工作簿(xlsx)来生成报告。 在某些情况下,我需要插入列。这是我正在尝试的代码。它运行正常,但不会在工作表中插入新列: 我怎样才能做到这一点 using (SpreadsheetDocument document = SpreadsheetDocument.Open(outputPath, true)){ Sheet sheet1 = document.WorkbookPart.Workbook.Descendants<Sheet>().Single(
using (SpreadsheetDocument document = SpreadsheetDocument.Open(outputPath, true)){
Sheet sheet1 = document.WorkbookPart.Workbook.Descendants<Sheet>().Single( s => s.Name == "Balance" );
Worksheet workSheet1 = ( (WorksheetPart)document.WorkbookPart.GetPartById( sheet2.Id ) ).Worksheet;
Columns cs = workSheet1.GetFirstChild<Columns>();
Column c = new Column()
{
Min = (UInt32Value)1U,
Max = (UInt32Value)1U,
Width = 44.33203125D,
CustomWidth = true
};
cs.Append( c );
}
使用(电子表格文档=电子表格文档.Open(outputPath,true)){
sheet1=document.WorkbookPart.Workbook.subjections().Single(s=>s.Name==“余额”);
工作表工作表1=((工作表部分)document.WorkbookPart.GetPartById(sheet2.Id)).Worksheet;
列cs=workSheet1.GetFirstChild();
列c=新列()
{
最小值=(UINT32值)1U,
最大值=(UINT32值)1U,
宽度=44.33203125D,
CustomWidth=true
};
cs.附加(c);
}
您的代码所做的是调整第一列的尺寸。不插入新的。
根据我对OpenXML的理解,您需要遍历rows集合并调整每个单元格的单元格引用
这将涉及遍历rows集合,然后针对每一行遍历cells集合。获取格式为“B1”的每个单元格的单元格引用,对其进行解析,增加列部分以生成eg“C1”。
这仍然会给您留下如何更新公式引用的问题。祝你好运!:-)
我可以想到三种选择:
1) 试试这样的东西-我从来没有用过这个,所以不知道它会有多好的效果
2) 使用VSTO而不是OpenXML编写Excel加载项。但这似乎首先击败了OpenXML的对象
3) 横向思考。在工作簿中创建一个新的工作表,根据需要为您的第一列添加信息,并为原始“资产负债表”中的每个单元格在新工作表中创建一个新单元格,其中包含一个沿“Balance!A1”行的公式。这将是我的首选方法,因为它使源工作表保持原始格式不变,并且您的报告可以从新工作表中读取,您还可以在其中添加任何其他您想要的计算列。
创建新工作表使您具有更大的灵活性 可以添加类似以下内容的公式单元格:
string sourcecell = ...; // read this from the cell reference of the original cell
string newcell = ...; // parse the original cell ref and increment the column
row.Append(new Cell(
new CellFormula() {
FormulaType = CellFormulaValues.Normal,
Text = string.Format("Balance!({0})", sourcecell)
},
new CellValue("0.00")
) { CellReference = newcell, StyleIndex = 0 }
);
当我们最近做类似的事情时,我发现这两个链接很有用:ClosedXML就是解决方案。谢谢