У меня проблемы с форматированием ряда полей в файле 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 будет использовать конечный пользователь ...
Заранее спасибо,
прощай