poi-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From j...@apache.org
Subject svn commit: r708325 - in /poi/branches/ooxml: ./ src/documentation/content/xdocs/ src/documentation/content/xdocs/spreadsheet/ src/java/org/apache/poi/hssf/dev/ src/java/org/apache/poi/hssf/model/ src/java/org/apache/poi/hssf/record/ src/java/org/apach...
Date Mon, 27 Oct 2008 21:30:03 GMT
Author: josh
Date: Mon Oct 27 14:30:02 2008
New Revision: 708325

URL: http://svn.apache.org/viewvc?rev=708325&view=rev
Log:
Merged revisions 707953,708242,708252,708260,708262,708286 via svnmerge from 
https://svn.apache.org/repos/asf/poi/trunk

........
  r707953 | josh | 2008-10-26 01:17:06 -0700 (Sun, 26 Oct 2008) | 1 line
  
  Bugzilla 45966 - added implementation for FIND function (patch from Torstein Tauno Svendsen).
........
  r708242 | nick | 2008-10-27 10:26:52 -0700 (Mon, 27 Oct 2008) | 1 line
  
  Link typo fix
........
  r708252 | nick | 2008-10-27 10:59:39 -0700 (Mon, 27 Oct 2008) | 1 line
  
  Patch from bug #46092 - fix hssf dev utility
........
  r708260 | josh | 2008-10-27 11:12:09 -0700 (Mon, 27 Oct 2008) | 1 line
  
  Removed obsolete class
........
  r708262 | josh | 2008-10-27 11:16:44 -0700 (Mon, 27 Oct 2008) | 1 line
  
  Bugzilla 46065 - added implementation for VALUE function
........
  r708286 | josh | 2008-10-27 12:24:42 -0700 (Mon, 27 Oct 2008) | 1 line
  
  Preparation for fix for bug 46009.  (Bug visible on ooxml branch, but this change will expose
the problem)
........

Added:
    poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestFind.java
      - copied, changed from r708286, poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestFind.java
    poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestValue.java
      - copied unchanged from r708286, poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestValue.java
Removed:
    poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/eval/StringOperationEval.java
Modified:
    poi/branches/ooxml/   (props changed)
    poi/branches/ooxml/src/documentation/content/xdocs/changes.xml
    poi/branches/ooxml/src/documentation/content/xdocs/spreadsheet/formula.xml
    poi/branches/ooxml/src/documentation/content/xdocs/status.xml
    poi/branches/ooxml/src/java/org/apache/poi/hssf/dev/HSSF.java
    poi/branches/ooxml/src/java/org/apache/poi/hssf/model/Sheet.java
    poi/branches/ooxml/src/java/org/apache/poi/hssf/record/CFHeaderRecord.java
    poi/branches/ooxml/src/java/org/apache/poi/hssf/record/MergeCellsRecord.java
    poi/branches/ooxml/src/java/org/apache/poi/hssf/record/aggregates/MergedCellsTable.java
    poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/functions/Find.java
    poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/functions/Value.java
    poi/branches/ooxml/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
    poi/branches/ooxml/src/java/org/apache/poi/hssf/util/CellRangeAddress.java
    poi/branches/ooxml/src/java/org/apache/poi/hssf/util/CellRangeAddressList.java
    poi/branches/ooxml/src/java/org/apache/poi/ss/formula/SheetRefEvaluator.java   (props
changed)
    poi/branches/ooxml/src/java/org/apache/poi/ss/util/CellRangeAddress.java
    poi/branches/ooxml/src/java/org/apache/poi/ss/util/CellRangeAddressList.java
    poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/TestMergeCellsRecord.java
    poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/AllIndividualFunctionEvaluationTests.java

Propchange: poi/branches/ooxml/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Oct 27 14:30:02 2008
@@ -1 +1 @@
-/poi/trunk:693591-694881,695264-695420,695621,695649-707802
+/poi/trunk:693591-694881,695264-695420,695621,695649-708286

Propchange: poi/branches/ooxml/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Mon Oct 27 14:30:02 2008
@@ -1 +1 @@
-/poi/trunk:1-638784,638786-639486,639488-639601,639603-640056,640058-642562,642564-642566,642568-642574,642576-642736,642739-650914,650916-707802
+/poi/trunk:1-638784,638786-639486,639488-639601,639603-640056,640058-642562,642564-642566,642568-642574,642576-642736,642739-650914,650916-708286

