我有一个程序需要接收一组数据,并将其写入新的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()
之前添加了它,但它没有任何区别。
或许有更好的图书馆可供使用?
答案 0 :(得分:1)
知道了!这是解决方案,以防其他任何人来看......
这一行...
var row = ws.AppendChild(new Row());
需要实际阅读......
var row = ws.GetFirstChild<SheetData>().AppendChild(new Row());