OpenXML 自定义列宽不起作用
OpenXML Custom column width not working
我正在尝试更改某些 excel 列的宽度。我已经尝试了所有方法,但我总是得到空的 excel 文档,我的 excel 文件在没有此添加的情况下工作正常:
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 });
wsPart.Worksheet.Append(columns);
但是一旦我添加这个 ,我就必须修复我的 excel 文件,它将是空的。我收到此错误:“替换部分:/xl/worksheets/sheet。xml 部分有 XML 错误。加载错误。第 1 行,第 0 列。
"。而且 'repaired' 文件是空的。
我的代码和MSDN example
的代码基本一样
我试过很多不同的方法来改变列宽,所以我认为问题出在其他地方。我似乎无法弄清楚出了什么问题。
编辑:完整代码
_document = SpreadsheetDocument.Create(newFileName, SpreadsheetDocumentType.Workbook);
_workbookPart = _document.AddWorkbookPart();
_workbookPart.Workbook = new Workbook();
WorksheetPart worksheetPart = _workbookPart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = new Worksheet(new SheetViews(new SheetView { WorkbookViewId = 0, ShowGridLines = new BooleanValue(false) }), new SheetData());
_document.WorkbookPart.Workbook.AppendChild(new Sheets());
Sheet sheet = new Sheet { Id = _document.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet1" };
_workbookPart.Workbook.Sheets.Append(sheet);
WorkbookStylesPart stylesPart = _workbookPart.AddNewPart<WorkbookStylesPart>();
stylesPart.Stylesheet = CreateStylesheet();
stylesPart.Stylesheet.Save();
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);
_sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();
你的元素顺序有点不对。 Columns
应该放在 之前 而不是 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"/>
要修复您的代码,您可以从 new Worksheet
行中删除 SheetData
并在 Columns
:
之后添加 SheetData
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
代码原样,并在添加 Columns
时使用 InsertBefore
方法将它们插入到 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...
}
我正在尝试更改某些 excel 列的宽度。我已经尝试了所有方法,但我总是得到空的 excel 文档,我的 excel 文件在没有此添加的情况下工作正常:
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 });
wsPart.Worksheet.Append(columns);
但是一旦我添加这个
我的代码和MSDN example
的代码基本一样我试过很多不同的方法来改变列宽,所以我认为问题出在其他地方。我似乎无法弄清楚出了什么问题。
编辑:完整代码
_document = SpreadsheetDocument.Create(newFileName, SpreadsheetDocumentType.Workbook);
_workbookPart = _document.AddWorkbookPart();
_workbookPart.Workbook = new Workbook();
WorksheetPart worksheetPart = _workbookPart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = new Worksheet(new SheetViews(new SheetView { WorkbookViewId = 0, ShowGridLines = new BooleanValue(false) }), new SheetData());
_document.WorkbookPart.Workbook.AppendChild(new Sheets());
Sheet sheet = new Sheet { Id = _document.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet1" };
_workbookPart.Workbook.Sheets.Append(sheet);
WorkbookStylesPart stylesPart = _workbookPart.AddNewPart<WorkbookStylesPart>();
stylesPart.Stylesheet = CreateStylesheet();
stylesPart.Stylesheet.Save();
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);
_sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();
你的元素顺序有点不对。 Columns
应该放在 之前 而不是 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"/>
要修复您的代码,您可以从 new Worksheet
行中删除 SheetData
并在 Columns
:
SheetData
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
代码原样,并在添加 Columns
时使用 InsertBefore
方法将它们插入到 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...
}