You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ni...@apache.org on 2014/11/30 02:30:43 UTC

svn commit: r1642497 - in /poi/trunk/src/java/org/apache/poi/hssf: extractor/OldExcelExtractor.java record/FormulaRecord.java record/OldFormulaRecord.java

Author: nick
Date: Sun Nov 30 01:30:43 2014
New Revision: 1642497

URL: http://svn.apache.org/r1642497
Log:
Formula values for Excel 4 extractor, for TIKA-1490

Modified:
    poi/trunk/src/java/org/apache/poi/hssf/extractor/OldExcelExtractor.java
    poi/trunk/src/java/org/apache/poi/hssf/record/FormulaRecord.java
    poi/trunk/src/java/org/apache/poi/hssf/record/OldFormulaRecord.java

Modified: poi/trunk/src/java/org/apache/poi/hssf/extractor/OldExcelExtractor.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/extractor/OldExcelExtractor.java?rev=1642497&r1=1642496&r2=1642497&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/extractor/OldExcelExtractor.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/extractor/OldExcelExtractor.java Sun Nov 30 01:30:43 2014
@@ -22,7 +22,6 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
-import org.apache.poi.hssf.record.FormulaRecord;
 import org.apache.poi.hssf.record.NumberRecord;
 import org.apache.poi.hssf.record.OldFormulaRecord;
 import org.apache.poi.hssf.record.OldLabelRecord;
@@ -42,7 +41,6 @@ import org.apache.poi.ss.usermodel.Cell;
  */
 public class OldExcelExtractor {
     private InputStream input;
-    private boolean _includeSheetNames = true;
 
     public OldExcelExtractor(InputStream input) {
         this.input = input;
@@ -62,13 +60,6 @@ public class OldExcelExtractor {
     }
 
     /**
-     * Should sheet names be included? Default is true
-     */
-    public void setIncludeSheetNames(boolean includeSheetNames) {
-        _includeSheetNames = includeSheetNames;
-    }
-
-    /**
      * Retrieves the text contents of the file, as best we can
      *  for these old file formats
      */
@@ -95,32 +86,35 @@ public class OldExcelExtractor {
                     text.append(sr.getString());
                     text.append('\n');
                     break;
-                // number - 5.71 - TODO Needs format strings
+                    
                 case NumberRecord.sid:
                     NumberRecord nr = new NumberRecord(ris);
-                    text.append(nr.getValue());
-                    text.append('\n');
+                    handleNumericCell(text, nr.getValue());
                     break;
                 case OldFormulaRecord.biff2_sid:
                 case OldFormulaRecord.biff3_sid:
                 case OldFormulaRecord.biff4_sid:
                     OldFormulaRecord fr = new OldFormulaRecord(ris);
-//                  if (fr.getCachedResultType() == Cell.CELL_TYPE_NUMERIC) {
-                        text.append(fr.getValue());
-                        text.append('\n');
-//                  }
+                    if (fr.getCachedResultType() == Cell.CELL_TYPE_NUMERIC) {
+                        handleNumericCell(text, fr.getValue());
+                    }
                     break;
                 case RKRecord.sid:
                     RKRecord rr = new RKRecord(ris);
-                    text.append(rr.getRKNumber());
-                    text.append('\n');
+                    handleNumericCell(text, rr.getRKNumber());
                     break;
+                    
                 default:
                     ris.readFully(new byte[ris.remaining()]);
-      //              text.append(" = " + ris.getSid() + " = \n");
             }
         }
 
         return text.toString();
     }
+    
+    protected void handleNumericCell(StringBuffer text, double value) {
+        // TODO Need to fetch / use format strings
+        text.append(value);
+        text.append('\n');
+    }
 }

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/FormulaRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/FormulaRecord.java?rev=1642497&r1=1642496&r2=1642497&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/FormulaRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/FormulaRecord.java Sun Nov 30 01:30:43 2014
@@ -47,7 +47,7 @@ public final class FormulaRecord extends
 	 * Excel encodes the same 8 bytes that would be field_4_value with various NaN
 	 * values that are decoded/encoded by this class. 
 	 */
-	private static final class SpecialCachedValue {
+	static final class SpecialCachedValue {
 		/** deliberately chosen by Excel in order to encode other values within Double NaNs */
 		private static final long BIT_MARKER = 0xFFFF000000000000L;
 		private static final int VARIABLE_DATA_LENGTH = 6;

Modified: poi/trunk/src/java/org/apache/poi/hssf/record/OldFormulaRecord.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/record/OldFormulaRecord.java?rev=1642497&r1=1642496&r2=1642497&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/record/OldFormulaRecord.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/record/OldFormulaRecord.java Sun Nov 30 01:30:43 2014
@@ -17,6 +17,8 @@
 
 package org.apache.poi.hssf.record;
 
+import org.apache.poi.hssf.record.FormulaRecord.SpecialCachedValue;
+import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.ss.formula.Formula;
 import org.apache.poi.ss.formula.ptg.Ptg;
 
@@ -30,6 +32,7 @@ public final class OldFormulaRecord exte
     public final static short biff4_sid = 0x0406;
     public final static short biff5_sid = 0x0006;
 
+    private SpecialCachedValue specialCachedValue;
     private double  field_4_value;
     private short   field_5_options;
     private Formula field_6_parsed_expr;
@@ -37,8 +40,15 @@ public final class OldFormulaRecord exte
     public OldFormulaRecord(RecordInputStream ris) {
         super(ris, ris.getSid() == biff2_sid);
 
-        // TODO Handle special cached values, for Biff 3+
-        field_4_value = ris.readDouble();
+        if (isBiff2()) {
+            field_4_value = ris.readDouble();
+        } else {
+            long valueLongBits  = ris.readLong();
+            specialCachedValue = SpecialCachedValue.create(valueLongBits);
+            if (specialCachedValue == null) {
+                field_4_value = Double.longBitsToDouble(valueLongBits);
+            }
+        }
 
         if (isBiff2()) {
             field_5_options = (short)ris.readUByte();
@@ -51,6 +61,20 @@ public final class OldFormulaRecord exte
         field_6_parsed_expr = Formula.read(expression_len, ris, nBytesAvailable);
     }
 
+    public int getCachedResultType() {
+        if (specialCachedValue == null) {
+            return HSSFCell.CELL_TYPE_NUMERIC;
+        }
+        return specialCachedValue.getValueType();
+    }
+    
+    public boolean getCachedBooleanValue() {
+        return specialCachedValue.getBooleanValue();
+    }
+    public int getCachedErrorValue() {
+        return specialCachedValue.getErrorValue();
+    }
+    
     /**
      * get the calculated value of the formula
      *



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org