POI Excel列宽设置

1. Excel列宽单位概述

POI中Sheet列宽是通过字符个数来确定的,列宽单位为一个字符宽度的1/256
每列可以显示的最大字符数为255

// 设置默认列宽,width为字符个数
sheet.setDefaultColumnWidth(int width)

// 设置第columnIndex+1列的列宽,单位为字符宽度的1/256
sheet.setColumnWidth(int columnIndex, int width)
// 设置第5列的列宽为20个字符宽度
sheet.setColumnWidth(4, 20*256)

2. 列实际显示字符个数

setColumnWidth(int columnIndex, int width)设置的宽度包括4像素的边距填充(每侧两个),加上网格线的1像素填充。

如果字符宽度为w像素, w单位为一个字符宽度的1/256,设置列宽字符个数为count,则实际可见字符数X:
    X * (w * 256) + 5 = count * (w * 256) 
转换公式:
    X = count - 5/w
可见实际可见字符数比设置字符数略小

字符宽度大小为多少?

  • 使用默认字体Font(Workbook中定义的第一个字体)渲染数字0,1,2,3,4,5,6,7,8,9,其中宽度最大的作为字符宽度
  • 如果使用非常特殊的字体,默认数字为0,默认渲染字体为Arial(HSSF)和Calibri(XSSF)
以Calibri字体为例,11点字体大小的最大数字宽度为7像素(96 dpi),如果将列宽设置为8个字符宽。则实际可见字符数(Excel中显示值):
   X = count - 5/w = 8 - 5/7 = 7.29
则该列实际只能显示7.29个字符,第8个字符被遮盖部分

3. 实例

package hssf.sheet;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.WorkbookUtil;

public class ExportSetColWidth {


    public static void main(String[] args) throws IOException {
        File file = new File("C:\\Users\\Administrator\\Desktop\\test.xls");
        if (file.exists()) {
            file.delete();
        }
        BufferedOutputStream out = null;
        try {
            out = new BufferedOutputStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\test.xls"));
            exportExcel(out);
        } finally {
            out.close();
        }
    }

    private static void exportExcel(BufferedOutputStream out) throws IOException {
        Workbook workbook = new HSSFWorkbook();
        // 格式化Sheet名,使其合法
        String safeSheetName = WorkbookUtil.createSafeSheetName("设置列宽");
        Sheet sheet = workbook.createSheet(safeSheetName);

        sheet.setDefaultColumnWidth(4);
        sheet.setColumnWidth(4, 20*256);
        sheet.setColumnWidth(5, 25*256);
        sheet.setColumnWidth(6, 30*256);
        sheet.setColumnWidth(7, 35*256);

        Row row0 = sheet.createRow(0);
        row0.createCell(4).setCellValue("列宽: 20个字符宽");
        row0.createCell(5).setCellValue("列宽: 25个字符宽");
        row0.createCell(6).setCellValue("列宽: 30个字符宽");
        row0.createCell(7).setCellValue("列宽: 35字符宽");

        workbook.write(out);
    }

}

这里写图片描述

当你在使用Apache POI库操作Excel文件时,可能会遇到设置后内容并未自动居中的情况。这通常是因为POI本身并不直接提供自动居中的功能,你需要手动调整单元格的水平对齐方式。以下是步骤: 1. **获取工作表和行数据**:首先通过`HSSFWorkbook`和`Sheet`对象获取到你要操作的工作表。 ```java HSSFWorkbook workbook = new HSSFWorkbook(); Sheet sheet = workbook.getSheetAt(0); // 获取第一张工作表 Row row = sheet.getRow(yourRowIndex); // yourRowIndex是你想要设置的行索引 ``` 2. **获取单元格**:找到对应的单元格,并获取引用。 ```java Cell cell = row.getCell(cellIndex); // cellIndex是对应的索引 ``` 3. **设置**:使用`setColumnWidth()`方法设置度。 ```java int widthInPixels = 8; // 自定义,单位为像素 sheet.setColumnWidth(cell.getColumnIndex(), widthInPixels * 256); // 乘以256转换为1/256英寸 ``` 4. **手动设置水平对齐方式**:然后使用`DataFormat`和`HorizontalAlignment`来设置对齐方式。 ```java DataFormat df = DataFormat.getFactory().createDataFormat(); cell.setCellStyle(df.createCustomStyle()); CellStyle style = cell.getCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); cell.setCellStyle(style); ``` 请注意,这里我们设置了单元格样式为居中,但实际效果可能因为字体、边距等因素影响而并非绝对居中。如果需要精确控制居中,可以尝试修改其他样式属性。 如果你的问题依然存在,可能是由于单元格的默认样式或者某些隐藏设置导致的,检查一下是否还有其他的样式影响了单元格的显示。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值