如何使用open xml sdk在.xlsx文件的现有行中添加新单元格?

时间:2016-02-03 08:38:44

标签: c# .net excel openxml

我有一个.xlsx文件,它已有一些数据。 我想在I1单元格上输入一些数据。 enter image description here

更新 我试过这个:

WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();                
SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();

Row row1 = new Row()
{
  RowIndex = (UInt32Value)1U
};

Cell cell = new Cell() { CellReference = "I1" };
CellFormula cellformula = new CellFormula();
cellformula.Text = "IF(A2 = A1,1,0)";
CellValue cellValue = new CellValue();
cellValue.Text = "0";
cell.Append(cellformula);
cell.Append(cellValue);

row1.Append(cell);

sheetData.Append(row1);

但它没有用。

请提供示例代码和答案。

1 个答案:

答案 0 :(得分:2)

您正在创建新的Row对象,即使文档中已存在一个对象。然后你给它一个RowIndex,它也已经存在,这意味着你最终会得到一个损坏的文件(你不能有两行具有相同的索引)。

您需要找到现有 Row并将新的Cell添加到其中,而不是创建全新的Row。最简单的方法是在sheetData上致电GetFirstChild<Row>

顺便说一句,在使用公式时,我也不会将CellValue写入Cell。在这种情况下,Excel使用Value来防止在加载工作表时重新计算公式。在你的例子中虽然你的价值是错误的。完全省略该值可能是保证正确性的最简单方法,因为Excel将在工作表加载时计算公式。

这导致以下代码:

using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filename, true))
{
    WorkbookPart workBookPart = spreadsheetDocument.WorkbookPart;

    WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
    WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
    SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();

    //find the first row in the sheet data
    Row row1 = sheetData.GetFirstChild<Row>();

    //create a new cell
    Cell cell = new Cell() { CellReference = "I1" };
    CellFormula cellformula = new CellFormula();
    cellformula.Text = "IF(A2 = A1,1,0)";
    cell.Append(cellformula);

    //append the cell to the row
    row1.Append(cell);
}