1. 概述

Apache POI 是一个流行的 Java API,用于程序化操作不同类型的 Microsoft Office 文档,如 WordExcelPowerPoint

在创建供人们阅读的电子表格时,我们经常需要扩展列宽。这有助于读者更好地可视化列中的内容,这是默认列宽无法实现的。

在这个教程中,我们将学习如何使用 API 手动和自动调整 Excel 表格中的列宽。

2. 依赖项

首先,我们需要在 Maven 的 pom.xml 中添加以下 Apache POI 的依赖:

<dependency> 
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId> 
    <version>5.2.5</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.poi</groupId> 
    <artifactId>poi-ooxml</artifactId> 
    <version>5.2.5</version> 
</dependency>

3. 表格准备

让我们先复习一下如何创建 Excel 表格。我们将准备一个 Excel 表格,并填充一些数据以供演示:

Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("NewSheet");

Row headerRow = sheet.createRow(0);
Cell headerCell1 = headerRow.createCell(0);
headerCell1.setCellValue("Full Name");
Cell headerCell2 = headerRow.createCell(1);
headerCell2.setCellValue("Abbreviation");

Row dataRow = sheet.createRow(1); 
Cell dataCell1 = dataRow.createCell(0);
dataCell1.setCellValue("Java Virtual Machine"); 
Cell dataCell2 = dataRow.createCell(1);
dataCell2.setCellValue("JVM");

// More data rows created here...

现在,如果我们用 Excel 打开生成的表格,我们会看到每个列都有相同的默认宽度:
poi 默认列宽
显然,由于列宽限制,1st 列的内容被截断了。

4. 宽度调整

Apache POI 提供了两种不同的方法来调整列宽。我们可以根据自己的需求选择其中一种。现在让我们一起探索这两种方法。

4.1. 固定宽度调整

我们可以通过在目标 Sheet 实例上调用 setColumnWidth() 来将特定列扩展到固定宽度。 这个方法有两个参数:columnIndexwidth

手动精确计算显示所有内容所需的列宽比较复杂,因为它取决于诸如字体类型和字号等因素。 根据 API 文档 的定义,width 参数是以字符宽度的 1/256 为单位的。

考虑到 Excel 中默认的 Calibri 字体和字号 11,我们可以粗略地使用单元格中的字符数乘以 256 来估算列宽:

String cellValue = row.getCell(0).getStringCellValue();
sheet.setColumnWidth(0, cellValue.length() * 256);

调整后,1st 列的内容将完全显示:
poi 固定宽度列

手动计算列宽确实有些繁琐,特别是当处理包含大量数据行的表格时。我们必须遍历每一行来找出最大字符计数。不同字体和字号的列会增加宽度计算的复杂性。

4.2. 自动宽度调整

幸运的是,Apache POI 提供了一个方便的方法 autoSizeColumn() 来自动调整列宽。 这确保了列中的内容对读者完全可见。

autoSizeColumn() 方法只需要一个参数 column,它是零基列索引。我们可以使用以下代码来自动调整 1st 列的列宽:

sheet.autoSizeColumn(0);

如果我们对每个列都应用 autoSizeColumn(),所有列的内容都将完全可见,没有截断:
poi 自动调整列宽

5. 总结

在这篇文章中,我们探讨了在 Apache POI 中调整 Excel 表格列宽的两种不同方法:固定宽度调整和自动宽度调整。调整列宽对于提高可读性和创建用户友好的 Excel 表格至关重要。

如往常一样,文章的源代码可在 GitHub 上找到。