Files
NonWovenFabric/WindowsFormsApp6/Excel导出列宽设置说明.txt

180 lines
4.3 KiB
Plaintext
Raw Normal View History

2025-12-31 09:43:35 +08:00
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点
```
这些设置经过测试,能够提供良好的视觉效果和可读性。