Стили отрицательного значения ячейки в Apache POI

Использование Apache POI для создания документа, и у меня небольшая проблема со стилями ячеек, в настоящее время я использую:

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

Что отлично работает для положительных чисел, однако я хотел бы автоматически назначить другой стиль отрицательным ячейкам.

Вопрос в том, можно ли это настроить без необходимости проверять значения отдельных ячеек и назначать им отдельный стиль?

Или, альтернативно, есть ли способ указать Apache POI использовать встроенный формат валюты Excel с одним из его отрицательных параметров?


person Galbrezu    schedule 29.05.2009    source источник


Ответы (2)


Нашел, спасибо: D

CellStyle currencyCellStyle=workbook.createCellStyle();
currencyCellStyle.setDataFormat(format.getFormat("$#,##0.00;[Red]($#,##0.00)"));
person Galbrezu    schedule 29.05.2009

Почему пои ОТКАЗЫВАЕТСЯ поддерживать ПЕРВЫЙ вариант в форматировании валюты Excel, мне непонятно! введите описание изображения здесь

Мне не нравится использовать 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!!!");
        }
    }
}
person rheaghen    schedule 22.10.2018