在c#中使用OpenXMLSDK创建xlsx文件
我在使用OpenXMLSDK创建excel文件时遇到了一点问题,我按照上的说明进行了操作在c#中使用OpenXMLSDK创建xlsx文件,c#,excel,C#,Excel,我在使用OpenXMLSDK创建excel文件时遇到了一点问题,我按照上的说明进行了操作 类程序 { 静态void Main(字符串[]参数) { 名单人员=新名单() { 新人(){FirstName=“Brecht”,LastName=“Baekelandt”,年龄=29}, 新人(){FirstName=“Pieter”,LastName=“Baekelandt”,年龄=28}, 新人(){FirstName=“Leonie”,LastName=“Baekelandt”,年龄=21} };
类程序
{
静态void Main(字符串[]参数)
{
名单人员=新名单()
{
新人(){FirstName=“Brecht”,LastName=“Baekelandt”,年龄=29},
新人(){FirstName=“Pieter”,LastName=“Baekelandt”,年龄=28},
新人(){FirstName=“Leonie”,LastName=“Baekelandt”,年龄=21}
};
string directory=Path.Combine(@“C:\Temp”,“TestFiles”);
string fileName=Path.Combine(目录,string.Format(“TestFile{0:yyyy-MM-dd-HH.MM.ss}.xlsx”,DateTime.Now));
//通过提供文件路径创建电子表格文档。
//默认情况下,AutoSave=true、Editable=true和Type=xlsx。
使用(电子表格文档电子表格文档=电子表格文档)。
创建(文件名,电子表格文档类型.工作簿))
{
//将工作簿部件添加到文档中。
WorkbookPart WorkbookPart=电子表格文档.AddWorkbookPart();
workbookpart.工作簿=新工作簿();
//将工作表部件添加到工作簿部件。
WorksheetPart WorksheetPart=workbookpart.AddNewPart();
worksheetPart.Worksheet=新工作表(new SheetData());
//将工作表添加到工作簿中。
工作表=电子表格Document.WorkbookPart.Workbook。
追加子项(新页());
//附加新工作表并将其与工作簿关联。
图纸=新图纸()
{
Id=spreadsheetDocument.WorkbookPart。
GetIdOfPart(工作表部分),
SheetId=1,
Name=“mySheet”
};
附页(页);
SheetData SheetData=worksheetPart.Worksheet.GetFirstChild();
UInt32行索引=0;
foreach(var个人对个人)
{
var row=new row(){RowIndex=RowIndex};
var firstNameCell=newcell(){CellReference=“A”+(rowIndex+1)};
firstNameCell.CellValue=新的CellValue(person.FirstName);
firstNameCell.DataType=CellValues.String;
行.AppendChild(firstNameCell);
Cell lastNameCell=newcell(){CellReference=“B”+(rowIndex+1)};
lastNameCell.CellValue=新的CellValue(person.LastName);
lastNameCell.DataType=新的枚举值(CellValues.String);
行.AppendChild(lastNameCell);
Cell ageCell=new Cell(){CellReference=“C”+(rowIndex+1)};
ageCell.CellValue=新的CellValue(person.Age.ToString());
ageCell.DataType=新的枚举值(CellValues.Number);
行。追加子项(ageCell);
sheetData.AppendChild(行);
rowIndex++;
}
workbookpart.Workbook.Save();
}
}
}
这将创建以下xml文件:
<?xml version="1.0" encoding="utf-8"?>
<x:worksheet xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<x:sheetData>
<x:row r="0">
<x:c r="A1" t="str">
<x:v>Brecht</x:v>
</x:c>
<x:c r="B1" t="str">
<x:v>Baekelandt</x:v>
</x:c>
<x:c r="C1" t="n">
<x:v>29</x:v>
</x:c>
</x:row>
<x:row r="1">
<x:c r="A2" t="str">
<x:v>Pieter</x:v>
</x:c>
<x:c r="B2" t="str">
<x:v>Baekelandt</x:v>
</x:c>
<x:c r="C2" t="n">
<x:v>28</x:v>
</x:c>
</x:row>
<x:row r="2">
<x:c r="A3" t="str">
<x:v>Leonie</x:v>
</x:c>
<x:c r="B3" t="str">
<x:v>Baekelandt</x:v>
</x:c>
<x:c r="C3" t="n">
<x:v>21</x:v>
</x:c>
</x:row>
</x:sheetData>
</x:worksheet>
布莱希特
巴克兰特
29
彼得
巴克兰特
28
莱昂尼
巴克兰特
21
这应该可以,但是当我打开xlsx文件时,我得到以下错误:
Excel在[文件]中发现无法读取的内容。是否要恢复此工作簿的内容
单击“是”时,只有第一个人被添加到工作表中
我做错了什么?你的问题是索引。行索引从索引1开始 流动应该有效
UInt32 rowIndex = 1;
foreach (var person in persons)
{
var row = new Row() { RowIndex = rowIndex };
var firstNameCell = new Cell() { CellReference = "A" +rowIndex };
firstNameCell.CellValue = new CellValue(person.FirstName);
firstNameCell.DataType = CellValues.String;
row.Append(firstNameCell);
Cell lastNameCell = new Cell() { CellReference = "B"+rowIndex };
lastNameCell.CellValue = new CellValue(person.LastName);
lastNameCell.DataType = new EnumValue<CellValues>(CellValues.String);
row.Append(lastNameCell);
Cell ageCell = new Cell() { CellReference = "C"+rowIndex };
ageCell.CellValue = new CellValue(person.Age.ToString());
ageCell.DataType = new EnumValue<CellValues>(CellValues.Number);
row.Append(ageCell);
sheetData.Append(row);
rowIndex++;
}
UInt32行索引=1;
foreach(var个人对个人)
{
var row=new row(){RowIndex=RowIndex};
var firstNameCell=new Cell(){CellReference=“A”+rowIndex};
firstNameCell.CellValue=新的CellValue(person.FirstName);
firstNameCell.DataType=CellValues.String;
追加行(firstNameCell);
Cell lastNameCell=new Cell(){CellReference=“B”+rowIndex};
lastNameCell.CellValue=新的CellValue(person.LastName);
lastNameCell.DataType=新的枚举值(CellValues.String);
追加(lastNameCell);
Cell ageCell=new Cell(){CellReference=“C”+rowIndex};
ageCell.CellValue=新的CellValue(person.Age.ToString());
ageCell.DataType=新的枚举值(CellValues.Number);
行。追加(ageCell);
sheetData.Append(行);
rowIndex++;
}
这只是一个测试用例,将有更多的对象需要转换为excel。另外,你在这里做的是在第一行,第一列,第二行,第二列等等上设置名字。这不起作用,我只在第一行上得到名字,就像我之前说过的。我需要循环一个完整的人员列表,但循环不起作用。就像每当我想在第二行、第三行写东西时,它就不起作用了……我编辑了我的答案,我检查了你的代码,但它不起作用,对不起。。。另外,单元格A1上的索引是行索引,而不是列索引,请先阅读我提供的链接…我给出了答案。对不起,我的工作有点忙,所以我把前面的答案弄错了。问题在于行索引这是答案,我不知道会这么简单:-)谢谢!!
UInt32 rowIndex = 1;
foreach (var person in persons)
{
var row = new Row() { RowIndex = rowIndex };
var firstNameCell = new Cell() { CellReference = "A" +rowIndex };
firstNameCell.CellValue = new CellValue(person.FirstName);
firstNameCell.DataType = CellValues.String;
row.Append(firstNameCell);
Cell lastNameCell = new Cell() { CellReference = "B"+rowIndex };
lastNameCell.CellValue = new CellValue(person.LastName);
lastNameCell.DataType = new EnumValue<CellValues>(CellValues.String);
row.Append(lastNameCell);
Cell ageCell = new Cell() { CellReference = "C"+rowIndex };
ageCell.CellValue = new CellValue(person.Age.ToString());
ageCell.DataType = new EnumValue<CellValues>(CellValues.Number);
row.Append(ageCell);
sheetData.Append(row);
rowIndex++;
}