mirror of https://github.com/apache/poi.git
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
5790fabcc8
commit
b01c8e342c
|
@ -234,7 +234,7 @@ public class StylesTable extends POIXMLDocumentPart {
|
||||||
throw new IllegalStateException("Found the format, but couldn't figure out where - should never happen!");
|
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. " +
|
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.");
|
"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;
|
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) {
|
public XSSFFont getFontAt(int idx) {
|
||||||
return fonts.get(idx);
|
return fonts.get(idx);
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,4 +78,17 @@ public class XSSFDataFormat implements DataFormat {
|
||||||
if(fmt == null) fmt = BuiltinFormats.getBuiltinFormat(index);
|
if(fmt == null) fmt = BuiltinFormats.getBuiltinFormat(index);
|
||||||
return fmt;
|
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;
|
package org.apache.poi.xssf.usermodel;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.BaseTestDataFormat;
|
import org.apache.poi.ss.usermodel.BaseTestDataFormat;
|
||||||
import org.apache.poi.ss.usermodel.BuiltinFormats;
|
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.ss.usermodel.DataFormat;
|
||||||
import org.apache.poi.xssf.XSSFITestDataProvider;
|
import org.apache.poi.xssf.XSSFITestDataProvider;
|
||||||
import org.apache.poi.xssf.XSSFTestDataSamples;
|
import org.apache.poi.xssf.XSSFTestDataSamples;
|
||||||
|
@ -62,4 +66,31 @@ public final class TestXSSFDataFormat extends BaseTestDataFormat {
|
||||||
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("FormatKM.xlsx");
|
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("FormatKM.xlsx");
|
||||||
doTest58532Core(wb);
|
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