180 lines
4.3 KiB
Plaintext
180 lines
4.3 KiB
Plaintext
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点
|
||
```
|
||
|
||
这些设置经过测试,能够提供良好的视觉效果和可读性。
|