如何在DocumentFormat.OpenXml Spreadsheet中添加行/单元格?

时间:2017-06-27 18:02:59

标签: c# openxml xlsx

我有一个程序需要接收一组数据,并将其写入新的XLSX电子表格。我目前正在使用NuGet的 DocumentFormat.OpenXml 包。程序运行正常,没有收到任何错误。但是,当我检查XLSX文件时,工作簿存在,工作表存在,并且工作表已在代码中为其分配了名称。

但是......没有任何行/单元格数据实际写入文件。工作表中的所有单元格都是空的。

这是我当前的代码,用于执行实际的XLSX内容...
(传递给SpreadsheetDocument.Create的文件是一个字符串,带有完整路径。)

using(SpreadsheetDocument doc = SpreadsheetDocument.Create(file, SpreadsheetDocumentType.Workbook))
{
    WorkbookPart wbp = doc.AddWorkbookPart();
    wbp.Workbook = new Workbook();
    WorksheetPart wsp = wbp.AddNewPart<WorksheetPart>();
    wsp.Worksheet = new Worksheet(new SheetData());
    var ws = wsp.Worksheet;
    Sheets sheets = wbp.Workbook.AppendChild(new Sheets());
    Sheet sheet = new Sheet() { Id = wbp.GetIdOfPart(wsp), SheetId = 1, Name = batchinfo.Field<string>("NAME") };
    sheets.Append(sheet);

    if(!exhdr) 
    {
        var row = ws.AppendChild(new Row());
        foreach(DataRow dr in hdrs) 
        {
            var cell = row.AppendChild(new Cell());
            cell.CellValue = new CellValue(dr.Field<string>("COLHEADER"));
            cell.DataType = new EnumValue<CellValues>(CellValues.String);
        }
    }

    var loans = (from DataRow dr in data.Rows
                 group dr by dr.Field<long>("L_ROWID") into g
                 select new { LoanId = g.Key, Rows = g.OrderBy(r => r.Field<double>("ORDERIDX")).ToList()}
                 );

    foreach(var loan in loans) 
    {
        var row = ws.AppendChild(new Row());
        foreach (DataRow dr in loan.Rows)
        {
            var cell = row.AppendChild(new Cell());
            cell.CellValue = new CellValue(dr.Field<string>("DATAOUT"));
            cell.DataType = new EnumValue<CellValues>(CellValues.String);
        }
    }
    wbp.Workbook.Save();
}

我也尝试修改代码来创建行或单元格对象,分配所有属性,然后将它附加到父级,就像这样......

var row = new Row();
foreach (DataRow dr in loan.Rows) {
    var cell = new Cell();
    cell.CellValue = new CellValue(dr.Field<string>("DATAOUT"));
    cell.DataType = new EnumValue<CellValues>(CellValues.String);
    row.Append(cell);
}
ws.Append(row);

关于我在这里做错了什么的任何线索?
就像我说的那样,文件和工作表似乎都被创造得很好 只是细胞在行动中都缺失了。

UPDATE:我在一个例子中看到,我发现,Worksheet对象上还有一个Save()方法。我在Workbook.Save()之前添加了它,但它没有任何区别。

或许有更好的图书馆可供使用?

1 个答案:

答案 0 :(得分:1)

知道了!这是解决方案,以防其他任何人来看......

这一行...

var row = ws.AppendChild(new Row());

需要实际阅读......

var row = ws.GetFirstChild<SheetData>().AppendChild(new Row());