logo

Java Excel进阶:实现文字竖排与字体加粗的完整指南

作者:rousong2025.09.19 18:59浏览量:0

简介:本文深入探讨Java操作Excel时如何实现文字竖排与字体加粗,涵盖Apache POI和EasyExcel两种主流库的详细实现方案,并提供性能优化建议。

一、文字竖排的实现原理与方案

1.1 竖排文字的技术本质

Excel中的竖排文字本质是通过单元格旋转实现的文字方向控制,而非真正的垂直排列。每个单元格的文本方向可在0°(水平)到90°(垂直)之间调整,90°时呈现标准的竖排效果。

1.2 Apache POI实现方案

基础实现代码

  1. Workbook workbook = new XSSFWorkbook();
  2. Sheet sheet = workbook.createSheet("竖排示例");
  3. CellStyle style = workbook.createCellStyle();
  4. // 设置文本方向为90度(垂直)
  5. style.setRotation((short)90);
  6. // 设置自动换行(竖排时必须)
  7. style.setWrapText(true);
  8. Row row = sheet.createRow(0);
  9. Cell cell = row.createCell(0);
  10. cell.setCellValue("竖排文字示例");
  11. cell.setCellStyle(style);
  12. // 调整列宽以适应竖排
  13. sheet.setColumnWidth(0, 5*256); // 5个字符宽度

关键参数详解

  • setRotation()参数范围:
    • 0°:水平(默认)
    • 90°:垂直向上
    • 270°:垂直向下
    • 负值:反向旋转
  • setWrapText(true)必须设置,否则超长文本会显示不全

高级应用技巧

  1. 多列竖排对齐

    1. // 创建多个竖排单元格
    2. for(int i=0; i<5; i++){
    3. CellStyle vStyle = workbook.createCellStyle();
    4. vStyle.setRotation((short)90);
    5. vStyle.setWrapText(true);
    6. Row vRow = sheet.createRow(i);
    7. Cell vCell = vRow.createCell(0);
    8. vCell.setCellValue("列"+(i+1));
    9. vCell.setCellStyle(vStyle);
    10. }
  2. 混合排版处理
    ```java
    // 同一行中混合横排和竖排
    CellStyle hStyle = workbook.createCellStyle();
    hStyle.setAlignment(HorizontalAlignment.CENTER);

Row mixedRow = sheet.createRow(5);
Cell hCell = mixedRow.createCell(0);
hCell.setCellValue(“横排标题”);
hCell.setCellStyle(hStyle);

Cell vCell = mixedRow.createCell(1);
vCell.setCellValue(“竖排内容”);
vCell.setCellStyle(style); // 使用之前创建的竖排样式

  1. ## 1.3 EasyExcel实现方案
  2. ```java
  3. // 定义竖排样式
  4. WriteCellStyle verticalStyle = new WriteCellStyle();
  5. verticalStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
  6. verticalStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  7. // EasyExcel暂不支持直接设置旋转角度,需结合POI处理
  8. // 实际开发中建议混合使用:
  9. // 1. 用EasyExcel处理大数据量
  10. // 2. 用POI进行样式微调

二、字体加粗的实现方法

2.1 基础加粗实现

Apache POI方案

  1. Font boldFont = workbook.createFont();
  2. boldFont.setBold(true);
  3. boldFont.setFontName("宋体");
  4. boldFont.setFontHeightInPoints((short)12);
  5. CellStyle boldStyle = workbook.createCellStyle();
  6. boldStyle.setFont(boldFont);
  7. Cell boldCell = row.createCell(1);
  8. boldCell.setCellValue("加粗文本");
  9. boldCell.setCellStyle(boldStyle);

EasyExcel方案

  1. // 定义加粗样式
  2. WriteFont boldWriteFont = new WriteFont();
  3. boldWriteFont.setBold(true);
  4. boldWriteFont.setFontName("微软雅黑");
  5. WriteCellStyle boldWriteStyle = new WriteCellStyle();
  6. boldWriteStyle.setWriteFont(boldWriteFont);
  7. // 在写数据时应用
  8. List<List<String>> data = new ArrayList<>();
  9. data.add(Arrays.asList("正常文本", "加粗文本"));
  10. ExcelWriter excelWriter = EasyExcel.write("加粗示例.xlsx")
  11. .registerWriteHandler(new AbstractColumnWidthStyleStrategy() {
  12. @Override
  13. protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
  14. writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), 20*256);
  15. }
  16. })
  17. .build();
  18. WriteSheet writeSheet = EasyExcel.writerSheet("加粗示例")
  19. .head(head)
  20. .build();
  21. // 自定义单元格样式处理器
  22. excelWriter.write(data, writeSheet);
  23. excelWriter.finish();

2.2 高级样式组合

