]> source.dussan.org Git - poi.git/commitdiff
Avoid short wrapping on cell styles and formats > 32,767 in XSSF - format supports...
authorNick Burch <nick@apache.org>
Sun, 3 May 2015 08:10:07 +0000 (08:10 +0000)
committerNick Burch <nick@apache.org>
Sun, 3 May 2015 08:10:07 +0000 (08:10 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1677371 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCellStyle.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDataFormat.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFBugs.java

index 760026be11e206f9a0f459d10a982de1bacf3e1b..f83facdda4d1cff4b2a6b199659362fe16c90043 100644 (file)
@@ -603,6 +603,9 @@ public class XSSFCellStyle implements CellStyle {
     public short getIndex() {
         return (short)this._cellXfId;
     }
+    protected int getUIndex() {
+        return this._cellXfId;
+    }
 
     /**
      * Get the color to use for the left border
@@ -974,6 +977,15 @@ public class XSSFCellStyle implements CellStyle {
      * @param fmt the index of a data format
      */
     public void setDataFormat(short fmt) {
+        // XSSF supports >32,767 formats
+        setDataFormat(fmt&0xffff);
+    }
+    /**
+     * Set the index of a data format
+     *
+     * @param fmt the index of a data format
+     */
+    public void setDataFormat(int fmt) {
         _cellXf.setApplyNumberFormat(true);
         _cellXf.setNumFmtId(fmt);
     }
index 00ac90736a26be3f7578b113913e69f2fe7da7e5..870c6c025490ceff1db8ad210b334988feb9098d 100644 (file)
@@ -51,6 +51,14 @@ public class XSSFDataFormat implements DataFormat {
      * @return string represented at index of format or null if there is not a  format at that index
      */
     public String getFormat(short index) {
+        return getFormat(index&0xffff);
+    }
+    /**
+     * get the format string that matches the given format index
+     * @param index of a format
+     * @return string represented at index of format or null if there is not a  format at that index
+     */
+    public String getFormat(int index) {
         String fmt = stylesSource.getNumberFormatAt(index);
         if(fmt == null) fmt = BuiltinFormats.getBuiltinFormat(index);
         return fmt;
index 499c3db08ea1e2a8401cd14215dbbf6c79434e51..9230797e413ca83debd97134600d2a82f557d592 100644 (file)
@@ -843,6 +843,15 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
      */
     @Override
     public XSSFCellStyle getCellStyleAt(short idx) {
+        return getCellStyleAt(idx&0xffff);
+    }
+    /**
+     * Get the cell style object at the given index
+     *
+     * @param idx  index within the set of styles
+     * @return XSSFCellStyle object at the index
+     */
+    public XSSFCellStyle getCellStyleAt(int idx) {
         return stylesSource.getStyleAt(idx);
     }
 
index f78b98fded8d6e09ab8a7e61dcf850ccce664561..4fc0db1576721ecb8f52fa5759f8e7c4c5e775fb 100644 (file)
@@ -2439,4 +2439,39 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
         
         wb.close();
     }
+    
+    /**
+     * .xlsx supports 64000 cell styles, the style indexes after
+     *  32,767 must not be -32,768, then -32,767, -32,766
+     */
+    @Test
+    public void bug57880() throws Exception {
+        int numStyles = 33000;
+        XSSFWorkbook wb = new XSSFWorkbook();
+        XSSFSheet s = wb.createSheet("TestSheet");
+        XSSFDataFormat fmt = wb.getCreationHelper().createDataFormat();
+        for (int i=1; i<numStyles; i++) {
+            short df = fmt.getFormat("test"+i);
+            // Format indexes will be wrapped beyond 32,676
+            assertEquals(164+i, df&0xffff);
+            // Create a style and use it
+            XSSFCellStyle style = wb.createCellStyle();
+            assertEquals(i, style.getUIndex());
+            style.setDataFormat(df);
+            XSSFCell c = s.createRow(i).createCell(0, Cell.CELL_TYPE_NUMERIC);
+            c.setCellStyle(style);
+            c.setCellValue(i);
+        }
+        
+        wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
+        fmt = wb.getCreationHelper().createDataFormat();
+        s = wb.getSheetAt(0);
+        for (int i=1; i<numStyles; i++) {
+            XSSFCellStyle style = wb.getCellStyleAt((short)i);
+            assertNotNull(style);
+            assertEquals(i, style.getUIndex());
+            assertEquals(164+i, style.getDataFormat()&0xffff);
+            assertEquals("test"+i, style.getDataFormatString());
+        }
+    }
 }