Java 使用POI写入xlsx文件

Java 使用POI写入xlsx文件,java,excel,apache-poi,Java,Excel,Apache Poi,我有一个生成XSSF工作簿并用预算数据填充的应用程序。完成后,它会写出一个文件: try { FileOutputStream fileOut = new FileOutputStream("/path/to/my/file/myfilename.xlsx"); wb.write(fileOut); fileOut.close(); } catch (IOException ioe) { logger.error("Error writing spreadsheet", ioe); }

我有一个生成XSSF工作簿并用预算数据填充的应用程序。完成后,它会写出一个文件:

try {
 FileOutputStream fileOut = new FileOutputStream("/path/to/my/file/myfilename.xlsx");
 wb.write(fileOut);
 fileOut.close();
} catch (IOException ioe) {
 logger.error("Error writing spreadsheet", ioe);
}
到目前为止还不错。我正在使用Linux设备,但是输出是为Windows设备上的用户设计的,所以它必须是xlsx。工作簿按预期生成,当我在LibreOffice中打开它时,它看起来和我预期的完全一样。然后我将它发送给我的同事,当他们在Excel中打开它时,大多数单元格格式都消失了。具有货币格式的单元格只是原始数字。格式为百分比的单元格(大多数)只是原始数字

你知道我做错了什么吗?谢谢

其中一种单元格样式:

XSSFCellStyle percent = wb.createCellStyle();
percent.setDataFormat(wb.createDataFormat().getFormat("0.0%"));
稍后在此处使用:

header.createCell(cn).setCellValue("%");
sheet.setDefaultColumnStyle(cn, percent);
有很多这样的问题,但我怀疑我对其中一个做的任何错误都与所有这些问题是相同的,所以我只介绍一个,而不是200行


更新:在Targetman的建议下,我在创建每个单元格后尝试将样式设置为每个单元格。这很有效。谢谢你,特曼

我不确定为什么LibreOffice会以完整的格式打开它,因为当您使用时,文档说明它仅将格式应用于调用该方法后创建的单元格

POI将仅将此样式应用于添加到图纸中的新单元格


在创建单元格之前,请尝试调用
setDefaultColumnStyle
。让我们看看这是否解决了问题。

请显示应用Excel中未显示的单元格格式的代码。格式代码已添加到原始帖子中。您使用的是什么版本的Apache POI?如果它不是最新的,您是否尝试过升级?createCell用于列标题单元格。它下面的所有单元格都是在设置默认列样式后创建的。对不起,我应该更清楚一点——这是列标签。您是否尝试过在创建每个数据单元格时,使用
cell\setCellStyle
?@user3250532直接将单元格样式应用于它们?您不认为应该向上投票吗?