同时设置竖排和加粗

  1. // 创建竖排加粗样式
  2. CellStyle verticalBoldStyle = workbook.createCellStyle();
  3. verticalBoldStyle.setRotation((short)90);
  4. verticalBoldStyle.setWrapText(true);
  5. Font verticalBoldFont = workbook.createFont();
  6. verticalBoldFont.setBold(true);
  7. verticalBoldFont.setFontName("黑体");
  8. verticalBoldStyle.setFont(verticalBoldFont);
  9. Cell vbCell = row.createCell(2);
  10. vbCell.setCellValue("竖排加粗");
  11. vbCell.setCellStyle(verticalBoldStyle);

条件格式加粗

  1. // 创建条件格式规则
  2. SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
  3. ConditionalFormattingRule rule = sheetCF.createConditionalFormattingRule(
  4. ComparisonOperator.GT, "50"); // 大于50的单元格
  5. FontFormatting fontFmt = rule.createFontFormatting();
  6. fontFmt.setBold(true);
  7. fontFmt.setFontColorIndex(IndexedColors.RED.getIndex());
  8. CellRangeAddress[] regions = {
  9. new CellRangeAddress(0, 10, 0, 0) // 应用到A1:A11
  10. };
  11. sheetCF.addConditionalFormatting(regions, rule);

三、性能优化建议

3.1 样式复用策略

  1. // 错误方式:每个单元格创建新样式
  2. for(int i=0; i<1000; i++){
  3. CellStyle badStyle = workbook.createCellStyle();
  4. // 设置样式...
  5. }
  6. // 正确方式:预先创建样式库
  7. Map<String, CellStyle> styleLibrary = new HashMap<>();
  8. // 创建基础加粗样式
  9. CellStyle baseBold = workbook.createCellStyle();
  10. Font boldFont = workbook.createFont();
  11. boldFont.setBold(true);
  12. baseBold.setFont(boldFont);
  13. styleLibrary.put("BOLD", baseBold);
  14. // 创建竖排加粗样式
  15. CellStyle verticalBold = workbook.createCellStyle();
  16. verticalBold.setRotation((short)90);
  17. verticalBold.setWrapText(true);
  18. verticalBold.setFont(boldFont); // 复用字体
  19. styleLibrary.put("VERTICAL_BOLD", verticalBold);

3.2 大数据量处理技巧

  1. 分批次处理
    ```java
    // 处理10万行数据时,每次处理1000行
    int totalRows = 100000;
    int batchSize = 1000;

for(int i=0; i> batchData = getDataBatch(i, batchSize);
// 处理当前批次…
}

  1. 2. **使用SXSSFWorkbook**(Apache POI):
  2. ```java
  3. // 创建流式工作簿,内存中只保留100行
  4. SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(100);
  5. Sheet sxssfSheet = sxssfWorkbook.createSheet("流式处理");
  6. // 写入数据...
  7. // 自动将超过100行的数据写入临时文件

四、常见问题解决方案

4.1 竖排文字显示不全

问题原因

  • 未设置setWrapText(true)
  • 列宽不足
  • 单元格高度不够

解决方案

  1. // 综合设置
  2. CellStyle fixedStyle = workbook.createCellStyle();
  3. fixedStyle.setRotation((short)90);
  4. fixedStyle.setWrapText(true);
  5. // 调整列宽和行高
  6. sheet.setColumnWidth(0, 15*256); // 15个字符宽度
  7. Row fixedRow = sheet.createRow(0);
  8. fixedRow.setHeightInPoints(100); // 100磅高度

4.2 加粗样式不生效

可能原因

  • 字体未正确关联到样式
  • 使用了不支持的字体
  • 样式被后续操作覆盖

排查步骤

  1. 检查字体是否设置setBold(true)
  2. 确认样式是否正确应用到单元格
  3. 检查是否有其他样式处理器覆盖了设置

五、最佳实践总结

  1. 样式管理

    • 预先创建常用样式库
    • 避免在循环中创建新样式
    • 使用枚举或常量管理样式名称
  2. 性能优化

    • 大数据量使用SXSSF或EasyExcel
    • 关闭不必要的格式验证
    • 合理设置内存缓存大小
  3. 兼容性处理

    • 检查Excel版本兼容性
    • 处理不同字体在不同系统上的显示差异
    • 测试竖排在Excel移动端的显示效果
  4. 代码组织建议

    1. // 样式工厂模式示例
    2. public class ExcelStyleFactory {
    3. private Workbook workbook;
    4. private Map<StyleType, CellStyle> styleCache;
    5. public enum StyleType {
    6. BOLD, VERTICAL, VERTICAL_BOLD, HEADER
    7. }
    8. public ExcelStyleFactory(Workbook workbook) {
    9. this.workbook = workbook;
    10. this.styleCache = new HashMap<>();
    11. initializeStyles();
    12. }
    13. private void initializeStyles() {
    14. // 初始化所有样式...
    15. }
    16. public CellStyle getStyle(StyleType type) {
    17. return styleCache.get(type);
    18. }
    19. }

通过系统掌握上述技术要点,开发者可以高效实现Java操作Excel时的文字竖排和字体加粗需求,同时保证代码的可维护性和性能。实际开发中,建议结合具体业务场景选择最适合的实现方案,并在关键环节添加充分的异常处理和日志记录。

相关文章推荐

发表评论