]> source.dussan.org Git - poi.git/commitdiff
bug 58778: override a built-in number format, such as using £ instead of $ for currency
authorJaven O'Neal <onealj@apache.org>
Tue, 29 Dec 2015 00:12:04 +0000 (00:12 +0000)
committerJaven O'Neal <onealj@apache.org>
Tue, 29 Dec 2015 00:12:04 +0000 (00:12 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1722043 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xssf/model/StylesTable.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDataFormat.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFDataFormat.java

index 30e9f79ec40cb077ea170986f7b19a9bc49f0da4..66605e6a11b65dccb54edcaf80c958b474d42bd0 100644 (file)
@@ -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.");
         }
@@ -256,6 +256,20 @@ public class StylesTable extends POIXMLDocumentPart {
         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);
index b17e1bb17f3601d3c8bf9229d7a45f8f82700332..4b117742ea62b76cec623cce9f8f61a5d80444ed 100644 (file)
@@ -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);
+    }
 }
index d2a9e5ba2cfb5e87b02ed5c4d49d571c4ed93032..fd19c4b1e91543a4e9ae65893134ed26d4e0000c 100644 (file)
 
 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();
+    }
 }