bug 58778: override a built-in number format, such as using £ instead of $ for currency
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1722043 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
bf5e95d37a
commit
ae1020ac35
@ -234,7 +234,7 @@ public class StylesTable extends POIXMLDocumentPart {
|
||||
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.");
|
||||
}
|
||||
@ -257,6 +257,20 @@ public class StylesTable extends POIXMLDocumentPart {
|
||||
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);
|
||||
}
|
||||
|
@ -78,4 +78,17 @@ public class XSSFDataFormat implements DataFormat {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -17,8 +17,12 @@
|
||||
|
||||
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;
|
||||
@ -62,4 +66,31 @@ public final class TestXSSFDataFormat extends BaseTestDataFormat {
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user