.net 如何使用OpenXML将列插入Excel工作表

.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(

我提供了一个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 );
}
使用(电子表格文档=电子表格文档.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就是解决方案。谢谢