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/07/19 21:19:07 UTC
svn commit: r1611948 - in /poi/trunk/src:
java/org/apache/poi/hssf/usermodel/ java/org/apache/poi/ss/formula/
java/org/apache/poi/ss/formula/eval/forked/
ooxml/java/org/apache/poi/xssf/usermodel/
Author: nick
Date: Sat Jul 19 19:19:06 2014
New Revision: 1611948
URL: http://svn.apache.org/r1611948
Log:
Start to update how the formula parser looks up sheets from formula ptgs, to account for the differences in how HSSF and XSSF store references to external sheets. For #56737
Modified:
poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java
poi/trunk/src/java/org/apache/poi/ss/formula/EvaluationWorkbook.java
poi/trunk/src/java/org/apache/poi/ss/formula/OperationEvaluationContext.java
poi/trunk/src/java/org/apache/poi/ss/formula/SheetRefEvaluator.java
poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java
poi/trunk/src/java/org/apache/poi/ss/formula/eval/forked/ForkedEvaluationWorkbook.java
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java
Modified: poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java?rev=1611948&r1=1611947&r2=1611948&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java (original)
+++ poi/trunk/src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java Sat Jul 19 19:19:06 2014
@@ -120,10 +120,29 @@ public final class HSSFEvaluationWorkboo
}
public ExternalSheet getExternalSheet(int externSheetIndex) {
- return _iBook.getExternalSheet(externSheetIndex);
+ ExternalSheet sheet = _iBook.getExternalSheet(externSheetIndex);
+ if (sheet == null) {
+ // Try to treat it as a local sheet
+ int localSheetIndex = convertFromExternSheetIndex(externSheetIndex);
+ if (localSheetIndex == -1) {
+ // The sheet referenced can't be found, sorry
+ return null;
+ }
+ if (localSheetIndex == -2) {
+ // Not actually sheet based at all - is workbook scoped
+ return null;
+ }
+ // Look up the local sheet
+ String sheetName = getSheetName(localSheetIndex);
+ sheet = new ExternalSheet(null, sheetName);
+ }
+ return sheet;
}
-
- public ExternalName getExternalName(int externSheetIndex, int externNameIndex) {
+ public ExternalSheet getExternalSheet(String sheetName, int externalWorkbookNumber) {
+ throw new IllegalStateException("XSSF-style external references are not supported for HSSF");
+ }
+
+ public ExternalName getExternalName(int externSheetIndex, int externNameIndex) {
return _iBook.getExternalName(externSheetIndex, externNameIndex);
}
@@ -141,7 +160,9 @@ public final class HSSFEvaluationWorkboo
int ix = namePtg.getIndex();
return new Name(_iBook.getNameRecord(ix), ix);
}
- public Ptg[] getFormulaTokens(EvaluationCell evalCell) {
+
+ @SuppressWarnings("unused")
+ public Ptg[] getFormulaTokens(EvaluationCell evalCell) {
HSSFCell cell = ((HSSFEvaluationCell)evalCell).getHSSFCell();
if (false) {
// re-parsing the formula text also works, but is a waste of time
@@ -159,6 +180,7 @@ public final class HSSFEvaluationWorkboo
FormulaRecordAggregate fra = (FormulaRecordAggregate) cell.getCellValueRecord();
return fra.getFormulaTokens();
}
+
public UDFFinder getUDFFinder(){
return _uBook.getUDFFinder();
}
Modified: poi/trunk/src/java/org/apache/poi/ss/formula/EvaluationWorkbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/EvaluationWorkbook.java?rev=1611948&r1=1611947&r2=1611948&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/EvaluationWorkbook.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/EvaluationWorkbook.java Sat Jul 19 19:19:06 2014
@@ -44,10 +44,21 @@ public interface EvaluationWorkbook {
EvaluationSheet getSheet(int sheetIndex);
/**
- * @return <code>null</code> if externSheetIndex refers to a sheet inside the current workbook
+ * HSSF Only - fetch the external-style sheet details
+ * <p>Return will have no workbook set if it's actually in our own workbook</p>
*/
ExternalSheet getExternalSheet(int externSheetIndex);
+ /**
+ * XSSF Only - fetch the external-style sheet details
+ * <p>Return will have no workbook set if it's actually in our own workbook</p>
+ */
+ ExternalSheet getExternalSheet(String sheetName, int externalWorkbookNumber);
+ /**
+ * HSSF Only - convert an external sheet index to an internal sheet index,
+ * for an external-style reference to one of this workbook's own sheets
+ */
int convertFromExternSheetIndex(int externSheetIndex);
+
ExternalName getExternalName(int externSheetIndex, int externNameIndex);
EvaluationName getName(NamePtg namePtg);
EvaluationName getName(String name, int sheetIndex);
Modified: poi/trunk/src/java/org/apache/poi/ss/formula/OperationEvaluationContext.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/OperationEvaluationContext.java?rev=1611948&r1=1611947&r2=1611948&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/OperationEvaluationContext.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/OperationEvaluationContext.java Sat Jul 19 19:19:06 2014
@@ -17,16 +17,21 @@
package org.apache.poi.ss.formula;
-import org.apache.poi.ss.formula.ptg.Area3DPtg;
-import org.apache.poi.ss.formula.ptg.NameXPtg;
-import org.apache.poi.ss.formula.ptg.Ptg;
-import org.apache.poi.ss.formula.ptg.Ref3DPtg;
-import org.apache.poi.ss.formula.eval.*;
-import org.apache.poi.ss.formula.functions.FreeRefFunction;
import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.formula.CollaboratingWorkbooksEnvironment.WorkbookNotFoundException;
import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalName;
import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalSheet;
+import org.apache.poi.ss.formula.eval.AreaEval;
+import org.apache.poi.ss.formula.eval.ErrorEval;
+import org.apache.poi.ss.formula.eval.NameXEval;
+import org.apache.poi.ss.formula.eval.RefEval;
+import org.apache.poi.ss.formula.eval.ValueEval;
+import org.apache.poi.ss.formula.functions.FreeRefFunction;
+import org.apache.poi.ss.formula.ptg.Area3DPtg;
+import org.apache.poi.ss.formula.ptg.NameXPtg;
+import org.apache.poi.ss.formula.ptg.Ptg;
+import org.apache.poi.ss.formula.ptg.Ref3DPtg;
+import org.apache.poi.ss.formula.ptg.Ref3DPxg;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.ss.util.CellReference.NameType;
@@ -70,13 +75,20 @@ public final class OperationEvaluationCo
SheetRefEvaluator createExternSheetRefEvaluator(ExternSheetReferenceToken ptg) {
return createExternSheetRefEvaluator(ptg.getExternSheetIndex());
}
+ SheetRefEvaluator createExternSheetRefEvaluator(String sheetName, int externalWorkbookNumber) {
+ ExternalSheet externalSheet = _workbook.getExternalSheet(sheetName, externalWorkbookNumber);
+ return createExternSheetRefEvaluator(externalSheet);
+ }
SheetRefEvaluator createExternSheetRefEvaluator(int externSheetIndex) {
ExternalSheet externalSheet = _workbook.getExternalSheet(externSheetIndex);
+ return createExternSheetRefEvaluator(externalSheet);
+ }
+ SheetRefEvaluator createExternSheetRefEvaluator(ExternalSheet externalSheet) {
WorkbookEvaluator targetEvaluator;
int otherSheetIndex;
- if (externalSheet == null) {
+ if (externalSheet == null || externalSheet.getWorkbookName() == null) {
// sheet is in same workbook
- otherSheetIndex = _workbook.convertFromExternSheetIndex(externSheetIndex);
+ otherSheetIndex = _workbook.getSheetIndex(externalSheet.getSheetName());
targetEvaluator = _bookEvaluator;
} else {
// look up sheet by name from external workbook
@@ -259,10 +271,14 @@ public final class OperationEvaluationCo
SheetRefEvaluator sre = getRefEvaluatorForCurrentSheet();
return new LazyRefEval(rowIndex, columnIndex, sre);
}
- public ValueEval getRef3DEval(int rowIndex, int columnIndex, int extSheetIndex) {
- SheetRefEvaluator sre = createExternSheetRefEvaluator(extSheetIndex);
- return new LazyRefEval(rowIndex, columnIndex, sre);
- }
+ public ValueEval getRef3DEval(Ref3DPtg rptg) {
+ SheetRefEvaluator sre = createExternSheetRefEvaluator(rptg.getExternSheetIndex());
+ return new LazyRefEval(rptg.getRow(), rptg.getColumn(), sre);
+ }
+ public ValueEval getRef3DEval(Ref3DPxg rptg) {
+ SheetRefEvaluator sre = createExternSheetRefEvaluator(rptg.getSheetName(), rptg.getExternalWorkbookNumber());
+ return new LazyRefEval(rptg.getRow(), rptg.getColumn(), sre);
+ }
public ValueEval getAreaEval(int firstRowIndex, int firstColumnIndex,
int lastRowIndex, int lastColumnIndex) {
SheetRefEvaluator sre = getRefEvaluatorForCurrentSheet();
Modified: poi/trunk/src/java/org/apache/poi/ss/formula/SheetRefEvaluator.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/SheetRefEvaluator.java?rev=1611948&r1=1611947&r2=1611948&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/SheetRefEvaluator.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/SheetRefEvaluator.java Sat Jul 19 19:19:06 2014
@@ -28,7 +28,6 @@ import org.apache.poi.ss.usermodel.Cell;
* @author Josh Micich
*/
final class SheetRefEvaluator {
-
private final WorkbookEvaluator _bookEvaluator;
private final EvaluationTracker _tracker;
private final int _sheetIndex;
Modified: poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java?rev=1611948&r1=1611947&r2=1611948&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java Sat Jul 19 19:19:06 2014
@@ -673,12 +673,10 @@ public final class WorkbookEvaluator {
return ErrorEval.REF_INVALID;
}
if (ptg instanceof Ref3DPtg) {
- Ref3DPtg rptg = (Ref3DPtg) ptg;
- return ec.getRef3DEval(rptg.getRow(), rptg.getColumn(), rptg.getExternSheetIndex());
+ return ec.getRef3DEval((Ref3DPtg)ptg);
}
if (ptg instanceof Ref3DPxg) {
- Ref3DPtg rptg = (Ref3DPtg) ptg;
- // TODO Return the right eval, should be easy as we already know the sheet details
+ return ec.getRef3DEval((Ref3DPxg)ptg);
}
if (ptg instanceof Area3DPtg) {
Area3DPtg aptg = (Area3DPtg) ptg;
Modified: poi/trunk/src/java/org/apache/poi/ss/formula/eval/forked/ForkedEvaluationWorkbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/eval/forked/ForkedEvaluationWorkbook.java?rev=1611948&r1=1611947&r2=1611948&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/eval/forked/ForkedEvaluationWorkbook.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/eval/forked/ForkedEvaluationWorkbook.java Sat Jul 19 19:19:06 2014
@@ -20,13 +20,13 @@ package org.apache.poi.ss.formula.eval.f
import java.util.HashMap;
import java.util.Map;
-import org.apache.poi.ss.formula.ptg.NamePtg;
-import org.apache.poi.ss.formula.ptg.NameXPtg;
-import org.apache.poi.ss.formula.ptg.Ptg;
import org.apache.poi.ss.formula.EvaluationCell;
import org.apache.poi.ss.formula.EvaluationName;
import org.apache.poi.ss.formula.EvaluationSheet;
import org.apache.poi.ss.formula.EvaluationWorkbook;
+import org.apache.poi.ss.formula.ptg.NamePtg;
+import org.apache.poi.ss.formula.ptg.NameXPtg;
+import org.apache.poi.ss.formula.ptg.Ptg;
import org.apache.poi.ss.formula.udf.UDFFinder;
import org.apache.poi.ss.usermodel.Workbook;
@@ -90,8 +90,11 @@ final class ForkedEvaluationWorkbook imp
public ExternalSheet getExternalSheet(int externSheetIndex) {
return _masterBook.getExternalSheet(externSheetIndex);
}
+ public ExternalSheet getExternalSheet(String sheetName, int externalWorkbookNumber) {
+ return _masterBook.getExternalSheet(sheetName, externalWorkbookNumber);
+ }
- public Ptg[] getFormulaTokens(EvaluationCell cell) {
+ public Ptg[] getFormulaTokens(EvaluationCell cell) {
if (cell instanceof ForkedEvaluationCell) {
// doesn't happen yet because formulas cannot be modified from the master workbook
throw new RuntimeException("Updated formulas not supported yet");
Modified: poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java?rev=1611948&r1=1611947&r2=1611948&view=diff
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java (original)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java Sat Jul 19 19:19:06 2014
@@ -37,6 +37,7 @@ import org.apache.poi.ss.formula.udf.Ind
import org.apache.poi.ss.formula.udf.UDFFinder;
import org.apache.poi.ss.util.AreaReference;
import org.apache.poi.ss.util.CellReference;
+import org.apache.poi.xssf.model.ExternalLinksTable;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedName;
/**
@@ -63,7 +64,8 @@ public final class XSSFEvaluationWorkboo
return externSheetIndex;
}
/**
- * @return the sheet index of the sheet with the given external index.
+ * XSSF doesn't use external sheet indexes, so when asked treat
+ * it just as a local index
*/
public int convertFromExternSheetIndex(int externSheetIndex) {
return externSheetIndex;
@@ -175,10 +177,21 @@ public final class XSSFEvaluationWorkboo
}
public ExternalSheet getExternalSheet(int externSheetIndex) {
- // TODO Auto-generated method stub
- return null;
+ throw new IllegalStateException("HSSF-style external references are not supported for XSSF");
}
- public int getExternalSheetIndex(String workbookName, String sheetName) {
+ public ExternalSheet getExternalSheet(String sheetName, int externalWorkbookNumber) {
+ if (externalWorkbookNumber > 0) {
+ // External reference - reference is 1 based, link table is 0 based
+ int linkNumber = externalWorkbookNumber - 1;
+ ExternalLinksTable linkTable = _uBook.getExternalLinksTable().get(linkNumber);
+ return new ExternalSheet(linkTable.getLinkedFileName(), sheetName);
+ } else {
+ // Internal reference
+ return new ExternalSheet(null, sheetName);
+ }
+ }
+
+ public int getExternalSheetIndex(String workbookName, String sheetName) {
throw new RuntimeException("not implemented yet");
}
public int getSheetIndex(String sheetName) {
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org