您的元素顺序略有不同。这Columns
应该放置before the SheetData
而不是之后。工作表的 XML 架构的相关部分是:
<xsd:complexType name="CT_Worksheet">
<xsd:sequence>
<xsd:element name="sheetPr" type="CT_SheetPr" minOccurs="0" maxOccurs="1"/>
<xsd:element name="dimension" type="CT_SheetDimension" minOccurs="0" maxOccurs="1"/>
<xsd:element name="sheetViews" type="CT_SheetViews" minOccurs="0" maxOccurs="1"/>
<xsd:element name="sheetFormatPr" type="CT_SheetFormatPr" minOccurs="0" maxOccurs="1"/>
<xsd:element name="cols" type="CT_Cols" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="sheetData" type="CT_SheetData" minOccurs="1" maxOccurs="1"/>
要修复您的代码,您可以删除SheetData
从你的new Worksheet
行并添加SheetData
之后Columns
:
worksheetPart.Worksheet = new Worksheet(new SheetViews(new SheetView { WorkbookViewId = 0, ShowGridLines = new BooleanValue(false) }));
//....code omitted for brevity
Columns columns = new Columns();
columns.Append(new Column() { Min = 1, Max = 3, Width = 20, CustomWidth = true });
columns.Append(new Column() { Min = 4, Max = 4, Width = 30, CustomWidth = true });
worksheetPart.Worksheet.Append(columns);
worksheetPart.Worksheet.Append(new SheetData());
或者你可以离开new Worksheet
按原样编码并使用InsertBefore添加时的方法Columns
将它们插入到之前SheetData
:
Columns columns = new Columns();
columns.Append(new Column() { Min = 1, Max = 3, Width = 20, CustomWidth = true });
columns.Append(new Column() { Min = 4, Max = 4, Width = 30, CustomWidth = true });
var sheetdata = worksheetPart.Worksheet.GetFirstChild<SheetData>();
worksheetPart.Worksheet.InsertBefore(columns, sheetdata);
另一件需要注意的事情 - 你应该把SpreadsheetDocument.Create
在 using 语句中。这将清理所有资源并在更改结束时为您保存文件,即:
using (var _document = SpreadsheetDocument.Create(filename, SpreadsheetDocumentType.Workbook))
{
//all your OpenXml code here...
}