C# 如何在DocumentFormat.OpenXml电子表格中添加行/单元格?
我有一个程序,需要接收一组数据,并将其写入新的XLSX电子表格。我目前正在使用NuGet的DocumentFormat.OpenXml包。程序运行正常,直到完成,没有收到任何错误。但是,当我检查XLSX文件时,工作簿存在,工作表存在,并且工作表已在代码中获得分配给它的名称 但是。。。没有任何行/单元格数据实际写入文件。工作表中的所有单元格均为空 这是我当前执行实际XLSX操作的代码…C# 如何在DocumentFormat.OpenXml电子表格中添加行/单元格?,c#,openxml,xlsx,C#,Openxml,Xlsx,我有一个程序,需要接收一组数据,并将其写入新的XLSX电子表格。我目前正在使用NuGet的DocumentFormat.OpenXml包。程序运行正常,直到完成,没有收到任何错误。但是,当我检查XLSX文件时,工作簿存在,工作表存在,并且工作表已在代码中获得分配给它的名称 但是。。。没有任何行/单元格数据实际写入文件。工作表中的所有单元格均为空 这是我当前执行实际XLSX操作的代码… (文件,正在传递到SpreadsheetDocument。Create是一个字符串,具有完整路径。) 使用(Sp
(文件,正在传递到SpreadsheetDocument。Create是一个字符串,具有完整路径。)
使用(SpreadsheetDocument文档=SpreadsheetDocument.Create(文件,SpreadsheetDocumentType.工作簿))
{
WorkbookPart wbp=doc.AddWorkbookPart();
wbp.Workbook=新工作簿();
工作表部件wsp=wbp.AddNewPart();
wsp.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(“Name”)};
附页(页);
如果(!exhdr)
{
var row=ws.AppendChild(新行());
foreach(hdrs中的数据行灾难恢复)
{
var cell=row.AppendChild(新单元格());
cell.CellValue=新的CellValue(dr.Field(“COLHEADER”);
cell.DataType=新的枚举值(CellValues.String);
}
}
var贷款=(来自data.Rows中的DataRow dr
按dr.Field(“L_ROWID”)将dr分组为g
选择new{LoanId=g.Key,Rows=g.OrderBy(r=>r.Field(“ORDERIDX”)).ToList()}
);
foreach(贷款中的var贷款)
{
var row=ws.AppendChild(新行());
foreach(loan.Rows中的数据行dr)
{
var cell=row.AppendChild(新单元格());
cell.CellValue=新的CellValue(dr.Field(“数据输出”);
cell.DataType=新的枚举值(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);
var行=新行();
foreach(loan.Rows中的数据行dr){
变量单元格=新单元格();
cell.CellValue=新的CellValue(dr.Field(“数据输出”);
cell.DataType=新的枚举值(CellValues.String);
行。追加(单元格);
}
ws.Append(行);
有没有关于我做错了什么的线索?正如我所说,文件和其中的工作表似乎都创建得很好。
只是细胞在活动中都不见了 更新:在我发现的一个示例中,工作表对象上还有一个
Save()
方法。我在工作簿.Save()
之前添加了它,但没有任何区别
或者可能有更好的库可以使用?明白了!这是一个解决方案,以防其他人来找 这条线
var row = ws.AppendChild(new Row());
需要实际阅读,所以
var row = ws.GetFirstChild<SheetData>().AppendChild(new Row());
var row=ws.GetFirstChild().AppendChild(新行());
您的row变量不应该在foreach
循环中吗?它在外部的loan for循环中;内部for循环是每个贷款的单个值。是电子表格文档中的文件
。创建(文件,电子表格文档类型.工作簿)
类型流?;如果是这样的话,那么你需要冲洗水流!啊,没有。说得好。。。将其添加到问题中。但是file
是一个字符串,包含了输出文件的完整路径。哈哈,我刚刚写了一个答案来说明这一点。需要将该行添加到图纸数据中。您可以通过在添加代码时捕获代码顶部的SheetData
并进一步向下重复使用,使其更整洁<代码>wsp.Worksheet=新工作表();var-ws=wsp.Worksheet;var sheetData=ws.AppendChild(new sheetData());sheetData.Append(新行())
ooh,是的,是的。。。说得好!错过了如此专注于功能的机会。谢谢B) 别担心,祝你的项目好运。您可能已经看到了它,但在这些情况下,它确实很有用。它内置了一个验证器,它通常会为您指明正确的方向,还有一个代码生成器(尽管生成的代码很冗长)。
var row = ws.GetFirstChild<SheetData>().AppendChild(new Row());