Стили отрицательных значений ячеек в Apache POI
-
06-09-2019 - |
Вопрос
Используя 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, мне непонятно!
Мне не нравится использовать 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!!!");
}
}
}