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 22:51:23 UTC
svn commit: r1611961 - in /poi/trunk/src: java/org/apache/poi/ss/formula/
java/org/apache/poi/ss/formula/ptg/ ooxml/java/org/apache/poi/xssf/usermodel/
ooxml/testcases/org/apache/poi/xssf/usermodel/
Author: nick
Date: Sat Jul 19 20:51:23 2014
New Revision: 1611961
URL: http://svn.apache.org/r1611961
Log:
Move towards supporting same workbook named ranges in external style for xssf
Modified:
poi/trunk/src/java/org/apache/poi/ss/formula/FormulaParser.java
poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NameXPxg.java
poi/trunk/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFEvaluationWorkbook.java
poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaParser.java
Modified: poi/trunk/src/java/org/apache/poi/ss/formula/FormulaParser.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/FormulaParser.java?rev=1611961&r1=1611960&r2=1611961&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/FormulaParser.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/FormulaParser.java Sat Jul 19 20:51:23 2014
@@ -373,6 +373,9 @@ public final class FormulaParser {
* 123.456
* "abc"
* true
+ * [Foo.xls]!$A$1
+ * [Foo.xls]'my sheet'!$A$1
+ * [Foo.xls]!my.named.range
* </pre>
*
*/
@@ -768,7 +771,6 @@ public final class FormulaParser {
* @return The sheet name as an identifier <code>null</code> if '!' is not found in the right place
*/
private SheetIdentifier parseSheetName() {
-
String bookName;
if (look == '[') {
StringBuilder sb = new StringBuilder();
@@ -823,6 +825,11 @@ public final class FormulaParser {
}
return null;
}
+ if (look == '!' && bookName != null) {
+ // Raw book reference, wihtout a sheet
+ GetChar();
+ return new SheetIdentifier(bookName, null);
+ }
return null;
}
Modified: poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NameXPxg.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NameXPxg.java?rev=1611961&r1=1611960&r2=1611961&view=diff
==============================================================================
--- poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NameXPxg.java (original)
+++ poi/trunk/src/java/org/apache/poi/ss/formula/ptg/NameXPxg.java Sat Jul 19 20:51:23 2014
@@ -74,7 +74,9 @@ public final class NameXPxg extends Oper
sb.append(externalWorkbookNumber);
sb.append(']');
}
- sb.append(sheetName);
+ if (sheetName != null) {
+ sb.append(sheetName);
+ }
sb.append('!');
sb.append(nameName);
return sb.toString();
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=1611961&r1=1611960&r2=1611961&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 20:51:23 2014
@@ -78,23 +78,25 @@ public final class XSSFEvaluationWorkboo
return sheetIndex;
}
- public int getExternalSheetIndex(String sheetName) {
- int sheetIndex = _uBook.getSheetIndex(sheetName);
- return convertToExternalSheetIndex(sheetIndex);
- }
-
- private int resolveBookIndex(String bookName) {
- // Is it already in numeric form?
- if (bookName.startsWith("[") && bookName.endsWith("]")) {
- bookName = bookName.substring(1, bookName.length()-2);
- try {
- return Integer.parseInt(bookName);
- } catch (NumberFormatException e) {}
- }
-
- // Look up an External Link Table for this name
- throw new RuntimeException("Not implemented yet"); // TODO
- }
+ public int getExternalSheetIndex(String sheetName) {
+ int sheetIndex = _uBook.getSheetIndex(sheetName);
+ return convertToExternalSheetIndex(sheetIndex);
+ }
+
+ private int resolveBookIndex(String bookName) {
+ // Strip the [] wrapper, if still present
+ if (bookName.startsWith("[") && bookName.endsWith("]")) {
+ bookName = bookName.substring(1, bookName.length()-2);
+ }
+
+ // Is it already in numeric form?
+ try {
+ return Integer.parseInt(bookName);
+ } catch (NumberFormatException e) {}
+
+ // Look up an External Link Table for this name
+ throw new RuntimeException("Not implemented yet for book " + bookName); // TODO
+ }
public EvaluationName getName(String name, int sheetIndex) {
for (int i = 0; i < _uBook.getNumberOfNames(); i++) {
@@ -129,6 +131,13 @@ public final class XSSFEvaluationWorkboo
}
// Otherwise, try it as a named range
+ if (sheet._sheetIdentifier == null) {
+ // Workbook + Named Range only
+ int bookIndex = resolveBookIndex(sheet._bookName);
+ return new NameXPxg(bookIndex, null, name);
+ }
+
+ // Use the sheetname and process
String sheetName = sheet._sheetIdentifier.getName();
if (sheet._bookName != null) {
Modified: poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaParser.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaParser.java?rev=1611961&r1=1611960&r2=1611961&view=diff
==============================================================================
--- poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaParser.java (original)
+++ poi/trunk/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaParser.java Sat Jul 19 20:51:23 2014
@@ -26,6 +26,7 @@ import org.apache.poi.ss.formula.Formula
import org.apache.poi.ss.formula.FormulaType;
import org.apache.poi.ss.formula.ptg.FuncPtg;
import org.apache.poi.ss.formula.ptg.IntPtg;
+import org.apache.poi.ss.formula.ptg.NameXPxg;
import org.apache.poi.ss.formula.ptg.Ptg;
import org.apache.poi.ss.formula.ptg.Ref3DPxg;
import org.apache.poi.ss.formula.ptg.RefPtg;
@@ -95,8 +96,26 @@ public final class TestXSSFFormulaParser
assertTrue("", ptgs[1] instanceof FuncPtg);
}
+ @Test
+ public void formaulReferncesSameWorkbook() {
+ // Use a test file with "other workbook" style references
+ // to itself
+ XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("56737.xlsx");
+ XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create(wb);
+ Ptg[] ptgs;
+
+ // Reference to a named range in our own workbook, as if it
+ // were defined in a different workbook
+ ptgs = parse(fpb, "[0]!NR_Global_B2");
+ assertEquals(1, ptgs.length);
+ assertEquals(NameXPxg.class, ptgs[0].getClass());
+ assertEquals(null, ((NameXPxg)ptgs[0]).getSheetName());
+ assertEquals("NR_Global_B2",((NameXPxg)ptgs[0]).getNameName());
+ assertEquals("[0]!NR_Global_B2",((NameXPxg)ptgs[0]).toFormulaString());
+ }
+
@Test
- @Ignore("Work in progress, see bug #56737")
+ @Ignore("Work in progress, see bug #56737")
public void formulaReferencesOtherSheets() {
// Use a test file with the named ranges in place
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("ref-56737.xlsx");
@@ -113,7 +132,10 @@ public final class TestXSSFFormulaParser
// Reference to a sheet scoped named range from another sheet
ptgs = parse(fpb, "Defines!NR_To_A1");
assertEquals(1, ptgs.length);
- // TODO assert
+ assertEquals(NameXPxg.class, ptgs[0].getClass());
+ assertEquals("Defines", ((NameXPxg)ptgs[0]).getSheetName());
+ assertEquals("NR_To_A1",((NameXPxg)ptgs[0]).getNameName());
+ assertEquals("Defines!NR_To_A1",((NameXPxg)ptgs[0]).toFormulaString());
// Reference to a workbook scoped named range
ptgs = parse(fpb, "NR_Global_B2");
@@ -123,22 +145,6 @@ public final class TestXSSFFormulaParser
@Test
@Ignore("Work in progress, see bug #56737")
- public void fFormaulReferncesSameWorkbook() {
- // Use a test file with "other workbook" style references
- // to itself
- XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("56737.xlsx");
- XSSFEvaluationWorkbook fpb = XSSFEvaluationWorkbook.create(wb);
- Ptg[] ptgs;
-
- // Reference to a named range in our own workbook, as if it
- // were defined in a different workbook
- ptgs = parse(fpb, "[0]!NR_Global_B2");
- assertEquals(1, ptgs.length);
- // TODO assert
- }
-
- @Test
- @Ignore("Work in progress, see bug #56737")
public void formulaReferencesOtherWorkbook() {
// Use a test file with the external linked table in place
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("ref-56737.xlsx");
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org