Contents

Apache POI 更改单元字体样式

1.简介

Apache POI 是一个开源库,供软件开发人员创建和操作 Microsoft Office 文档 。除其他功能外,它还允许开发人员以编程方式更改文档格式。

在本文中,我们将讨论在使用名为CellStyle的类时如何在 Microsoft Excel 中更改单元格的样式。也就是说,使用这个类,我们可以编写代码来修改Microsoft Excel 文档中单元格的样式。首先,它是 Apache POI 库提供的一项功能,允许在工作簿中创建具有多种格式属性的样式。其次,可以将样式应用于该工作簿中的多个单元格。

除此之外,我们还将了解使用CellStyle类的常见缺陷。

2. Apache POI 和 Maven 依赖

让我们将Apache POI 作为依赖项添加到我们的项目pom.xml 文件中:

<dependency>
    <groupId>org.apache.poi</groupId> 
    <artifactId>poi</artifactId> 
    <version>5.2.0</version> 
</dependency>

3. 创建CellStyle

让我们从实例化CellStyle开始:

Workbook workbook = new XSSFWorkbook(fileLocation);
CellStyle cellStyle = wb.createCellStyle();

接下来,设置好所需的格式化属性。例如,下面的代码会将其设置为日期格式:

cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("m/d/yy h:mm"));

最重要的是,我们可以设置CellStyle的多个格式属性来获得所需的样式组合。例如,我们将以下代码应用于同一个CellStyle对象。因此,它具有日期格式样式以及居中对齐的文本样式:

cellStyle.setAlignment(HorizontalAlignment.CENTER);

请注意,CellStyle有几个我们可以修改的格式属性

属性 描述
DataFormat 单元格的数据格式,例如日期
Alignment 单元格的水平对齐类型
Hidden 是否要隐藏单元格
Indention 用于缩进单元格中文本的空格数
BorderBottomBorderLeftBorderRightBorderTop 用于单元格的底部、左侧、右侧和顶部边框的边框类型
Font 此样式的字体属性,例如字体颜色

稍后我们将在使用Font属性更改字体样式时再次查看它。

4. 使用CellStyle格式化字体

CellStyleFont属性是我们设置字体相关格式的地方。例如,我们可以设置字体名称、颜色和大小。我们可以设置字体是粗体还是斜体。Font的两个属性都可以是truefalse。我们还可以将下划线样式设置为:

属性
U_NONE 没有下划线的文字
U_SINGLE 单下划线文本,其中只有单词带下划线
U_SINGLE_ACCOUNTING 几乎整个单元格宽度都带有下划线的单个下划线文本
U_DOUBLE 双下划线文本,其中只有单词带下划线
U_DOUBLE_ACCOUNTING 双下划线文本,几乎整个单元格宽度都带有下划线

让我们从前面的例子继续。我们将编写一个名为CellStyler的类,其中包含一个为警告文本创建样式的方法:

public class CellStyler {
    public CellStyle createWarningColor(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        Font font = workbook.createFont();
        font.setFontName("Courier New");
        font.setBold(true);
        font.setUnderline(Font.U_SINGLE);
        font.setColor(HSSFColorPredefined.DARK_RED.getIndex());
        style.setFont(font);
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        return style;
    }
}

现在,让我们创建一个 Apache POI 工作簿并获取第一个工作表:

Workbook workbook = new XSSFWorkbook(fileLocation);
Sheet sheet = workbook.getSheetAt(0);

请注意,我们正在设置行高,以便我们可以看到文本对齐的效果

Row row1 = sheet.createRow(0);
row1.setHeightInPoints((short) 40);

让我们实例化该类并使用它来设置样式

CellStyler styler = new CellStyler();
CellStyle style = styler.createWarningColor(workbook);
Cell cell1 = row1.createCell(0);
cell1.setCellStyle(style);
cell1.setCellValue("Hello");
Cell cell2 = row1.createCell(1);
cell2.setCellStyle(style);
cell2.setCellValue("world!");

现在,让我们将此工作簿保存到一个文件中,并在 Microsoft Excel 中打开该文件以查看字体样式效果,我们应该在其中看到:

/uploads/apache_poi_change_cell_font/1.png

5. 常见的陷阱

让我们看看使用CellStyle 时常犯的两个错误。

5.1. 意外修改所有单元格样式

首先,从单元格中获取CellStyle并开始修改它是一个常见的错误。getCellStyle方法的 Apache POI 文档提到单元格的getCellStyle方法将始终返回非空值。这意味着单元格有一个默认值,这也是工作簿中所有单元格最初使用的默认样式。因此,下面的代码将使所有单元格都具有日期格式:

cell.setCellValue(rdf.getEffectiveDate());
cell.getCellStyle().setDataFormat(HSSFDataFormat.getBuiltinFormat("d-mmm-yy"));

5.2. 为每个单元格创建新样式

另一个常见的错误是工作簿中有太多相似的样式:

CellStyle style1 = codeToCreateCellStyle();
Cell cell1 = row1.createCell(0);
cell1.setCellStyle(style1);
CellStyle style2 = codeToCreateCellStyle();
Cell cell2 = row1.createCell(1);
cell2.setCellStyle(style2);

一个CellStyle的范围是一个工作簿。因此,多个单元格应共享类似的样式。在上面的示例中,样式应该只创建一次并在cell1cell2之间共享:

CellStyle style1 = codeToCreateCellStyle();
Cell cell1 = row1.createCell(0);
cell1.setCellStyle(style1);
cell1.setCellValue("Hello");
Cell cell2 = row1.createCell(1);
cell2.setCellStyle(style1);
cell2.setCellValue("world!");