OpenXML sdk 2.5 Excel新专栏问题

我有一部分使用OpenXML生成Excel文档的代码。 问题是设置自定义列的宽度。 这个问题经常在这里讨论,但不幸的是没有任何帮助。

所以这里创build文件的代码:

SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(stream , SpreadsheetDocumentType.Workbook); WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart(); workbookpart.Workbook = new Workbook(); WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>(); worksheetPart.Worksheet = new Worksheet(new SheetData()); Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook. AppendChild<Sheets>(new Sheets()); Sheet sheet = new Sheet() { Id = spreadsheetDocument.WorkbookPart. GetIdOfPart(worksheetPart), SheetId = 1, Name = _sheetName }; sheets.Append(sheet); document = spreadsheetDocument; wbPart = workbookpart 

创build后,我试图设置自定义列的宽度到第一列

 Worksheet ws = ((WorksheetPart)(wbPart.GetPartById(sheet.Id))).Worksheet; Columns columns = new Columns(); Column column = new Column() { Min = (UInt32Value)5U, Max = (UInt32Value)5U, Width = 16D, CustomWidth = true }; columns.Append(column); ws.Append(columns); ws.Save(); 

代码运行没有任何exception,但结果文件被破坏这里是结构opf结果表xml

 <?xml version="1.0" encoding="UTF-8"?> -<x:worksheet xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> -<x:sheetData> -<x:row r="7"> -<x:cr="A7" t="s" s="6"> <x:v>11</x:v> </x:c> -<x:cr="B7" t="s" s="6"> <x:v>12</x:v> </x:c> -<x:cr="C7" t="s" s="6"> <x:v>13</x:v> </x:c> </x:row> </x:sheetData> -<x:cols> <x:col customWidth="1" width="16" max="5" min="5"/> </x:cols> </x:worksheet> 

所以问题是,我做错了什么?

UPD。 问题解决了,感谢petelids 。 我只是补充说:

 SheetData sheetData = ws.GetFirstChild<SheetData>(); ws.InsertBefore(columns,sheetData); 

然后,在这里只指定范围Min =(UInt32Value)5U,Max =(UInt32Value)5U

您的元素顺序不正确,导致文件信息损坏。 ECMA-376标准将Worksheet的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"/> <xsd:element name="sheetCalcPr" type="CT_SheetCalcPr" minOccurs="0" maxOccurs="1"/> <xsd:element name="sheetProtection" type="CT_SheetProtection" minOccurs="0" maxOccurs="1"/> <xsd:element name="protectedRanges" type="CT_ProtectedRanges" minOccurs="0" maxOccurs="1"/> <xsd:element name="scenarios" type="CT_Scenarios" minOccurs="0" maxOccurs="1"/> <xsd:element name="autoFilter" type="CT_AutoFilter" minOccurs="0" maxOccurs="1"/> <xsd:element name="sortState" type="CT_SortState" minOccurs="0" maxOccurs="1"/> <xsd:element name="dataConsolidate" type="CT_DataConsolidate" minOccurs="0" maxOccurs="1"/> <xsd:element name="customSheetViews" type="CT_CustomSheetViews" minOccurs="0" maxOccurs="1"/> <xsd:element name="mergeCells" type="CT_MergeCells" minOccurs="0" maxOccurs="1"/> <xsd:element name="phoneticPr" type="CT_PhoneticPr" minOccurs="0" maxOccurs="1"/> <xsd:element name="conditionalFormatting" type="CT_ConditionalFormatting" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="dataValidations" type="CT_DataValidations" minOccurs="0" maxOccurs="1"/> <xsd:element name="hyperlinks" type="CT_Hyperlinks" minOccurs="0" maxOccurs="1"/> <xsd:element name="printOptions" type="CT_PrintOptions" minOccurs="0" maxOccurs="1"/> <xsd:element name="pageMargins" type="CT_PageMargins" minOccurs="0" maxOccurs="1"/> <xsd:element name="pageSetup" type="CT_PageSetup" minOccurs="0" maxOccurs="1"/> <xsd:element name="headerFooter" type="CT_HeaderFooter" minOccurs="0" maxOccurs="1"/> <xsd:element name="rowBreaks" type="CT_PageBreak" minOccurs="0" maxOccurs="1"/> <xsd:element name="colBreaks" type="CT_PageBreak" minOccurs="0" maxOccurs="1"/> <xsd:element name="customProperties" type="CT_CustomProperties" minOccurs="0" maxOccurs="1"/> <xsd:element name="cellWatches" type="CT_CellWatches" minOccurs="0" maxOccurs="1"/> <xsd:element name="ignoredErrors" type="CT_IgnoredErrors" minOccurs="0" maxOccurs="1"/> <xsd:element name="smartTags" type="CT_SmartTags" minOccurs="0" maxOccurs="1"/> <xsd:element name="drawing" type="CT_Drawing" minOccurs="0" maxOccurs="1"/> <xsd:element name="drawingHF" type="CT_DrawingHF" minOccurs="0" maxOccurs="1"/> <xsd:element name="picture" type="CT_SheetBackgroundPicture" minOccurs="0" maxOccurs="1"/> <xsd:element name="oleObjects" type="CT_OleObjects" minOccurs="0" maxOccurs="1"/> <xsd:element name="controls" type="CT_Controls" minOccurs="0" maxOccurs="1"/> <xsd:element name="webPublishItems" type="CT_WebPublishItems" minOccurs="0" maxOccurs="1"/> <xsd:element name="tableParts" type="CT_TableParts" minOccurs="0" maxOccurs="1"/> <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/> </xsd:sequence> </xsd:complexType> 

请注意,这是一个sequence所以项目顺序和sheetDatasheetData (第5行和第6行)之前。

在你的情况下,你需要 SheetData 之前直接添加Columns 。 在Worksheet上有一个InsertBefore方法,可以用来代替对Append的调用。