ASF Bugzilla – Attachment 25187 Details for
Bug 48996
[PATCH] External name references during formula evaluation do not work
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Modifications to existing files to add this functionality
diff.txt (text/plain), 15.34 KB, created by
Steve Wolke
on 2010-03-26 14:20:17 UTC
(
hide
)
Description:
Modifications to existing files to add this functionality
Filename:
MIME Type:
Creator:
Steve Wolke
Created:
2010-03-26 14:20:17 UTC
Size:
15.34 KB
patch
obsolete
>Index: src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java >=================================================================== >--- src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java (revision 927787) >+++ src/java/org/apache/poi/hssf/usermodel/HSSFEvaluationWorkbook.java (working copy) >@@ -38,6 +38,7 @@ > * Internal POI use only > * > * @author Josh Micich >+ * @author Stephen Wolke (smwolke at geistig.com) > */ > public final class HSSFEvaluationWorkbook implements FormulaRenderingWorkbook, EvaluationWorkbook, FormulaParsingWorkbook { > >@@ -108,6 +109,10 @@ > return _iBook.getExternalSheet(externSheetIndex); > } > >+ public ExternalName getExternalName(NameXPtg n){ >+ return _iBook.getExternalName(n.getSheetRefIndex(), n.getNameIndex()); >+ } >+ > public String resolveNameXText(NameXPtg n) { > return _iBook.resolveNameXText(n.getSheetRefIndex(), n.getNameIndex()); > } >Index: src/java/org/apache/poi/hssf/model/LinkTable.java >=================================================================== >--- src/java/org/apache/poi/hssf/model/LinkTable.java (revision 927787) >+++ src/java/org/apache/poi/hssf/model/LinkTable.java (working copy) >@@ -63,6 +63,7 @@ > * > * > * @author Josh Micich >+ * @author Stephen Wolke (smwolke at geistig.com) > */ > final class LinkTable { > >@@ -124,6 +125,10 @@ > public String getNameText(int definedNameIndex) { > return _externalNameRecords[definedNameIndex].getText(); > } >+ >+ public int getIx(int definedNameIndex) { >+ return _externalNameRecords[definedNameIndex].getIx(); >+ } > > /** > * Performs case-insensitive search >@@ -317,7 +322,10 @@ > return null; > } > int shIx = _externSheetRecord.getFirstSheetIndexFromRefIndex(extRefIndex); >- String usSheetName = ebr.getSheetNames()[shIx]; >+ //if the shIx is <0 then the external reference is a global reference and has no sheet name >+ String usSheetName = null; >+ if(shIx >=0) >+ usSheetName = ebr.getSheetNames()[shIx]; > return new String[] { > ebr.getURL(), > usSheetName, >@@ -415,6 +423,11 @@ > return -1; > } > >+ public int resolveNameXIx(int refIndex, int definedNameIndex) { >+ int extBookIndex = _externSheetRecord.getExtbookIndexFromRefIndex(refIndex); >+ return _externalBookBlocks[extBookIndex].getIx(definedNameIndex); >+ } >+ > public String resolveNameXText(int refIndex, int definedNameIndex) { > int extBookIndex = _externSheetRecord.getExtbookIndexFromRefIndex(refIndex); > return _externalBookBlocks[extBookIndex].getNameText(definedNameIndex); >Index: src/java/org/apache/poi/hssf/model/InternalWorkbook.java >=================================================================== >--- src/java/org/apache/poi/hssf/model/InternalWorkbook.java (revision 927787) >+++ src/java/org/apache/poi/hssf/model/InternalWorkbook.java (working copy) >@@ -81,6 +81,7 @@ > import org.apache.poi.hssf.record.formula.FormulaShifter; > import org.apache.poi.hssf.record.formula.Ptg; > import org.apache.poi.hssf.util.HSSFColor; >+import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalName; > import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalSheet; > import org.apache.poi.util.Internal; > import org.apache.poi.util.POILogFactory; >@@ -107,6 +108,7 @@ > * @author Brian Sanders (bsanders at risklabs dot com) - custom palette > * @author Dan Sherman (dsherman at isisph.com) > * @author Glen Stampoultzis (glens at apache.org) >+ * @author Stephen Wolke (smwolke at geistig.com) > * @see org.apache.poi.hssf.usermodel.HSSFWorkbook > */ > @Internal >@@ -1762,6 +1764,15 @@ > } > return new ExternalSheet(extNames[0], extNames[1]); > } >+ >+ public ExternalName getExternalName(int refIndex, int definedNameIndex) { >+ String name = linkTable.resolveNameXText(refIndex, definedNameIndex); >+ int ix = linkTable.resolveNameXIx(refIndex, definedNameIndex); >+ if (name == null) { >+ return null; >+ } >+ return new ExternalName(name,definedNameIndex,ix); >+ } > > /** > * Finds the sheet index for a particular external sheet number. >Index: src/java/org/apache/poi/hssf/record/formula/NameXPtg.java >=================================================================== >--- src/java/org/apache/poi/hssf/record/formula/NameXPtg.java (revision 927787) >+++ src/java/org/apache/poi/hssf/record/formula/NameXPtg.java (working copy) >@@ -25,6 +25,7 @@ > /** > * > * @author aviks >+ * @author Stephen Wolke (smwolke at geistig.com) > */ > public final class NameXPtg extends OperandPtg implements WorkbookDependentFormula { > public final static short sid = 0x39; >@@ -84,4 +85,9 @@ > public int getNameIndex() { > return _nameNumber - 1; > } >+ >+ public String toString(){ >+ String retValue = "NameXPtg:[sheetRefIndex:" + _sheetRefIndex + " , nameNumber:" + _nameNumber + "]" ; >+ return retValue; >+ } > } >Index: src/java/org/apache/poi/hssf/record/ExternalNameRecord.java >=================================================================== >--- src/java/org/apache/poi/hssf/record/ExternalNameRecord.java (revision 927787) >+++ src/java/org/apache/poi/hssf/record/ExternalNameRecord.java (working copy) >@@ -26,6 +26,7 @@ > * EXTERNALNAME (0x0023)<p/> > * > * @author Josh Micich >+ * @author Stephen Wolke (smwolke at geistig.com) > */ > public final class ExternalNameRecord extends StandardRecord { > >@@ -96,6 +97,13 @@ > public String getText() { > return field_4_name; > } >+ >+ /** >+ * @return the int value of the reserved field that should be 0 but is not always. >+ */ >+ public int getIx() { >+ return field_2_not_used; >+ } > > protected int getDataSize(){ > int result = 2 + 4; // short and int >Index: src/java/org/apache/poi/ss/formula/OperationEvaluationContext.java >=================================================================== >--- src/java/org/apache/poi/ss/formula/OperationEvaluationContext.java (revision 927787) >+++ src/java/org/apache/poi/ss/formula/OperationEvaluationContext.java (working copy) >@@ -17,10 +17,15 @@ > > package org.apache.poi.ss.formula; > >+import org.apache.poi.hssf.record.formula.Area3DPtg; >+import org.apache.poi.hssf.record.formula.NameXPtg; >+import org.apache.poi.hssf.record.formula.Ptg; >+import org.apache.poi.hssf.record.formula.Ref3DPtg; > import org.apache.poi.hssf.record.formula.eval.*; > import org.apache.poi.hssf.record.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.util.CellReference; > import org.apache.poi.ss.util.CellReference.NameType; >@@ -32,6 +37,7 @@ > * For POI internal use only > * > * @author Josh Micich >+ * @author Stephen Wolke (smwolke at geistig.com) > */ > public final class OperationEvaluationContext { > public static final FreeRefFunction UDF = UserDefinedFunction.instance; >@@ -254,4 +260,37 @@ > SheetRefEvaluator sre = createExternSheetRefEvaluator(extSheetIndex); > return new LazyAreaEval(firstRowIndex, firstColumnIndex, lastRowIndex, lastColumnIndex, sre); > } >+ public ValueEval getNameXEval(NameXPtg nameXPtg) { >+ ExternalSheet externSheet = _workbook.getExternalSheet(nameXPtg.getSheetRefIndex()); >+ if(externSheet == null) >+ return new NameXEval(nameXPtg); >+ String workbookName = externSheet.getWorkbookName(); >+ ExternalName externName = _workbook.getExternalName(nameXPtg); >+ try{ >+ WorkbookEvaluator refWorkbookEvaluator = _bookEvaluator.getOtherWorkbookEvaluator(workbookName); >+ EvaluationName evaluationName = refWorkbookEvaluator.getName(externName.getName(),externName.getIx()-1); >+ if(evaluationName.hasFormula()){ >+ if (evaluationName.getNameDefinition().length > 1) { >+ throw new RuntimeException("Complex name formulas not supported yet"); >+ } >+ Ptg ptg = evaluationName.getNameDefinition()[0]; >+ if(ptg instanceof Ref3DPtg){ >+ Ref3DPtg ref3D = (Ref3DPtg)ptg; >+ int sheetIndex = refWorkbookEvaluator.getSheetIndexByExternIndex(ref3D.getExternSheetIndex()); >+ String sheetName = refWorkbookEvaluator.getSheetName(sheetIndex); >+ SheetRefEvaluator sre = createExternSheetRefEvaluator(workbookName, sheetName); >+ return new LazyRefEval(ref3D.getRow(), ref3D.getColumn(), sre); >+ }else if(ptg instanceof Area3DPtg){ >+ Area3DPtg area3D = (Area3DPtg)ptg; >+ int sheetIndex = refWorkbookEvaluator.getSheetIndexByExternIndex(area3D.getExternSheetIndex()); >+ String sheetName = refWorkbookEvaluator.getSheetName(sheetIndex); >+ SheetRefEvaluator sre = createExternSheetRefEvaluator(workbookName, sheetName); >+ return new LazyAreaEval(area3D.getFirstRow(), area3D.getFirstColumn(), area3D.getLastRow(), area3D.getLastColumn(), sre); >+ } >+ } >+ return ErrorEval.REF_INVALID; >+ }catch(WorkbookNotFoundException wnfe){ >+ return ErrorEval.REF_INVALID; >+ } >+ } > } >Index: src/java/org/apache/poi/ss/formula/eval/forked/ForkedEvaluationWorkbook.java >=================================================================== >--- src/java/org/apache/poi/ss/formula/eval/forked/ForkedEvaluationWorkbook.java (revision 927787) >+++ src/java/org/apache/poi/ss/formula/eval/forked/ForkedEvaluationWorkbook.java (working copy) >@@ -36,6 +36,7 @@ > * updated after a call to {@link #getOrCreateUpdatableCell(String, int, int)}. > * > * @author Josh Micich >+ * @author Stephen Wolke (smwolke at geistig.com) > */ > final class ForkedEvaluationWorkbook implements EvaluationWorkbook { > >@@ -91,6 +92,10 @@ > return _masterBook.getExternalSheet(externSheetIndex); > } > >+ public ExternalName getExternalName(NameXPtg ptg) { >+ return _masterBook.getExternalName(ptg); >+ } >+ > public Ptg[] getFormulaTokens(EvaluationCell cell) { > if (cell instanceof ForkedEvaluationCell) { > // doesn't happen yet because formulas cannot be modified from the master workbook >Index: src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java >=================================================================== >--- src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java (revision 927787) >+++ src/java/org/apache/poi/ss/formula/WorkbookEvaluator.java (working copy) >@@ -55,7 +55,6 @@ > import org.apache.poi.hssf.record.formula.eval.EvaluationException; > import org.apache.poi.hssf.record.formula.eval.MissingArgEval; > import org.apache.poi.hssf.record.formula.eval.NameEval; >-import org.apache.poi.hssf.record.formula.eval.NameXEval; > 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.RefEval; >@@ -65,6 +64,7 @@ > import org.apache.poi.hssf.record.formula.functions.FreeRefFunction; > import org.apache.poi.hssf.record.formula.functions.IfFunc; > import org.apache.poi.hssf.record.formula.udf.UDFFinder; >+import org.apache.poi.hssf.usermodel.HSSFEvaluationWorkbook; > import org.apache.poi.hssf.util.CellReference; > import org.apache.poi.ss.formula.CollaboratingWorkbooksEnvironment.WorkbookNotFoundException; > import org.apache.poi.ss.formula.eval.NotImplementedException; >@@ -80,6 +80,7 @@ > * For POI internal use only > * > * @author Josh Micich >+ * @author Stephen Wolke (smwolke at geistig.com) > */ > public final class WorkbookEvaluator { > >@@ -120,6 +121,10 @@ > /* package */ String getSheetName(int sheetIndex) { > return _workbook.getSheetName(sheetIndex); > } >+ >+ int getSheetIndexByExternIndex(int externSheetIndex) { >+ return _workbook.convertFromExternSheetIndex(externSheetIndex); >+ } > > /* package */ EvaluationSheet getSheet(int sheetIndex) { > return _workbook.getSheet(sheetIndex); >@@ -207,6 +212,14 @@ > return evaluateAny(srcCell, sheetIndex, srcCell.getRowIndex(), srcCell.getColumnIndex(), new EvaluationTracker(_cache)); > } > >+ public EvaluationName getName(String name,int sheetIndex){ >+ if(_workbook instanceof HSSFEvaluationWorkbook){ >+ NamePtg namePtg =((HSSFEvaluationWorkbook)_workbook).getName(name, sheetIndex).createPtg(); >+ return _workbook.getName(namePtg); >+ }else >+ return null; >+ } >+ > /** > * Case-insensitive. > * @return -1 if sheet with specified name does not exist >@@ -524,7 +537,8 @@ > throw new RuntimeException("Don't now how to evalate name '" + nameRecord.getNameText() + "'"); > } > if (ptg instanceof NameXPtg) { >- return new NameXEval(((NameXPtg) ptg)); >+ NameXPtg namexPtg = (NameXPtg) ptg; >+ return ec.getNameXEval(namexPtg); > } > > if (ptg instanceof IntPtg) { >Index: src/java/org/apache/poi/ss/formula/EvaluationWorkbook.java >=================================================================== >--- src/java/org/apache/poi/ss/formula/EvaluationWorkbook.java (revision 927787) >+++ src/java/org/apache/poi/ss/formula/EvaluationWorkbook.java (working copy) >@@ -27,6 +27,7 @@ > * For POI internal use only > * > * @author Josh Micich >+ * @author Stephen Wolke (smwolke at geistig.com) > */ > public interface EvaluationWorkbook { > String getSheetName(int sheetIndex); >@@ -46,6 +47,7 @@ > * @return <code>null</code> if externSheetIndex refers to a sheet inside the current workbook > */ > ExternalSheet getExternalSheet(int externSheetIndex); >+ ExternalName getExternalName(NameXPtg ptg); > int convertFromExternSheetIndex(int externSheetIndex); > EvaluationName getName(NamePtg namePtg); > String resolveNameXText(NameXPtg ptg); >@@ -66,4 +68,29 @@ > return _sheetName; > } > } >+ >+ class ExternalName { >+ private final String _name; >+ private final int _nameNumber; >+ private final int _ix; >+ >+ public ExternalName(String name, int nameNumber, int ix) { >+ _name = name; >+ _nameNumber = nameNumber; >+ _ix = ix; >+ } >+ >+ public int getIx() { >+ return _ix; >+ } >+ >+ public String getName() { >+ return _name; >+ } >+ >+ public int getNameNumber() { >+ return _nameNumber; >+ } >+ >+ } > } >Index: src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java >=================================================================== >--- src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java (revision 927787) >+++ src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java (working copy) >@@ -35,6 +35,7 @@ > * Internal POI use only > * > * @author Josh Micich >+ * @author Stephen Wolke (smwolke at geistig.com) > */ > public final class XSSFEvaluationWorkbook implements FormulaRenderingWorkbook, EvaluationWorkbook, FormulaParsingWorkbook { > >@@ -95,6 +96,10 @@ > return _uBook.getSheetName(sheetIndex); > } > >+ public ExternalName getExternalName(NameXPtg ptg) { >+ throw new UnsupportedOperationException("Not supported yet."); >+ } >+ > public NameXPtg getNameXPtg(String name) { > // may require to return null to make tests pass > throw new RuntimeException("Not implemented yet"); >Index: src/testcases/org/apache/poi/hssf/record/formula/AllFormulaTests.java >=================================================================== >--- src/testcases/org/apache/poi/hssf/record/formula/AllFormulaTests.java (revision 927787) >+++ src/testcases/org/apache/poi/hssf/record/formula/AllFormulaTests.java (working copy) >@@ -28,6 +28,7 @@ > * Collects all tests for <tt>org.apache.poi.hssf.record.formula</tt>. > * > * @author Josh Micich >+ * @author Stephen Wolke (smwolke at geistig.com) > */ > public final class AllFormulaTests { > >@@ -44,6 +45,7 @@ > result.addTestSuite(TestAttrPtg.class); > result.addTestSuite(TestErrPtg.class); > result.addTestSuite(TestExternalFunctionFormulas.class); >+ result.addTestSuite(TestExternalNameReference.class); > result.addTestSuite(TestFormulaShifter.class); > result.addTestSuite(TestFuncPtg.class); > result.addTestSuite(TestFuncVarPtg.class);
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 48996
: 25187 |
25188