Modified: poi/branches/ooxml/src/documentation/content/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/documentation/content/xdocs/changes.xml?rev=708325&r1=708324&r2=708325&view=diff
==============================================================================
--- poi/branches/ooxml/src/documentation/content/xdocs/changes.xml (original)
+++ poi/branches/ooxml/src/documentation/content/xdocs/changes.xml Mon Oct 27 14:30:02 2008
@@ -37,6 +37,8 @@
 
 		<!-- Don't forget to update status.xml too! -->
         <release version="3.5-beta4" date="2008-??-??">
+           <action dev="POI-DEVELOPERS" type="add">46065 - added implementation for
VALUE function</action>
+           <action dev="POI-DEVELOPERS" type="add">45966 - added implementation for
FIND function</action>
            <action dev="POI-DEVELOPERS" type="fix">45778 - fixed ObjRecord to read
ftLbsData properly</action>
            <action dev="POI-DEVELOPERS" type="fix">46053 - fixed evaluation cache dependency
analysis when changing blank cells</action>
         </release>

Modified: poi/branches/ooxml/src/documentation/content/xdocs/spreadsheet/formula.xml
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/documentation/content/xdocs/spreadsheet/formula.xml?rev=708325&r1=708324&r2=708325&view=diff
==============================================================================
--- poi/branches/ooxml/src/documentation/content/xdocs/spreadsheet/formula.xml (original)
+++ poi/branches/ooxml/src/documentation/content/xdocs/spreadsheet/formula.xml Mon Oct 27
14:30:02 2008
@@ -99,7 +99,7 @@
                 org.apache.poi.hssf.record.formula.FormulaParser</strong> class. This
class implements a hand 
                 written recursive descent parser. 
             </p>
-            <p>Check out the <link href="http://poi.apache.org/javadocs/">javadocs
</link> for details. 
+            <p>Check out the <link href="http://poi.apache.org/apidocs/">javadocs
</link> for details. 
             </p>
         </section>
        

Modified: poi/branches/ooxml/src/documentation/content/xdocs/status.xml
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/documentation/content/xdocs/status.xml?rev=708325&r1=708324&r2=708325&view=diff
==============================================================================
--- poi/branches/ooxml/src/documentation/content/xdocs/status.xml (original)
+++ poi/branches/ooxml/src/documentation/content/xdocs/status.xml Mon Oct 27 14:30:02 2008
@@ -34,6 +34,8 @@
 	<!-- Don't forget to update changes.xml too! -->
     <changes>
         <release version="3.5-beta4" date="2008-??-??">
+           <action dev="POI-DEVELOPERS" type="add">46065 - added implementation for
VALUE function</action>
+           <action dev="POI-DEVELOPERS" type="add">45966 - added implementation for
FIND function</action>
            <action dev="POI-DEVELOPERS" type="fix">45778 - fixed ObjRecord to read
ftLbsData properly</action>
            <action dev="POI-DEVELOPERS" type="fix">46053 - fixed evaluation cache dependency
analysis when changing blank cells</action>
         </release>

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/dev/HSSF.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/dev/HSSF.java?rev=708325&r1=708324&r2=708325&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/dev/HSSF.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/dev/HSSF.java Mon Oct 27 14:30:02 2008
@@ -15,7 +15,6 @@
    limitations under the License.
 ==================================================================== */
 
-
 package org.apache.poi.hssf.dev;
 
 import java.io.FileInputStream;
@@ -30,7 +29,7 @@
 import org.apache.poi.hssf.usermodel.HSSFRow;
 import org.apache.poi.hssf.usermodel.HSSFSheet;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.util.CellRangeAddress;
+import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.poifs.filesystem.POIFSFileSystem;
 import org.apache.poi.ss.util.Region;
 
