Pregunta

El uso de Apache POI para generar un documento y estoy teniendo un pequeño problema con los estilos de celda, currentlly que estoy usando:

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

Lo que funciona totalmente bien para los números positivos, sin embargo me gustaría asignar un estilo diferente a las células negativas de forma automática.

La pregunta es ¿hay alguna Para hacer esto sin tener que comprobar los valores de las celdas individuales y asignar un estilo distinto a ellos?

O, alternativamente, ¿hay alguna manera de decirle a Apache POI utilizar el construido en el formato de moneda de Excel con una de sus opciones negativas?

¿Fue útil?

Solución

Lo encontré, me da las gracias: D

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

Otros consejos

¿Por qué poi se niega a apoyar la primera opción en el formato de moneda Excel está más allá de mí! introducir descripción de la imagen aquí

No me gusta usar el DecimalFormat para la moneda debido a que su valor final se convierte en una célula no numérico con la introducción del símbolo de moneda. Mientras trabajaba para una importante institución financiera, que tenía la tarea de resolver este problema de formato. La idea central de este cambio es, porque PDI se niega a ser razonables y tienen un amplio soporte de opciones nativas de Excel, que se infiltrará en su código y cambiar sus valores en el núcleo. La siguiente es mi Solución:

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!!!");
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top