如何修复Apache POI生成XLSX在WPS中缺失字体的警告
问题:Apache POI生成的XLSX在Ubuntu WPS中弹出字体缺失警告
我使用Apache POI 5.2.3生成XLSX文件,代码如下:
XSSFFont font = createFont(workBook); font.setColor(IndexedColors.WHITE.getIndex()); font.setFontName("Arial"); font.setBold(true); XSSFColor BLUE_WAVE = new XSSFColor(new byte[]{ (byte) 60, (byte) 120, (byte) 216 }, new DefaultIndexedColorMap()); CellStyle style = workBook.createCellStyle(); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); style.setFillForegroundColor(BLUE_WAVE); style.setFont(createHeaderFont(workBook)); XSSFCell cell = row.createCell(cellIndex); cell.setCellType(cellType); cell.setCellStyle(style); // ... // 单元格数据填充逻辑 // ...
Gradle依赖配置:
implementation("org.apache.poi:poi:5.2.3") implementation("org.apache.poi:poi-ooxml:5.2.3")
文件生成过程无报错,且未使用公式或特殊字体,但在Ubuntu系统下用WPS Office打开时,弹出警告“部分公式符号因缺失Symbol、Windings等字体无法正确显示”。文件可正常加载,现需消除该警告。
解决方案
1. 检查并修复createHeaderFont方法
代码中定义了font变量却未使用,反而调用createHeaderFont(workBook)为样式设置字体。问题大概率出在这个自定义方法里:它可能默认使用了Symbol、Windings这类特殊字体,或者没有明确指定常规字体(如Arial)。修改该方法,确保创建的字体使用系统已有的常规字体,示例如下:
private XSSFFont createHeaderFont(XSSFWorkbook workBook) { XSSFFont font = workBook.createFont(); font.setColor(IndexedColors.WHITE.getIndex()); font.setFontName("Arial"); font.setBold(true); return font; }
2. 显式设置工作簿默认字体
Apache POI有时会自动引入特殊字体作为 fallback,显式设置默认字体可覆盖这个行为:
// 创建工作簿后设置默认样式 XSSFFont defaultFont = workBook.createFont(); defaultFont.setFontName("Arial"); defaultFont.setFontHeightInPoints((short)12); CellStyle defaultCellStyle = workBook.createCellStyle(); defaultCellStyle.setFont(defaultFont); workBook.setDefaultCellStyle(defaultCellStyle);
3. 清理冗余字体定义
生成的XLSX可能包含未被使用的特殊字体定义。可以通过以下方式排查:
- 将XLSX文件后缀改为ZIP,解压后打开
xl/styles.xml,检查<fonts>节点下是否存在Symbol、Windings等字体的定义,若未被任何样式引用,可直接删除这些条目。 - 用POI API遍历工作簿中的字体,移除未被样式关联的字体:
// 获取所有字体 List<XSSFFont> fonts = workBook.getFonts(); // 获取所有样式引用的字体ID Set<Integer> usedFontIds = new HashSet<>(); for (CellStyle style : workBook.getCellStyles()) { usedFontIds.add(style.getFontIndex()); } // 移除未使用的字体 Iterator<XSSFFont> iterator = fonts.iterator(); while (iterator.hasNext()) { XSSFFont font = iterator.next(); if (!usedFontIds.contains(font.getIndex())) { iterator.remove(); } }
4. 安装系统缺失字体
若上述方法均无效,可直接在Ubuntu系统安装缺失的微软字体:
sudo apt update sudo apt install ttf-mscorefonts-installer
安装完成后重启WPS,警告即可消失。
内容的提问来源于stack exchange,提问作者carlspring
相关产品推荐
相关产品推荐

