سؤال

باستخدام 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 هو خارجي! enter image description here

لا أحب استخدام 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!!!");
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top