我提供了一个Excel工作簿(xlsx)来生成报告。 在某些情况下,我需要插入列。这是我正在尝试的代码。它运行正常,但不在工作表中插入新列: 我怎么能做到这一点?
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 );
}
答案 0 :(得分:2)
您的代码所做的是调整第一列的尺寸。不插入新的。 根据我对OpenXML的理解,您需要遍历行集合并调整每个单元格的单元格引用。
这将涉及遍历行集合,然后每行迭代单元格集合。获取每个单元格的单元格引用,其格式为&#34; B1&#34;,解析它,增加列部分以产生例如&#34; C1&#34;。 这仍然会让您了解如何更新公式引用。祝你好运! : - )
我能想到的三种选择:
1)尝试ClosedXML之类的东西 - 我从来没有用过这个,所以不知道它会有多好用。
2)使用VSTO而不是OpenXML编写Excel加载项。但这似乎首先打败了OpenXML的目标。
3)横向思考。在工作簿中创建一个新工作表,根据需要为您添加第一列信息,并为原始&#34; Balance&#34;中的每个单元格添加信息。 sheet在新工作表中创建一个新单元格,其中包含&#34; Balance!A1&#34;。行的公式
这将是我的首选方法,因为它保留了原始格式的源表格,并且您的报表可以从新工作表中读取,您还可以在其中添加所需的任何其他计算列。
创建新工作表可以提供更大的灵活性。
您可以添加类似于:
的公式单元格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 }
);
当我们最近做类似的事情时,我发现这两个链接很有用:
Creating an OpenXML spreadsheet from scratch
Styling an OpenXML spreadsheet