Excel导出列宽设置说明 ====================== ## 问题描述 使用 `AutoSizeColumn()` 方法时,Excel导出的表格列宽可能不正确,导致内容挤在一起。 ## 解决方案 使用 `SetColumnWidth()` 方法手动设置列宽。 ## 列宽单位 NPOI中列宽的单位是:**1/256字符宽度** 例如: - `SetColumnWidth(0, 20 * 256)` = 20个字符宽度 - `SetColumnWidth(1, 12 * 256)` = 12个字符宽度 ## 推荐设置 ```csharp // 序号列:20个字符宽度(较宽,容纳中文) sheet.SetColumnWidth(0, 20 * 256); // 数据列:12个字符宽度(适合数值显示) for (int i = 1; i <= 15; i++) { sheet.SetColumnWidth(i, 12 * 256); } ``` ## 列宽对照表 | 字符数 | 代码 | 适用场景 | |--------|------|----------| | 8 | `8 * 256` | 短数值(如:1、2、3) | | 10 | `10 * 256` | 普通数值(如:30.25) | | 12 | `12 * 256` | 带小数的数值(如:120.00) | | 15 | `15 * 256` | 较长文本 | | 20 | `20 * 256` | 中文文本(如:吸水时间(s)) | | 25 | `25 * 256` | 长文本或日期时间 | ## 行高设置 同样,行高也需要手动设置,单位是:**1/20点** ```csharp // 表头行高:20点 headerRow1.Height = 400; // 20 * 20 = 400 // 数据行高:19点 row.Height = 380; // 19 * 20 = 380 ``` ## 行高对照表 | 点数 | 代码 | 适用场景 | |------|------|----------| | 15 | `300` | 紧凑布局 | | 19 | `380` | 标准数据行 | | 20 | `400` | 表头行 | | 25 | `500` | 较大行高 | | 30 | `600` | 多行文本 | ## 完整示例 ```csharp // 创建表头行 IRow headerRow1 = sheet.CreateRow(0); headerRow1.Height = 400; // 20点高度 // 创建数据行 IRow dataRow = sheet.CreateRow(2); dataRow.Height = 380; // 19点高度 // 设置列宽 sheet.SetColumnWidth(0, 20 * 256); // 序号列:20字符 sheet.SetColumnWidth(1, 12 * 256); // 数据列:12字符 sheet.SetColumnWidth(2, 12 * 256); // ... 继续设置其他列 ``` ## 为什么不用AutoSizeColumn? `AutoSizeColumn()` 方法的问题: 1. **性能问题**:需要遍历所有单元格计算宽度 2. **中文支持差**:对中文字符的宽度计算不准确 3. **不可控**:无法精确控制列宽 4. **可能失败**:在某些情况下可能不起作用 ## 最佳实践 1. **手动设置列宽**:使用 `SetColumnWidth()` 而不是 `AutoSizeColumn()` 2. **统一宽度**:相同类型的列使用相同宽度 3. **适当留白**:宽度略大于内容,避免挤压 4. **测试验证**:导出后打开Excel文件验证效果 ## 调整建议 如果导出的表格列宽不合适,可以调整以下参数: ### 序号列太窄 ```csharp // 从 20 增加到 25 sheet.SetColumnWidth(0, 25 * 256); ``` ### 数据列太窄 ```csharp // 从 12 增加到 15 for (int i = 1; i <= 15; i++) { sheet.SetColumnWidth(i, 15 * 256); } ``` ### 数据列太宽 ```csharp // 从 12 减少到 10 for (int i = 1; i <= 15; i++) { sheet.SetColumnWidth(i, 10 * 256); } ``` ## 垂直对齐 同时设置垂直对齐,让内容居中显示: ```csharp ICellStyle style = workbook.CreateCellStyle(); style.Alignment = NPOIHorizontalAlignment.Center; // 水平居中 style.VerticalAlignment = VerticalAlignment.Center; // 垂直居中 ``` ## 效果验证 导出Excel后,应该看到: 1. **序号列**:宽度适中,中文完整显示 2. **数据列**:宽度一致,数值清晰可见 3. **表头**:高度适中,文字居中 4. **数据行**:高度统一,内容不拥挤 5. **整体布局**:美观大方,易于阅读 ## 常见问题 ### Q1: 为什么列宽单位是256? A: 这是Excel的内部单位,1个字符宽度 = 256个单位。 ### Q2: 如何计算合适的列宽? A: 根据内容长度估算,中文字符约占2个字符宽度。 ### Q3: 可以为不同列设置不同宽度吗? A: 可以,根据内容类型分别设置。 ### Q4: 行高设置为0会怎样? A: 行会被隐藏,不建议这样做。 ## 参考值 根据实际测试,以下是推荐的设置值: ```csharp // 液体吸收测试报告推荐设置 sheet.SetColumnWidth(0, 20 * 256); // 序号列 for (int i = 1; i <= 15; i++) { sheet.SetColumnWidth(i, 12 * 256); // 数据列 } // 行高设置 headerRow.Height = 400; // 表头:20点 dataRow.Height = 380; // 数据:19点 ``` 这些设置经过测试,能够提供良好的视觉效果和可读性。