أنماط قيمة الخلية السلبية في أباتشي POI
-
06-09-2019 - |
سؤال
باستخدام Apache PoI لإنشاء مستند واجهت مشكلة صغيرة في أنماط الخلايا، جاري currentlly أنا أستخدم:
CellStyle currencyCellStyle=workbook.createCellStyle();
currencyCellStyle.setDataFormat(format.getFormat("$#,##0.00"));
والتي تعمل بشكل جيد تماما للأرقام الإيجابية، ومع ذلك، أود تعيين نمط مختلف للخلايا السلبية تلقائيا.
السؤال هو أن هناك أي لضبط هذا الأمر دون الحاجة إلى التحقق من قيم الخلايا الفردية وتعيين نمط منفصل لهم؟
أو بدلا من ذلك، هناك أي طريقة لإخبار Apache POI باستخدام تنسيق عملة Excel المدمج بأحد خياراتها السلبية؟
المحلول
وجدت ذلك، شكرا لي: د
CellStyle currencyCellStyle=workbook.createCellStyle();
currencyCellStyle.setDataFormat(format.getFormat("$#,##0.00;[Red]($#,##0.00)"));
نصائح أخرى
لماذا ترفض POI دعم الخيار الأول في تنسيق العملة Excel هو خارجي!
لا أحب استخدام DeCilsFormat للعملة لأن قيمة خلية النهاية الخاصة بك تصبح غير رقمية مع مقدمة رمز العملة. أثناء العمل في مؤسسة مالية كبرى، تم تكليفي بحل مشكلة التنسيق هذه. الفكرة الأساسية لهذا التغيير هي، لأن 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!!!");
}
}
}