Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在DocumentFormat.OpenXml电子表格中添加行/单元格?_C#_Openxml_Xlsx - Fatal编程技术网

C# 如何在DocumentFormat.OpenXml电子表格中添加行/单元格?

C# 如何在DocumentFormat.OpenXml电子表格中添加行/单元格?,c#,openxml,xlsx,C#,Openxml,Xlsx,我有一个程序,需要接收一组数据,并将其写入新的XLSX电子表格。我目前正在使用NuGet的DocumentFormat.OpenXml包。程序运行正常,直到完成,没有收到任何错误。但是,当我检查XLSX文件时,工作簿存在,工作表存在,并且工作表已在代码中获得分配给它的名称 但是。。。没有任何行/单元格数据实际写入文件。工作表中的所有单元格均为空 这是我当前执行实际XLSX操作的代码… (文件,正在传递到SpreadsheetDocument。Create是一个字符串,具有完整路径。) 使用(Sp

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

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

这是我当前执行实际XLSX操作的代码…
(文件,正在传递到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());