0

使用 Apache POI 生成文档,我在单元格样式方面遇到了一个小问题,目前我正在使用:

CellStyle currencyCellStyle=workbook.createCellStyle();
currencyCellStyle.setDataFormat(format.getFormat("$#,##0.00"));

这对于正数完全适用,但是我想自动为负单元格分配不同的样式。

问题是否有任何设置而无需检查单个单元格值并为它们分配单独的样式?

或者,有什么方法可以告诉 Apache POI 使用内置的 excel 货币格式及其负面选项之一?

4

2 回答 2

6

找到了,谢谢 :D

CellStyle currencyCellStyle=workbook.createCellStyle();
currencyCellStyle.setDataFormat(format.getFormat("$#,##0.00;[Red]($#,##0.00)"));
于 2009-05-29T15:01:29.393 回答
0

为什么 poi 拒绝支持 excel 货币格式中的 FIRST 选项超出了我的理解!在此处输入图像描述

我不喜欢将 DecimalFormat 用于货币,因为您的最终单元格值在引入货币符号后变为非数字。在为一家大型金融机构工作时,我的任务是解决此格式问题。这个变化的核心思想是,因为 POI 拒绝合理并且对 Excel 的原生选项有全面的支持,我会渗透到他们的代码中,并在核心上改变他们的价值观。以下是我的解决方法:

private static final String CURRENCY_FORMAT_OVERRIDE = "\"$\"#,##0.00_);-\"$\"#,##0.00";
private static final String CURRENCY_FORMAT_TARGET = "\"$\"#,##0.00_);(\"$\"#,##0.00)";    

static { // static class level initializer
    Field field = org.apache.poi.ss.usermodel.BuiltinFormats.class.getDeclaredField("_formats");            
    field.setAccessible(true);
    String[] _formats = (String[])field.get(new org.apache.poi.ss.usermodel.BuiltinFormats());
    for(int i = 0; i < _formats.length; ++i) {
        if(_formats[i].equals(CURRENCY_FORMAT_TARGET)) {
            _formats[i]=CURRENCY_FORMAT_OVERRIDE;
            System.out.println("TAKE THAT, POI!!!");
        }
    }
}
于 2018-10-22T17:15:38.117 回答