Как добавить DataTable в существующий файл Excel в качестве нового листа? - PullRequest
0 голосов
/ 24 февраля 2019

Я хочу добавить DataTable на новый лист в существующем шаблоне Excel.

Я открываю шаблон Excel, делаю копию и получаю DataTable:

class Program
{
static void Main(string[] args)
{
  string templateFile = @"D:\TestDocs\ReportTemplate.xlsx";
  string newFile = @"D:\TestDocs\NewReport ";
  string date = DateTime.Now.ToString("ddMMyy") + ".xlsx";
  string newFileName = newFile + date;

  File.Copy(templateFile, newFileName, true);

  ReadDataTable report = new ReadDataTable(newFileName);

  DataTable dt1 = new DataTable();
  dt1.Columns.Add("Name", typeof(string));
  dt1.Columns.Add("Salary", typeof(int));
  dt1.Columns.Add("Birthdate", typeof(DateTime));
  dt1.TableName = "Table1";

  dt1.Rows.Add("Maria", 100);
  dt1.Rows.Add("Tom", 101);
  report.AddItems(dt1);
  report.Save();
  System.Diagnostics.Process.Start(newFileName);
}
}

ЗатемЯ создаю необходимые новые детали в копии шаблона Excel и добавляю содержимое DataTable:

class ReadDataTable
{
private SpreadsheetDocument _document;
private WorkbookPart _workbookPart;
private Sheets _sheets;

public ReadDataTable(string newFileName)
{
  _document = SpreadsheetDocument.Open(newFileName, true);
  _workbookPart = _document.WorkbookPart;
  _sheets = _workbookPart.Workbook.AppendChild<Sheets>(new Sheets());
}

public void AddItems (DataTable dt)
{
  WorksheetPart worksheetPart = _workbookPart.AddNewPart<WorksheetPart>();
  Worksheet workSheet = new Worksheet();
  SheetData sheetData = new SheetData();

  worksheetPart.Worksheet = workSheet;
  workSheet.AppendChild(sheetData);

  sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();

  Row header = new Row();
  sheetData.Append(header);

  Cell Header1 = ConstructCell("Name", CellValues.String);
  Cell Header2 = ConstructCell("Salary", CellValues.String);
  Cell Header3 = ConstructCell("Birthdate", CellValues.String);
  header.Append(Header1, Header2, Header3);


  Row newRow = new Row();

  foreach (DataRow itemRow in dt.Rows)
  {
    newRow = new Row();

    foreach (object item in itemRow.ItemArray)
    {
      newRow.Append(
        ConstructCell(item.ToString(), CellValues.String));
    }
    sheetData.Append(newRow);
  }

  Sheet sheet = new Sheet()
  {
    Id = _document.WorkbookPart.GetIdOfPart(worksheetPart),
    Name = dt.TableName
  };

  _sheets.Append(sheet);
}
public void Save()
{
  _document.Close();
  _document.Dispose();
}

private Cell ConstructCell(string value, CellValues dataType)
{
  return new Cell()
  {
    CellValue = new CellValue(value),
    DataType = new EnumValue<CellValues>(dataType)
  };
}
}

Новый файл Excel создан, но он поврежден, и я не смог получить из него никакого содержимогочтобы увидеть, что не так.

...