Скопируйте и вставьте строку Excel с OpenXML программно - PullRequest
0 голосов
/ 20 мая 2019

Я хочу открыть файл шаблона 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);
}

Где ошибка, пожалуйста.

UPDATE Я изменил Stream на MemoryStream и

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

до

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