使用OpenXML将Excel 2013范围格式化为表格
最近我发现自己需要将一个大型的C#DataTable粘贴到Excel中,并且很高兴看到SimpleOOXML( https://simpleooxml.codeplex.com )扩展的WorksheetWriter.PasteDataTable()函数,它完成了这个工作。
不幸的是,它并没有自动地将粘贴的DataTable转换为具有自动化列宽和过滤function的“Format as Table”,正如人们所期望的那样,而是只允许我指定单独的样式(例如边框,背景颜色等)。
如果有人知道如何使用SimpleOOXML(我在他们的论坛中找不到相关的东西),那将是非常了不起的,但是如果这是不可能的,我想知道是否可以使用传统的OpenXML来完成。
编辑
为了澄清,我检查了OpenXML的MSDN文档,但找不到以下方法:
以编程方式使用OpenXML格式化特定范围(G7:I9)作为表,使用样式“Table Style Light 9”,并保留现有的标题。
用表格中的简单数据创build一个虚拟Excel文件:
在打开的XML生产力工具中打开 Excel文件显示需要创build一个表部分:
private void GenerateTableDefinitionPart1Content(TableDefinitionPart tableDefinitionPart1) { Table table1 = new Table(){ Id = (UInt32Value)1U, Name = "Table1", DisplayName = "Table1", Reference = "A1:D2", TotalsRowShown = false }; AutoFilter autoFilter1 = new AutoFilter(){ Reference = "A1:D2" }; TableColumns tableColumns1 = new TableColumns(){ Count = (UInt32Value)4U }; TableColumn tableColumn1 = new TableColumn(){ Id = (UInt32Value)1U, Name = "1" }; TableColumn tableColumn2 = new TableColumn(){ Id = (UInt32Value)2U, Name = "2" }; TableColumn tableColumn3 = new TableColumn(){ Id = (UInt32Value)3U, Name = "3" }; TableColumn tableColumn4 = new TableColumn(){ Id = (UInt32Value)4U, Name = "4" }; tableColumns1.Append(tableColumn1); tableColumns1.Append(tableColumn2); tableColumns1.Append(tableColumn3); tableColumns1.Append(tableColumn4); TableStyleInfo tableStyleInfo1 = new TableStyleInfo(){ Name = "TableStyleLight17", ShowFirstColumn = false, ShowLastColumn = false, ShowRowStripes = true, ShowColumnStripes = false }; table1.Append(autoFilter1); table1.Append(tableColumns1); table1.Append(tableStyleInfo1); tableDefinitionPart1.Table = table1; }
然后主叫:
TableDefinitionPart tableDefinitionPart1 = worksheetPart1.AddNewPart<TableDefinitionPart>("rId1"); GenerateTableDefinitionPart1Content(tableDefinitionPart1);
要为表格select正确的样式,请更改TableStyleInfo Name属性:
TableStyleInfo tableStyleInfo1 = new TableStyleInfo(){ Name = "TableStyleLight17", ShowFirstColumn = false, ShowLastColumn = false, ShowRowStripes = true, ShowColumnStripes = false };