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 | 用于缩进单元格中文本的空格数 |
BorderBottom,BorderLeft,BorderRight,BorderTop | 用于单元格的底部、左侧、右侧和顶部边框的边框类型 |
Font | 此样式的字体属性,例如字体颜色 |
稍后我们将在使用Font属性更改字体样式时再次查看它。
4. 使用CellStyle格式化字体
CellStyle的Font属性是我们设置字体相关格式的地方。例如,我们可以设置字体名称、颜色和大小。我们可以设置字体是粗体还是斜体。Font的两个属性都可以是true或false。我们还可以将下划线样式设置为:
值 | 属性 |
---|---|
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 中打开该文件以查看字体样式效果,我们应该在其中看到:
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的范围是一个工作簿。因此,多个单元格应共享类似的样式。在上面的示例中,样式应该只创建一次并在cell1和cell2之间共享:
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!");