Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Мне не нравится использовать DecimalFormat для currency, потому что значение вашей конечной ячейки становится нечисловым с введением символа валюты.Во время работы в крупном финансовом учреждении мне было поручено решить эту проблему с форматированием.Основная идея этого изменения заключается в том, что, поскольку 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!!!");
        }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top