]> source.dussan.org Git - poi.git/commitdiff
fixed autoSizeColumn() to use cached formula values when processing formula cells...
authorYegor Kozlov <yegor@apache.org>
Thu, 19 Feb 2009 17:29:55 +0000 (17:29 +0000)
committerYegor Kozlov <yegor@apache.org>
Thu, 19 Feb 2009 17:29:55 +0000 (17:29 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@745937 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/changes.xml
src/documentation/content/xdocs/status.xml
src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
src/ooxml/interfaces-jdk15/org/apache/poi/ss/usermodel/Cell.java
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java
src/ooxml/java/org/apache/poi/xssf/usermodel/helpers/ColumnHelper.java

index c59adc2e729faa72be79002ad2c62f0b567d2f4b..9389059f55c9b1fc2076334e2563f077cbe70445 100644 (file)
@@ -37,6 +37,7 @@
 
                <!-- Don't forget to update status.xml too! -->
         <release version="3.5-beta6" date="2008-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">fixed Sheet.autoSizeColumn() to use cached formula values when processing formula cells </action>
            <action dev="POI-DEVELOPERS" type="fix">Fixed formula parser to handle names with backslashes</action>
            <action dev="POI-DEVELOPERS" type="add">46660 - added Workbook getHidden() and setHidden(boolean)</action>
            <action dev="POI-DEVELOPERS" type="fix">46693 - Fixed bugs serialization bugs in records: CHARTFORMAT, SHTPROPS, SXVD and SXVDEX</action>
index 386c5f998fa0cf065a27f3a5d0179d9219d6db39..989c45d384c7fc16a4d90c860a26cc007690356a 100644 (file)
@@ -34,6 +34,7 @@
        <!-- Don't forget to update changes.xml too! -->
     <changes>
         <release version="3.5-beta6" date="2008-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">fixed Sheet.autoSizeColumn() to use cached formula values when processing formula cells </action>
            <action dev="POI-DEVELOPERS" type="fix">Fixed formula parser to handle names with backslashes</action>
            <action dev="POI-DEVELOPERS" type="add">46660 - added Workbook getHidden() and setHidden(boolean)</action>
            <action dev="POI-DEVELOPERS" type="fix">46693 - Fixed bugs serialization bugs in records: CHARTFORMAT, SHTPROPS, SXVD and SXVDEX</action>
index 86646286f05d646bf3d16e9199280b2addf952e3..86336034df878278aab300e06875fabbb88f0e64 100644 (file)
@@ -1699,9 +1699,12 @@ public final class HSSFSheet implements org.apache.poi.ss.usermodel.Sheet {
             }
 
             HSSFCellStyle style = cell.getCellStyle();
+            int cellType = cell.getCellType();
+            if(cellType == HSSFCell.CELL_TYPE_FORMULA) cellType = cell.getCachedFormulaResultType();
+            
             HSSFFont font = wb.getFontAt(style.getFontIndex());
 
-            if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
+            if (cellType == HSSFCell.CELL_TYPE_STRING) {
                 HSSFRichTextString rt = cell.getRichStringCellValue();
                 String[] lines = rt.getString().split("\\n");
                 for (int i = 0; i < lines.length; i++) {
@@ -1739,8 +1742,9 @@ public final class HSSFSheet implements org.apache.poi.ss.usermodel.Sheet {
                 }
             } else {
                 String sval = null;
-                if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
-                    String format = style.getDataFormatString().replaceAll("\"", "");
+                if (cellType == HSSFCell.CELL_TYPE_NUMERIC) {
+                    String dfmt = style.getDataFormatString();
+                    String format = dfmt == null ? null : dfmt.replaceAll("\"", "");
                     double value = cell.getNumericCellValue();
                     try {
                         NumberFormat fmt;
@@ -1754,7 +1758,7 @@ public final class HSSFSheet implements org.apache.poi.ss.usermodel.Sheet {
                     } catch (Exception e) {
                         sval = "" + value;
                     }
-                } else if (cell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {
+                } else if (cellType == HSSFCell.CELL_TYPE_BOOLEAN) {
                     sval = String.valueOf(cell.getBooleanCellValue());
                 }
                 if(sval != null) {
index 8816025a4f6c6ac8e2bd3e600891b896d239f912..aa1e8c39552e0b5b8797837a11de41c97d739960 100644 (file)
@@ -131,6 +131,14 @@ public interface Cell {
      */
     int getCellType();
 
+    /**
+     * Only valid for formula cells
+     * @return one of ({@link #CELL_TYPE_NUMERIC}, {@link #CELL_TYPE_STRING},
+     *     {@link #CELL_TYPE_BOOLEAN}, {@link #CELL_TYPE_ERROR}) depending
+     * on the cached value of the formula
+     */
+    int getCachedFormulaResultType();
+
     /**
      * Set a numeric value for the cell
      *
index 26fb2dc8a51c314aa011ca62101c2d390d33ac4c..433b2c650c8ffc5f068f852f2e7079ffd5627c18 100644 (file)
@@ -466,7 +466,28 @@ public final class XSSFCell implements Cell {
             return CELL_TYPE_FORMULA;
         }
 
-        switch (this.cell.getT().intValue()) {
+        return getBaseCellType();
+    }
+
+    /**
+     * Only valid for formula cells
+     * @return one of ({@link #CELL_TYPE_NUMERIC}, {@link #CELL_TYPE_STRING},
+     *     {@link #CELL_TYPE_BOOLEAN}, {@link #CELL_TYPE_ERROR}) depending
+     * on the cached value of the formula
+     */
+    public int getCachedFormulaResultType() {
+        if (cell.getF() == null) {
+            throw new IllegalStateException("Only formula cells have cached results");
+        }
+
+        return getBaseCellType();
+    }
+
+    /**
+     * Detect cell type based on the "t" attribute of the CTCell bean
+     */
+    private int getBaseCellType() {
+        switch (cell.getT().intValue()) {
             case STCellType.INT_B:
                 return CELL_TYPE_BOOLEAN;
             case STCellType.INT_N:
index c796776f47807224121e8926da28ec0e116b8da2..30da5efd426f78ec6b44e99f58fde8a21c6edf30 100644 (file)
@@ -346,9 +346,11 @@ public class ColumnHelper {
             }
 
             XSSFCellStyle style = cell.getCellStyle();
+            int cellType = cell.getCellType();
+            if(cellType == XSSFCell.CELL_TYPE_FORMULA) cellType = cell.getCachedFormulaResultType();
             XSSFFont font = wb.getFontAt(style.getFontIndex());
 
-            if (cell.getCellType() == XSSFCell.CELL_TYPE_STRING) {
+            if (cellType == XSSFCell.CELL_TYPE_STRING) {
                 XSSFRichTextString rt = cell.getRichStringCellValue();
                 String[] lines = rt.getString().split("\\n");
                 for (int i = 0; i < lines.length; i++) {
@@ -388,8 +390,9 @@ public class ColumnHelper {
                 }
             } else {
                 String sval = null;
-                if (cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {
-                    String format = style.getDataFormatString().replaceAll("\"", "");
+                if (cellType == XSSFCell.CELL_TYPE_NUMERIC) {
+                    String dfmt = style.getDataFormatString();
+                    String format = dfmt == null ? null : dfmt.replaceAll("\"", "");
                     double value = cell.getNumericCellValue();
                     try {
                         NumberFormat fmt;
@@ -403,7 +406,7 @@ public class ColumnHelper {
                     } catch (Exception e) {
                         sval = "" + value;
                     }
-                } else if (cell.getCellType() == XSSFCell.CELL_TYPE_BOOLEAN) {
+                } else if (cellType == XSSFCell.CELL_TYPE_BOOLEAN) {
                     sval = String.valueOf(cell.getBooleanCellValue());
                 }
                 if(sval != null) {