如何在OpenXML Library中调整Excel列宽?
使用OpenXML 2.20.0设置Excel列宽的解决方案
你当前的代码仅实现了数据导出,但缺少设置列宽的核心逻辑——需要在Worksheet中添加Columns集合来定义每一列的宽度规则。以下是修改后的完整代码,关键修改点已标注:
核心修改说明
- 创建
Columns对象,为每一列添加Column元素,通过Width设置宽度值,CustomWidth = true启用自定义宽度 - 将
Columns插入到Worksheet的最前面(必须在SheetData之前) - 可根据需求调整固定宽度,或根据列名/内容长度动态计算宽度
修改后的完整代码
using (SpreadsheetDocument document = SpreadsheetDocument.Create($"{masterType}.xlsx", SpreadsheetDocumentType.Workbook)) { WorkbookPart workbookPart = document.AddWorkbookPart(); workbookPart.Workbook = new Workbook(); WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>(); var sheetData = new SheetData(); // 新增:创建列宽设置集合 Columns columns = new Columns(); List<String> columnNames = new List<string>(); foreach (System.Data.DataColumn column in table.Columns) { columnNames.Add(column.ColumnName); // 设置每列宽度,示例值为15,可按需调整 Column col = new Column() { Min = (uint)(columnNames.Count), Max = (uint)(columnNames.Count), Width = 15, CustomWidth = true }; columns.Append(col); } // 新增:将Columns插入到Worksheet中,位置在SheetData之前 worksheetPart.Worksheet = new Worksheet(columns, sheetData); Sheets sheets = workbookPart.Workbook.AppendChild(new Sheets()); Sheet sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = $"{masterType}" }; sheets.Append(sheet); Row headerRow = new Row(); foreach (string colName in columnNames) { Cell cell = new Cell(); cell.DataType = CellValues.String; cell.CellValue = new CellValue(colName); headerRow.AppendChild(cell); } sheetData.AppendChild(headerRow); foreach (DataRow dsrow in table.Rows) { Row newRow = new Row() { Height = 10 }; foreach (string col in columnNames) { Cell cell = new Cell(); cell.DataType = CellValues.String; cell.CellValue = new CellValue(dsrow[col].ToString()); newRow.AppendChild(cell); } sheetData.AppendChild(newRow); } }
额外说明
- 如果需要动态计算列宽(比如根据列名或单元格内容的最大长度),可先遍历所有数据记录,计算每列的最大字符长度,再转换为Excel的宽度单位(Excel宽度单位约为字符数的1.1倍,可根据字体调整)
Min和Max属性指定宽度规则的适用列范围,这里每列单独设置,所以两者值为当前列的索引(从1开始)
内容的提问来源于stack exchange,提问作者Sai Charan
相关产品推荐
相关产品推荐

