Различное форматирование одних и тех же полей в разных версиях Excel (2003 и 2010) - PullRequest
0 голосов
/ 12 сентября 2018


У меня проблемы с форматированием ряда полей в файле Excel.
Позвольте мне объяснить, в моем приложении RCP (да, я знаю, что оно устарело, но это так), я должен отформатировать серию полей в файле Excel, состоящем из нескольких листов. Я заметил, что на третьем листе есть поля, в частности две числовые суммы и дата, которые правильно отформатированы, только если я открываю Excel с версией 2003. Если я использую версию 2010 года, поля отформатированы неправильно. Ниже я показываю строки кода Java, полезные для добавления полей в Excel. Тот же метод creatSheet повторяется для каждого листа (каждый лист соответствует объекту, называемому detail ).

private void createSheet(final DetailComplesso detail) {
   this.addDate(detail.getDataRif(), this.addLabelRiepilogo("Data Valutazione", sheet, rowIndex++), col, false);
   this.addImporto(detail.getFairValue(), this.addLabelRiepilogo("Fair Value", sheet, rowIndex++), col, false);
   this.addImporto(detail.getFairValueClean(), this.addLabelRiepilogo("Fair Value Clean", sheet, rowIndex++), col, false);
}

private void addDate(final Date value, final HSSFRow row, final int cellNumber, final boolean colorBackground) {
    HSSFCell cell = row.createCell(cellNumber);
    if (value != null) {
        cell.setCellValue(value);
    }
    cell.setCellStyle(colorBackground ? this.styles.dateGrey25 : this.styles.date);
}

private void addImporto(final BigDecimal value, final HSSFRow row, final int cellNumber, final boolean colorBackground) {
    HSSFCell cell = row.createCell(cellNumber);
    if (value != null) {
        final Number numberValue = value;
        final double doubleValue = numberValue.doubleValue();
        cell.setCellValue(doubleValue);
    }
    cell.setCellStyle(colorBackground ? this.styles.importoGrey25 : this.styles.importo);
}

А это класс стиля

    private class Styles {

    private HSSFCellStyle section, titleCenter, titleLeft, string, date, importo, inte, intege, tasso, dec2, dec5, dec6, dec7, dec8, inteGrey25, integeGrey25, stringGrey25, dateGrey25,
            importoGrey25, tassoGrey25, dec2Grey25, dec5Grey25, dec6Grey25, dec7Grey25, dec8Grey25;

    public Styles(final HSSFWorkbook wb) {
        HSSFCellStyle style = this.section = wb.createCellStyle();
        HSSFFont font = wb.createFont();
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        font.setFontHeightInPoints((short) 16);
        style.setFont(font);

        style = this.titleCenter = wb.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        font = wb.createFont();
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        style.setFont(font);

        style = this.titleLeft = wb.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_LEFT);
        font = wb.createFont();
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        style.setFont(font);

        style = this.string = wb.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        style = this.date = wb.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        HSSFDataFormat dataFormat = wb.createDataFormat();
        style.setDataFormat(dataFormat.getFormat("dd/MM/yyyy"));

        style = this.inte = wb.createCellStyle();
        dataFormat = wb.createDataFormat();
        style.setDataFormat(dataFormat.getFormat("#,##0"));
        style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);

        style = this.intege = wb.createCellStyle();
        dataFormat = wb.createDataFormat();
        style.setDataFormat(dataFormat.getFormat("###0"));
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        style = this.importo = wb.createCellStyle();
        dataFormat = wb.createDataFormat();
        style.setDataFormat(dataFormat.getFormat("#,##0.00"));
        style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);

        style = this.tasso = wb.createCellStyle();
        dataFormat = wb.createDataFormat();
        style.setDataFormat(dataFormat.getFormat("#,##0.000000"));

        style = this.dec2 = wb.createCellStyle();
        dataFormat = wb.createDataFormat();
        style.setDataFormat(dataFormat.getFormat("#,##0.00"));
        style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);

        style = this.dec5 = wb.createCellStyle();
        dataFormat = wb.createDataFormat();
        style.setDataFormat(dataFormat.getFormat("#,##0.00000"));
        style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);

        style = this.dec6 = wb.createCellStyle();
        dataFormat = wb.createDataFormat();
        style.setDataFormat(dataFormat.getFormat("#,##0.000000"));
        style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);

        style = this.dec7 = wb.createCellStyle();
        dataFormat = wb.createDataFormat();
        style.setDataFormat(dataFormat.getFormat("#,##0.0000000"));
        style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);

        style = this.dec8 = wb.createCellStyle();
        dataFormat = wb.createDataFormat();
        style.setDataFormat(dataFormat.getFormat("#,##0.00000000"));
        style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);

        style = this.stringGrey25 = wb.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

        style = this.dateGrey25 = wb.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        dataFormat = wb.createDataFormat();
        style.setDataFormat(dataFormat.getFormat("dd/MM/yyyy"));
        style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

        style = this.integeGrey25 = wb.createCellStyle();
        dataFormat = wb.createDataFormat();
        style.setDataFormat(dataFormat.getFormat("###0"));
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

        style = this.inteGrey25 = wb.createCellStyle();
        dataFormat = wb.createDataFormat();
        style.setDataFormat(dataFormat.getFormat("#,##0"));
        style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
        style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

        style = this.importoGrey25 = wb.createCellStyle();
        dataFormat = wb.createDataFormat();
        style.setDataFormat(dataFormat.getFormat("#,##0.00"));
        style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
        style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

        style = this.tassoGrey25 = wb.createCellStyle();
        dataFormat = wb.createDataFormat();
        style.setDataFormat(dataFormat.getFormat("#,##0.000000"));
        style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

        style = this.dec2Grey25 = wb.createCellStyle();
        dataFormat = wb.createDataFormat();
        style.setDataFormat(dataFormat.getFormat("#,##0.00"));
        style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
        style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

        style = this.dec5Grey25 = wb.createCellStyle();
        dataFormat = wb.createDataFormat();
        style.setDataFormat(dataFormat.getFormat("#,##0.00000"));
        style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
        style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

        style = this.dec6Grey25 = wb.createCellStyle();
        dataFormat = wb.createDataFormat();
        style.setDataFormat(dataFormat.getFormat("#,##0.000000"));
        style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
        style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

        style = this.dec7Grey25 = wb.createCellStyle();
        dataFormat = wb.createDataFormat();
        style.setDataFormat(dataFormat.getFormat("#,##0.0000000"));
        style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
        style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

        style = this.dec8Grey25 = wb.createCellStyle();
        dataFormat = wb.createDataFormat();
        style.setDataFormat(dataFormat.getFormat("#,##0.00000000"));
        style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
        style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
    }
}

В версии 2003 года я получаю 2.345,65 для чисел и 30/06/2018 для даты. Кроме того, с версии 2010 я получаю 2345,65 для чисел и 43281,00 для даты.
если это может быть полезно, это список полезных импортов для создания Excel:

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

Мой реальный вопрос: действительно ли возможно, что результат форматирования изменяется в соответствии с версией Excel? и если да, то как я могу решить эту проблему? Я не могу знать, какую версию Excel будет использовать конечный пользователь ...

Заранее спасибо,
прощай

...