You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:45:14