通过OpenXML以编程方式复制和插入Excel行

时间:2019-05-20 11:25:40

标签: c# excel openxml

我想打开一个模板xlsx文件,要在其中复制并插入一行。我试图找到解决方案,但最终得到了相同的结果:无效的Excel文件。 这是我上次尝试的来源:

using (Stream xlsxStream = new MemoryStream())
{
  using (var fileStream = File.OpenRead(templatePath))
    fileStream.CopyTo(xlsxStream);
  xlsxStream.Seek(0L, SeekOrigin.Begin);
  using (var workbook = SpreadsheetDocument.Open(xlsxStream, true,
   new OpenSettings { AutoSave = true }))
  {
    var sheet = workbook.WorkbookPart.Workbook.Descendants<Sheet>().First(s => s.Name.Equals("abc"));
    string relationshipId = sheet.Id.Value;
    WorksheetPart worksheetPart = (WorksheetPart)workbook.WorkbookPart.GetPartById(relationshipId);
    Worksheet worksheet = worksheetPart.Worksheet;
    SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
    var row12 = sheetData.Elements<Row>().Where(r => r.RowIndex.Value == 12).FirstOrDefault();
    var newRow = new Row() { RowIndex = row12.RowIndex.Value };
    IEnumerable<Row> rows = sheetData.Descendants<Row>().Where(r => r.RowIndex.Value > row12.RowIndex.Value);
    foreach (Row row in rows)
    {
      uint newRowIndex = System.Convert.ToUInt32(row.RowIndex.Value + 1);

      foreach (Cell cell in row.Elements<Cell>())
      {
        string cellReference = cell.CellReference.Value;
        cell.CellReference = new StringValue(cellReference.Replace(row.RowIndex.Value.ToString(), newRowIndex.ToString()));
      }
      row.RowIndex = new UInt32Value(newRowIndex);
    }
    sheetData.InsertAfter(newRow, row12);
  }
  using (var resultFile = File.Create(resultPath))
    xlsxStream.CopyTo(resultFile);
}

请问错误在哪里。

更新 我将Stream更改为MemoryStream和

using (var resultFile = File.Create(resultPath))
            xlsxStream.CopyTo(resultFile);

File.WriteAllBytes(resultPath, xlsxStream.ToArray());

0 个答案:

没有答案