diff options
author | Yegor Kozlov <yegor@apache.org> | 2008-12-23 16:19:07 +0000 |
---|---|---|
committer | Yegor Kozlov <yegor@apache.org> | 2008-12-23 16:19:07 +0000 |
commit | a2d45f64543e394a82399e3dc4533e89b5c8663b (patch) | |
tree | 0b41a2d22954cc0acad69cf090dd2b4ffa67688a /src/ooxml/java/org | |
parent | 27f601e40e6bc2a5ac3eb759580106a569cbc0dc (diff) | |
download | poi-a2d45f64543e394a82399e3dc4533e89b5c8663b.tar.gz poi-a2d45f64543e394a82399e3dc4533e89b5c8663b.zip |
fixed formula parser to correctly resolve sheet-level names
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@729028 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/ooxml/java/org')
3 files changed, 19 insertions, 22 deletions
diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java index 53db069108..0d89bfee2b 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFCell.java @@ -347,8 +347,9 @@ public final class XSSFCell implements Cell { throw new IllegalStateException("Shared Formula not found for group index " + idx); } String sharedFormula = sfCell.getCTCell().getF().getStringValue(); + int sheetIndex = sheet.getWorkbook().getSheetIndex(sheet); XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create(sheet.getWorkbook()); - Ptg[] ptgs = FormulaParser.parse(sharedFormula, fpb); + Ptg[] ptgs = FormulaParser.parse(sharedFormula, fpb, FormulaType.CELL, sheetIndex); Ptg[] fmla = SharedFormulaRecord.convertSharedFormulas(ptgs, getRowIndex() - sfCell.getRowIndex(), getColumnIndex() - sfCell.getColumnIndex()); return FormulaRenderer.toFormulaString(fpb, fmla); @@ -371,9 +372,10 @@ public final class XSSFCell implements Cell { return; } - XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create(row.getSheet().getWorkbook()); + XSSFWorkbook wb = row.getSheet().getWorkbook(); + XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create(wb); try { - Ptg[] ptgs = FormulaParser.parse(formula, fpb, FormulaType.CELL); + Ptg[] ptgs = FormulaParser.parse(formula, fpb, FormulaType.CELL, wb.getSheetIndex(getSheet())); } catch (RuntimeException e) { if (e.getClass().getName().startsWith(FormulaParser.class.getName())) { throw new IllegalArgumentException("Unparsable formula '" + formula + "'", e); diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java index fdcebbcc99..f733a67bd1 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java @@ -20,13 +20,7 @@ package org.apache.poi.xssf.usermodel; import org.apache.poi.hssf.record.formula.NamePtg;
import org.apache.poi.hssf.record.formula.NameXPtg;
import org.apache.poi.hssf.record.formula.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.FormulaParser;
-import org.apache.poi.ss.formula.FormulaParsingWorkbook;
-import org.apache.poi.ss.formula.FormulaRenderingWorkbook;
+import org.apache.poi.ss.formula.*;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedName;
/**
@@ -73,15 +67,16 @@ public final class XSSFEvaluationWorkbook implements FormulaRenderingWorkbook, E return convertToExternalSheetIndex(sheetIndex);
}
- public EvaluationName getName(String name) {
- for(int i=0; i < _uBook.getNumberOfNames(); i++) {
- String nameText = _uBook.getNameAt(i).getNameName();
- if (name.equalsIgnoreCase(nameText)) {
- return new Name(_uBook.getNameAt(i), i, this);
- }
- }
- return null;
- }
+ public EvaluationName getName(String name, int sheetIndex) {
+ for(int i=0; i < _uBook.getNumberOfNames(); i++) {
+ XSSFName nm = _uBook.getNameAt(i);
+ String nameText = nm.getNameName();
+ if (name.equalsIgnoreCase(nameText) && nm.getSheetIndex() == sheetIndex) {
+ return new Name(_uBook.getNameAt(i), i, this);
+ }
+ }
+ return sheetIndex == -1 ? null : getName(name, -1);
+ }
public int getSheetIndex(EvaluationSheet evalSheet) {
XSSFSheet sheet = ((XSSFEvaluationSheet)evalSheet).getXSSFSheet();
@@ -135,7 +130,7 @@ public final class XSSFEvaluationWorkbook implements FormulaRenderingWorkbook, E public Ptg[] getFormulaTokens(EvaluationCell evalCell) {
XSSFCell cell = ((XSSFEvaluationCell)evalCell).getXSSFCell();
XSSFEvaluationWorkbook frBook = XSSFEvaluationWorkbook.create(_uBook);
- return FormulaParser.parse(cell.getCellFormula(), frBook);
+ return FormulaParser.parse(cell.getCellFormula(), frBook, FormulaType.CELL, _uBook.getSheetIndex(cell.getSheet()));
}
private static final class Name implements EvaluationName {
@@ -152,7 +147,7 @@ public final class XSSFEvaluationWorkbook implements FormulaRenderingWorkbook, E public Ptg[] getNameDefinition() {
- return FormulaParser.parse(_nameRecord.getRefersToFormula(), _fpBook);
+ return FormulaParser.parse(_nameRecord.getRefersToFormula(), _fpBook, FormulaType.NAMEDRANGE, _nameRecord.getSheetIndex());
}
public String getNameText() {
diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFName.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFName.java index 85e919bef4..47fc9ba04a 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFName.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFName.java @@ -199,7 +199,7 @@ public final class XSSFName implements Name { public void setRefersToFormula(String formulaText) { XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create(workbook); try { - Ptg[] ptgs = FormulaParser.parse(formulaText, fpb, FormulaType.NAMEDRANGE); + Ptg[] ptgs = FormulaParser.parse(formulaText, fpb, FormulaType.NAMEDRANGE, getSheetIndex()); } catch (RuntimeException e) { if (e.getClass().getName().startsWith(FormulaParser.class.getName())) { throw new IllegalArgumentException("Unparsable formula '" + formulaText + "'", e); |