Стили отрицательных значений ячеек в Apache POI - PullRequest
0 голосов
/ 29 мая 2009

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

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 29 мая 2009

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

CellStyle currencyCellStyle=workbook.createCellStyle();
currencyCellStyle.setDataFormat(format.getFormat("$#,##0.00;[Red]($#,##0.00)"));
0 голосов
/ 22 октября 2018

Почему poi ОТКАЗЫВАЕТСЯ от поддержки опции FIRST в формате Excel, мне не подходит! enter image description here

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