throw new IllegalStateException("Found the format, but couldn't figure out where - should never happen!");
}
- if (numberFormats.size() > MAXIMUM_NUMBER_OF_DATA_FORMATS) {
+ if (numberFormats.size() >= MAXIMUM_NUMBER_OF_DATA_FORMATS) {
throw new IllegalStateException("The maximum number of Data Formats was exceeded. " +
"You can define up to " + MAXIMUM_NUMBER_OF_DATA_FORMATS + " formats in a .xlsx Workbook.");
}
numberFormats.put(formatIndex, fmt);
return formatIndex;
}
+
+
+ /**
+ * Add a number format with a specific ID into the numberFormats map.
+ * If a format with the same ID already exists, overwrite the format code
+ * with <code>fmt</code>
+ * This may be used to override built-in number formats.
+ *
+ * @param index the number format ID
+ * @param fmt the number format code
+ */
+ public void putNumberFormat(short index, String fmt) {
+ numberFormats.put((int)index, fmt);
+ }
public XSSFFont getFontAt(int idx) {
return fonts.get(idx);
if(fmt == null) fmt = BuiltinFormats.getBuiltinFormat(index);
return fmt;
}
+
+ /**
+ * Add a number format with a specific ID into the number format style table.
+ * If a format with the same ID already exists, overwrite the format code
+ * with <code>fmt</code>
+ * This may be used to override built-in number formats.
+ *
+ * @param index the number format ID
+ * @param format the number format code
+ */
+ public void putFormat(short index, String format) {
+ stylesSource.putNumberFormat(index, format);
+ }
}
package org.apache.poi.xssf.usermodel;
+import java.io.IOException;
+
import org.apache.poi.ss.usermodel.BaseTestDataFormat;
import org.apache.poi.ss.usermodel.BuiltinFormats;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.xssf.XSSFITestDataProvider;
import org.apache.poi.xssf.XSSFTestDataSamples;
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("FormatKM.xlsx");
doTest58532Core(wb);
}
+
+ public void test58778() throws IOException {
+ XSSFWorkbook wb = new XSSFWorkbook();
+ Cell cell = wb.createSheet("bug58778").createRow(0).createCell(0);
+ cell.setCellValue(5.25);
+ CellStyle style = wb.createCellStyle();
+
+ XSSFDataFormat dataFormat = wb.createDataFormat();
+
+ short poundFmtIdx = 6;
+ dataFormat.putFormat(poundFmtIdx, poundFmt);
+ style.setDataFormat(poundFmtIdx);
+ cell.setCellStyle(style);
+ // Cell should appear as "<poundsymbol>5"
+
+ wb = XSSFTestDataSamples.writeOutCloseAndReadBack(wb);
+ cell = wb.getSheet("bug58778").getRow(0).getCell(0);
+ assertEquals(5.25, cell.getNumericCellValue());
+
+ style = cell.getCellStyle();
+ assertEquals(poundFmt, style.getDataFormatString());
+ assertEquals(poundFmtIdx, style.getDataFormat());
+
+ // manually check the file to make sure the cell is rendered as "<poundsymbol>5"
+ // Verified with LibreOffice 4.2.8.2 on 2015-12-28
+ wb.close();
+ }
}