@@ -222,7 +221,7 @@
         if (args.length < 2)
         {
 
-/*            try
+            try
             {
                 HSSF hssf = new HSSF(args[ 0 ]);
 
@@ -231,26 +230,30 @@
 
                 for (int k = 0; k < wb.getNumberOfSheets(); k++)
                 {
-                    System.out.println("Sheet " + k);
                     HSSFSheet sheet = wb.getSheetAt(k);
                     int       rows  = sheet.getPhysicalNumberOfRows();
-
+                    System.out.println("Sheet " + k + " \""
+                                       + wb.getSheetName(k) + "\" has "
+                                       + rows + " row(s).");
                     for (int r = 0; r < rows; r++)
                     {
-                        HSSFRow row   = sheet.getPhysicalRowAt(r);
-                        int     cells = row.getPhysicalNumberOfCells();
-
-                        System.out.println("ROW " + row.getRowNum());
+                        HSSFRow row   = sheet.getRow(r);
+                        int     cells = (row != null) ? row.getPhysicalNumberOfCells() :
0;
+                        if (row != null) {
+                          System.out.println("\nROW " + row.getRowNum()
+                                             + " has " + cells + " cell(s).");
+                        }
                         for (int c = 0; c < cells; c++)
                         {
-                            HSSFCell cell  = row.getPhysicalCellAt(c);
+                            HSSFCell cell  = row.getCell(c);
                             String   value = null;
 
                             switch (cell.getCellType())
                             {
 
                                 case HSSFCell.CELL_TYPE_FORMULA :
-                                    value = "FORMULA ";
+                                    value = "FORMULA value="
+                                    + cell.getCellFormula();
                                     break;
 
                                 case HSSFCell.CELL_TYPE_NUMERIC :
@@ -275,7 +278,7 @@
             catch (Exception e)
             {
                 e.printStackTrace();
-            }*/
+            }
         }
         else if (args.length == 2)
         {

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/model/Sheet.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/model/Sheet.java?rev=708325&r1=708324&r2=708325&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/model/Sheet.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/model/Sheet.java Mon Oct 27 14:30:02 2008
@@ -68,7 +68,7 @@
 import org.apache.poi.hssf.record.aggregates.RecordAggregate.PositionTrackingVisitor;
 import org.apache.poi.hssf.record.aggregates.RecordAggregate.RecordVisitor;
 import org.apache.poi.hssf.record.formula.FormulaShifter;
-import org.apache.poi.hssf.util.CellRangeAddress;
+import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.hssf.util.PaneInformation;
 import org.apache.poi.util.POILogFactory;
 import org.apache.poi.util.POILogger;

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/record/CFHeaderRecord.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/record/CFHeaderRecord.java?rev=708325&r1=708324&r2=708325&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/record/CFHeaderRecord.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/record/CFHeaderRecord.java Mon Oct 27
14:30:02 2008
@@ -51,8 +51,8 @@
 	{
 		field_1_numcf = in.readShort();
 		field_2_need_recalculation = in.readShort();
-		field_3_enclosing_cell_range = new org.apache.poi.hssf.util.CellRangeAddress(in);
-		field_4_cell_ranges = new org.apache.poi.hssf.util.CellRangeAddressList(in);
+		field_3_enclosing_cell_range = new CellRangeAddress(in);
+		field_4_cell_ranges = new CellRangeAddressList(in);
 	}
 	
 	public int getNumberOfConditionalFormats()

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/record/MergeCellsRecord.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/record/MergeCellsRecord.java?rev=708325&r1=708324&r2=708325&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/record/MergeCellsRecord.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/record/MergeCellsRecord.java Mon Oct 27
14:30:02 2008
@@ -50,7 +50,7 @@
      	int nRegions = in.readUShort();
     	CellRangeAddress[] cras = new CellRangeAddress[nRegions];
     	for (int i = 0; i < nRegions; i++) {
-			cras[i] = new org.apache.poi.hssf.util.CellRangeAddress(in);
+			cras[i] = new CellRangeAddress(in);
 		}
     	_numberOfRegions = nRegions;
     	_startIndex = 0;

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/record/aggregates/MergedCellsTable.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/record/aggregates/MergedCellsTable.java?rev=708325&r1=708324&r2=708325&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/record/aggregates/MergedCellsTable.java
(original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/record/aggregates/MergedCellsTable.java
Mon Oct 27 14:30:02 2008
@@ -22,8 +22,8 @@
 
 import org.apache.poi.hssf.model.RecordStream;
 import org.apache.poi.hssf.record.MergeCellsRecord;
-import org.apache.poi.hssf.util.CellRangeAddress;
-import org.apache.poi.hssf.util.CellRangeAddressList;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.ss.util.CellRangeAddressList;
 
 /**
  * 
@@ -51,7 +51,8 @@
 			MergeCellsRecord mcr = (MergeCellsRecord) rs.getNext();
 			int nRegions = mcr.getNumAreas();
 			for (int i = 0; i < nRegions; i++) {
-				temp.add(mcr.getAreaAt(i));
+				CellRangeAddress cra = mcr.getAreaAt(i);
+				temp.add(cra);
 			}
 		}
 	}
@@ -102,7 +103,8 @@
 	private void addMergeCellsRecord(MergeCellsRecord mcr) {
 		int nRegions = mcr.getNumAreas();
 		for (int i = 0; i < nRegions; i++) {
-			_mergedRegions.add(mcr.getAreaAt(i));
+			CellRangeAddress cra = mcr.getAreaAt(i);
+			_mergedRegions.add(cra);
 		}
 	}
 
@@ -130,5 +132,4 @@
 	public int getNumberOfMergedRegions() {
 		return _mergedRegions.size();
 	}
-
 }

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/functions/Find.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/functions/Find.java?rev=708325&r1=708324&r2=708325&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/functions/Find.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/functions/Find.java Mon
Oct 27 14:30:02 2008
@@ -1,25 +1,65 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one or more
-* contributor license agreements.  See the NOTICE file distributed with
-* this work for additional information regarding copyright ownership.
-* The ASF licenses this file to You under the Apache License, Version 2.0
-* (the "License"); you may not use this file except in compliance with
-* the License.  You may obtain a copy of the License at
-*
-*     http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-/*
- * Created on May 15, 2005
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
+package org.apache.poi.hssf.record.formula.functions;
+
+import org.apache.poi.hssf.record.formula.eval.Eval;
+import org.apache.poi.hssf.record.formula.eval.ErrorEval;
+import org.apache.poi.hssf.record.formula.eval.ValueEval;
+import org.apache.poi.hssf.record.formula.eval.NumberEval;
+import org.apache.poi.hssf.record.formula.eval.EvaluationException;
+
+/**
+ * Implementation of the FIND() function.<p/>
+ *
+ * <b>Syntax</b>:<br/>
+ * <b>FIND</b>(<b>find_text</b>, <b>within_text</b>,
start_num)<p/>
  *
+ * FIND returns the character position of the first occurrence of <tt>find_text</tt>
inside 
+ * <tt>within_text</tt>.  The third parameter, <tt>start_num</tt>,
is optional (default=1)
+ * and specifies where to start searching from.  Character positions are 1-based.<p/>
+ *
+ * @author Torstein Tauno Svendsen (torstei@officenet.no)
  */
-package org.apache.poi.hssf.record.formula.functions;
+public class Find extends TextFunction {
 
-public class Find extends NotImplementedFunction {
+	protected ValueEval evaluateFunc(Eval[] args, int srcCellRow, short srcCellCol)
+			throws EvaluationException {
 
+		int nArgs = args.length;
+		if (nArgs < 2 || nArgs > 3) {
+			return ErrorEval.VALUE_INVALID;
+		}
+		String needle = evaluateStringArg(args[0], srcCellRow, srcCellCol);
+		String haystack = evaluateStringArg(args[1], srcCellRow, srcCellCol);
+		int startpos;
+		if (nArgs == 3) {
+			startpos = evaluateIntArg(args[2], srcCellRow, srcCellCol);
+			if (startpos <= 0) {
+				return ErrorEval.VALUE_INVALID;
+			}
+			startpos--; // convert 1-based to zero based
+		} else {
+			startpos = 0;
+		}
+		int result = haystack.indexOf(needle, startpos);
+		if (result == -1) {
+			return ErrorEval.VALUE_INVALID;
+		}
+		return new NumberEval(result + 1);
+	}
 }

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/functions/Value.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/functions/Value.java?rev=708325&r1=708324&r2=708325&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/functions/Value.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/record/formula/functions/Value.java Mon
Oct 27 14:30:02 2008
@@ -1,25 +1,188 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one or more
-* contributor license agreements.  See the NOTICE file distributed with
-* this work for additional information regarding copyright ownership.
-* The ASF licenses this file to You under the Apache License, Version 2.0
-* (the "License"); you may not use this file except in compliance with
-* the License.  You may obtain a copy of the License at
-*
-*     http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-/*
- * Created on May 15, 2005
- *
- */
+/* ====================================================================
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+==================================================================== */
+
 package org.apache.poi.hssf.record.formula.functions;
 
-public class Value extends NotImplementedFunction {
+import org.apache.poi.hssf.record.formula.eval.ErrorEval;
+import org.apache.poi.hssf.record.formula.eval.Eval;
+import org.apache.poi.hssf.record.formula.eval.EvaluationException;
+import org.apache.poi.hssf.record.formula.eval.NumberEval;
+import org.apache.poi.hssf.record.formula.eval.OperandResolver;
+import org.apache.poi.hssf.record.formula.eval.ValueEval;
+
+/**
+ * Implementation for Excel VALUE() function.<p/>
+ * 
+ * <b>Syntax</b>:<br/> <b>VALUE</b>(<b>text</b>)<br/>
+ * 
+ * Converts the text argument to a number. Leading and/or trailing whitespace is
+ * ignored. Currency symbols and thousands separators are stripped out.
+ * Scientific notation is also supported. If the supplied text does not convert
+ * properly the result is <b>#VALUE!</b> error. Blank string converts to zero.
+ * 
+ * @author Josh Micich
+ */
+public final class Value implements Function {
+
+	/** "1,0000" is valid, "1,00" is not */
+	private static final int MIN_DISTANCE_BETWEEN_THOUSANDS_SEPARATOR = 4;
+	private static final Double ZERO = new Double(0.0);
+
+	public Eval evaluate(Eval[] args, int srcCellRow, short srcCellCol) {
+		if (args.length != 1) {
+			return ErrorEval.VALUE_INVALID;
+		}
+		ValueEval veText;
+		try {
+			veText = OperandResolver.getSingleValue(args[0], srcCellRow, srcCellCol);
+		} catch (EvaluationException e) {
+			return e.getErrorEval();
+		}
+		String strText = OperandResolver.coerceValueToString(veText);
+		Double result = convertTextToNumber(strText);
+		if (result == null) {
+			return ErrorEval.VALUE_INVALID;
+		}
+		return new NumberEval(result.doubleValue());
+	}
+
+	/**
+	 * TODO see if the same functionality is needed in {@link OperandResolver#parseDouble(String)}

+	 * 
+	 * @return <code>null</code> if there is any problem converting the text
+	 */
+	private static Double convertTextToNumber(String strText) {
+		boolean foundCurrency = false;
+		boolean foundUnaryPlus = false;
+		boolean foundUnaryMinus = false;
+
+		int len = strText.length();
+		int i;
+		for (i = 0; i < len; i++) {
+			char ch = strText.charAt(i);
+			if (Character.isDigit(ch) || ch == '.') {
+				break;
+			}
+			switch (ch) {
+				case ' ':
+					// intervening spaces between '$', '-', '+' are OK
+					continue;
+				case '$':
+					if (foundCurrency) {
+						// only one currency symbols is allowed
+						return null;
+					}
+					foundCurrency = true;
+					continue;
+				case '+':
+					if (foundUnaryMinus || foundUnaryPlus) {
+						return null;
+					}
+					foundUnaryPlus = true;
+					continue;
+				case '-':
+					if (foundUnaryMinus || foundUnaryPlus) {
+						return null;
+					}
+					foundUnaryMinus = true;
+					continue;
+				default:
+					// all other characters are illegal
+					return null;
+			}
+		}
+		if (i >= len) {
+			// didn't find digits or '.'
+			if (foundCurrency || foundUnaryMinus || foundUnaryPlus) {
+				return null;
+			}
+			return ZERO;
+		}
+
+		// remove thousands separators
+
+		boolean foundDecimalPoint = false;
+		int lastThousandsSeparatorIndex = Short.MIN_VALUE;
 
+		StringBuffer sb = new StringBuffer(len);
+		for (; i < len; i++) {
+			char ch = strText.charAt(i);
+			if (Character.isDigit(ch)) {
+				sb.append(ch);
+				continue;
+			}
+			switch (ch) {
+				case ' ':
+					String remainingText = strText.substring(i);
+					if (remainingText.trim().length() > 0) {
+						// intervening spaces not allowed once the digits start
+						return null;
+					}
+					break;
+				case '.':
+					if (foundDecimalPoint) {
+						return null;
+					}
+					if (i - lastThousandsSeparatorIndex < MIN_DISTANCE_BETWEEN_THOUSANDS_SEPARATOR) {
+						return null;
+					}
+					foundDecimalPoint = true;
+					sb.append('.');
+					continue;
+				case ',':
+					if (foundDecimalPoint) {
+						// thousands separators not allowed after '.' or 'E'
+						return null;
+					}
+					int distanceBetweenThousandsSeparators = i - lastThousandsSeparatorIndex;
+					// as long as there are 3 or more digits between
+					if (distanceBetweenThousandsSeparators < MIN_DISTANCE_BETWEEN_THOUSANDS_SEPARATOR)
{
+						return null;
+					}
+					lastThousandsSeparatorIndex = i;
+					// don't append ','
+					continue;
+	
+				case 'E':
+				case 'e':
+					if (i - lastThousandsSeparatorIndex < MIN_DISTANCE_BETWEEN_THOUSANDS_SEPARATOR) {
+						return null;
+					}
+					// append rest of strText and skip to end of loop
+					sb.append(strText.substring(i));
+					i = len;
+					break;
+				default:
+					// all other characters are illegal
+					return null;
+			}
+		}
+		if (!foundDecimalPoint) {
+			if (i - lastThousandsSeparatorIndex < MIN_DISTANCE_BETWEEN_THOUSANDS_SEPARATOR) {
+				return null;
+			}
+		}
+		double d;
+		try {
+			d = Double.parseDouble(sb.toString());
+		} catch (NumberFormatException e) {
+			// still a problem parsing the number - probably out of range
+			return null;
+		}
+		return new Double(foundUnaryMinus ? -d : d);
+	}
 }

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java?rev=708325&r1=708324&r2=708325&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java Mon Oct 27 14:30:02
2008
@@ -670,7 +670,7 @@
     /**
      * @return the merged region at the specified index
      */
-    public org.apache.poi.hssf.util.CellRangeAddress getMergedRegion(int index) {
+    public CellRangeAddress getMergedRegion(int index) {
         return sheet.getMergedRegionAt(index);
     }
 

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/util/CellRangeAddress.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/util/CellRangeAddress.java?rev=708325&r1=708324&r2=708325&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/util/CellRangeAddress.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/util/CellRangeAddress.java Mon Oct 27
14:30:02 2008
@@ -18,12 +18,12 @@
 
 import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.SelectionRecord;
-import org.apache.poi.util.LittleEndian;
 
 /**
  * See OOO documentation: excelfileformat.pdf sec 2.5.14 - 'Cell Range Address'<p/>
  * 
  * Note - {@link SelectionRecord} uses the BIFF5 version of this structure
+ * @deprecated use {@link org.apache.poi.ss.util.CellRangeAddress}
  * @author Dragos Buleandra (dragos.buleandra@trade2b.ro)
  */
 public class CellRangeAddress extends org.apache.poi.ss.util.CellRangeAddress {

Modified: poi/branches/ooxml/src/java/org/apache/poi/hssf/util/CellRangeAddressList.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/hssf/util/CellRangeAddressList.java?rev=708325&r1=708324&r2=708325&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/hssf/util/CellRangeAddressList.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/hssf/util/CellRangeAddressList.java Mon Oct
27 14:30:02 2008
@@ -33,6 +33,8 @@
  * range address (called an ADDR structure) contains 4 16-bit-values.
  * </p>
  * 
+ * @deprecated use {@link org.apache.poi.ss.util.CellRangeAddressList}
+ * 
  * @author Dragos Buleandra (dragos.buleandra@trade2b.ro)
  */
 public class CellRangeAddressList extends org.apache.poi.ss.util.CellRangeAddressList {

Propchange: poi/branches/ooxml/src/java/org/apache/poi/ss/formula/SheetRefEvaluator.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Oct 27 14:30:02 2008
@@ -1 +1 @@
-/poi/trunk/src/java/org/apache/poi/ss/formula/SheetRefEvaluator.java:703100-706540,706772-707481,707486-707802
+/poi/trunk/src/java/org/apache/poi/ss/formula/SheetRefEvaluator.java:703100-706540,706772-707481,707486-707802,707953-708286

Modified: poi/branches/ooxml/src/java/org/apache/poi/ss/util/CellRangeAddress.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/ss/util/CellRangeAddress.java?rev=708325&r1=708324&r2=708325&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/ss/util/CellRangeAddress.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/ss/util/CellRangeAddress.java Mon Oct 27 14:30:02
2008
@@ -16,6 +16,7 @@
 
 package org.apache.poi.ss.util;
 
+import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.hssf.record.SelectionRecord;
 import org.apache.poi.util.LittleEndian;
 
@@ -42,6 +43,17 @@
 		LittleEndian.putUShort(data, offset + 6, getLastColumn());
 		return ENCODED_SIZE;
 	}
+	public CellRangeAddress(RecordInputStream in) {
+		super(readUShortAndCheck(in), in.readUShort(), in.readUShort(), in.readUShort());
+	}
+
+	private static int readUShortAndCheck(RecordInputStream in) {
+		if (in.remaining() < ENCODED_SIZE) {
+			// Ran out of data
+			throw new RuntimeException("Ran out of data reading CellRangeAddress");
+		}
+		return in.readUShort();
+	}
 
 	public CellRangeAddress copy() {
 		return new CellRangeAddress(getFirstRow(), getLastRow(), getFirstColumn(), getLastColumn());

Modified: poi/branches/ooxml/src/java/org/apache/poi/ss/util/CellRangeAddressList.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/java/org/apache/poi/ss/util/CellRangeAddressList.java?rev=708325&r1=708324&r2=708325&view=diff
==============================================================================
--- poi/branches/ooxml/src/java/org/apache/poi/ss/util/CellRangeAddressList.java (original)
+++ poi/branches/ooxml/src/java/org/apache/poi/ss/util/CellRangeAddressList.java Mon Oct 27
14:30:02 2008
@@ -18,6 +18,8 @@
 
 import java.util.ArrayList;
 import java.util.List;
+
+import org.apache.poi.hssf.record.RecordInputStream;
 import org.apache.poi.util.LittleEndian;
 
 /**
@@ -51,7 +53,17 @@
 		this();
 		addCellRangeAddress(firstRow, firstCol, lastRow, lastCol);
 	}
+	/**
+	 * @param in the RecordInputstream to read the record from
+	 */
+	public CellRangeAddressList(RecordInputStream in) {
+		this();
+		int nItems = in.readUShort();
 
+		for (int k = 0; k < nItems; k++) {
+			_list.add(new CellRangeAddress(in));
+		}
+	}
 	/**
 	 * Get the number of following ADDR structures. The number of this
 	 * structures is automatically set when reading an Excel file and/or

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/TestMergeCellsRecord.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/TestMergeCellsRecord.java?rev=708325&r1=708324&r2=708325&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/TestMergeCellsRecord.java
(original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/TestMergeCellsRecord.java
Mon Oct 27 14:30:02 2008
@@ -17,10 +17,18 @@
 
 package org.apache.poi.hssf.record;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
 
+import org.apache.poi.hssf.model.RecordStream;
+import org.apache.poi.hssf.record.aggregates.MergedCellsTable;
+import org.apache.poi.hssf.record.aggregates.RecordAggregate.RecordVisitor;
 import org.apache.poi.ss.util.CellRangeAddress;
 
+
 /**
  * Make sure the merge cells record behaves
  * @author Danny Mui (dmui at apache dot org)
@@ -28,25 +36,45 @@
  */
 public final class TestMergeCellsRecord extends TestCase {
    
-   /**
-    * Make sure when a clone is called, we actually clone it.
-    * @throws Exception
-    */
-   public void testCloneReferences() throws Exception {
-      CellRangeAddress[] cras = { new CellRangeAddress(0, 1, 0, 2), };
-      MergeCellsRecord merge = new MergeCellsRecord(cras, 0, cras.length);
-      MergeCellsRecord clone = (MergeCellsRecord)merge.clone();
-      
-      assertNotSame("Merged and cloned objects are the same", merge, clone);
-      
-      CellRangeAddress mergeRegion = merge.getAreaAt(0);
-      CellRangeAddress cloneRegion = clone.getAreaAt(0);
-      assertNotSame("Should not point to same objects when cloning", mergeRegion, cloneRegion);
-      assertEquals("New Clone Row From doesnt match", mergeRegion.getFirstRow(), cloneRegion.getFirstRow());
-      assertEquals("New Clone Row To doesnt match", mergeRegion.getLastRow(), cloneRegion.getLastRow());
-      assertEquals("New Clone Col From doesnt match", mergeRegion.getFirstColumn(), cloneRegion.getFirstColumn());
-      assertEquals("New Clone Col To doesnt match", mergeRegion.getLastColumn(), cloneRegion.getLastColumn());
     
+	/**
+	 * Make sure when a clone is called, we actually clone it.
+	 */
+	public void testCloneReferences() {
+		CellRangeAddress[] cras = { new CellRangeAddress(0, 1, 0, 2), };
+		MergeCellsRecord merge = new MergeCellsRecord(cras, 0, cras.length);
+		MergeCellsRecord clone = (MergeCellsRecord)merge.clone();
+
+		assertNotSame("Merged and cloned objects are the same", merge, clone);
+
+		CellRangeAddress mergeRegion = merge.getAreaAt(0);
+		CellRangeAddress cloneRegion = clone.getAreaAt(0);
+		assertNotSame("Should not point to same objects when cloning", mergeRegion, cloneRegion);
+		assertEquals("New Clone Row From doesnt match", mergeRegion.getFirstRow(), cloneRegion.getFirstRow());
+		assertEquals("New Clone Row To doesnt match", mergeRegion.getLastRow(), cloneRegion.getLastRow());
+		assertEquals("New Clone Col From doesnt match", mergeRegion.getFirstColumn(), cloneRegion.getFirstColumn());
+		assertEquals("New Clone Col To doesnt match", mergeRegion.getLastColumn(), cloneRegion.getLastColumn());
     
       
-      assertFalse(merge.getAreaAt(0) == clone.getAreaAt(0));
-   }
+		assertFalse(merge.getAreaAt(0) == clone.getAreaAt(0));
+	}
+   
+	private static final RecordVisitor dummyRecordVisitor = new RecordVisitor() {
+		public void visitRecord(Record r) {
+			// do nothing
+		}
+	};
+	public void testMCTable_bug46009() {
+		MergedCellsTable mct = new MergedCellsTable();
+		List recList = new ArrayList();
+		CellRangeAddress[] cras = new CellRangeAddress[] {
+				new CellRangeAddress(0, 0, 0, 3), 
+		};
+		recList.add(new MergeCellsRecord(cras, 0, 1));
+		RecordStream rs = new RecordStream(recList, 0);
+		mct.read(rs);
+		try {
+			mct.visitContainedRecords(dummyRecordVisitor);
+		} catch (ArrayStoreException e) {
+			throw new AssertionFailedError("Identified bug 46009");
+		}
+	}
 }

Modified: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/AllIndividualFunctionEvaluationTests.java
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/AllIndividualFunctionEvaluationTests.java?rev=708325&r1=708324&r2=708325&view=diff
==============================================================================
--- poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/AllIndividualFunctionEvaluationTests.java
(original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/AllIndividualFunctionEvaluationTests.java
Mon Oct 27 14:30:02 2008
@@ -32,6 +32,7 @@
 		result.addTestSuite(TestAverage.class);
 		result.addTestSuite(TestCountFuncs.class);
 		result.addTestSuite(TestDate.class);
+		result.addTestSuite(TestFind.class);
 		result.addTestSuite(TestFinanceLib.class);
 		result.addTestSuite(TestIndex.class);
 		result.addTestSuite(TestIndexFunctionFromSpreadsheet.class);
@@ -49,6 +50,7 @@
 		result.addTestSuite(TestStatsLib.class);
 		result.addTestSuite(TestTFunc.class);
 		result.addTestSuite(TestTrim.class);
+		result.addTestSuite(TestValue.class);
 		result.addTestSuite(TestXYNumericFunction.class);
 		return result;
 	}

Copied: poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestFind.java
(from r708286, poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestFind.java)
URL: http://svn.apache.org/viewvc/poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestFind.java?p2=poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestFind.java&p1=poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestFind.java&r1=708286&r2=708325&rev=708325&view=diff
==============================================================================
--- poi/trunk/src/testcases/org/apache/poi/hssf/record/formula/functions/TestFind.java (original)
+++ poi/branches/ooxml/src/testcases/org/apache/poi/hssf/record/formula/functions/TestFind.java
Mon Oct 27 14:30:02 2008
@@ -23,7 +23,7 @@
 import org.apache.poi.hssf.usermodel.HSSFErrorConstants;
 import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator.CellValue;
+import org.apache.poi.ss.usermodel.CellValue;
 
 /**
  * Tests for {@link Find}



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


Mime
View raw message