ASF Bugzilla – Attachment 32737 Details for
Bug 56328
[Patch] FormulaParser is hard-coded to assume a maximum of 65536 rows
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch to add tests and fix AreaReference
56328.patch (text/plain), 9.33 KB, created by
David North
on 2015-05-15 15:36:45 UTC
(
hide
)
Description:
Patch to add tests and fix AreaReference
Filename:
MIME Type:
Creator:
David North
Created:
2015-05-15 15:36:45 UTC
Size:
9.33 KB
patch
obsolete
>diff --git a/src/java/org/apache/poi/ss/formula/FormulaParser.java b/src/java/org/apache/poi/ss/formula/FormulaParser.java >index 72ed008..5124a44 100644 >--- a/src/java/org/apache/poi/ss/formula/FormulaParser.java >+++ b/src/java/org/apache/poi/ss/formula/FormulaParser.java >@@ -617,16 +617,16 @@ > return new ParseNode(ptg); > } > >- private static AreaReference createAreaRef(SimpleRangePart part1, SimpleRangePart part2) { >+ private AreaReference createAreaRef(SimpleRangePart part1, SimpleRangePart part2) { > if (!part1.isCompatibleForArea(part2)) { > throw new FormulaParseException("has incompatible parts: '" > + part1.getRep() + "' and '" + part2.getRep() + "'."); > } > if (part1.isRow()) { >- return AreaReference.getWholeRow(part1.getRep(), part2.getRep()); >+ return AreaReference.getWholeRow(_ssVersion, part1.getRep(), part2.getRep()); > } > if (part1.isColumn()) { >- return AreaReference.getWholeColumn(part1.getRep(), part2.getRep()); >+ return AreaReference.getWholeColumn(_ssVersion, part1.getRep(), part2.getRep()); > } > return new AreaReference(part1.getCellReference(), part2.getCellReference()); > } >diff --git a/src/java/org/apache/poi/ss/formula/ptg/AreaPtgBase.java b/src/java/org/apache/poi/ss/formula/ptg/AreaPtgBase.java >index 5b77b09..96eda87 100644 >--- a/src/java/org/apache/poi/ss/formula/ptg/AreaPtgBase.java >+++ b/src/java/org/apache/poi/ss/formula/ptg/AreaPtgBase.java >@@ -17,6 +17,7 @@ > > package org.apache.poi.ss.formula.ptg; > >+import org.apache.poi.ss.SpreadsheetVersion; > import org.apache.poi.ss.util.AreaReference; > import org.apache.poi.ss.util.CellReference; > import org.apache.poi.util.BitField; >@@ -256,7 +257,7 @@ > CellReference topLeft = new CellReference(getFirstRow(),getFirstColumn(),!isFirstRowRelative(),!isFirstColRelative()); > CellReference botRight = new CellReference(getLastRow(),getLastColumn(),!isLastRowRelative(),!isLastColRelative()); > >- if(AreaReference.isWholeColumnReference(topLeft, botRight)) { >+ if(AreaReference.isWholeColumnReference(SpreadsheetVersion.EXCEL97, topLeft, botRight)) { > return (new AreaReference(topLeft, botRight)).formatAsString(); > } > return topLeft.formatAsString() + ":" + botRight.formatAsString(); >diff --git a/src/java/org/apache/poi/ss/util/AreaReference.java b/src/java/org/apache/poi/ss/util/AreaReference.java >index d593888..f99e764 100644 >--- a/src/java/org/apache/poi/ss/util/AreaReference.java >+++ b/src/java/org/apache/poi/ss/util/AreaReference.java >@@ -35,13 +35,23 @@ > private final CellReference _firstCell; > private final CellReference _lastCell; > private final boolean _isSingleCell; >+ private SpreadsheetVersion _version; > >+ /** >+ * @deprecated Prefer supplying a version. >+ */ >+ @Deprecated >+ public AreaReference(String reference) { >+ this(reference, SpreadsheetVersion.EXCEL97); >+ } >+ > /** > * Create an area ref from a string representation. Sheet names containing special characters should be > * delimited and escaped as per normal syntax rules for formulas.<br/> > * The area reference must be contiguous (i.e. represent a single rectangle, not a union of rectangles) > */ >- public AreaReference(String reference) { >+ public AreaReference(String reference, SpreadsheetVersion version) { >+ _version = version; > if(! isContiguous(reference)) { > throw new IllegalArgumentException( > "References passed to the AreaReference must be contiguous, " + >@@ -169,30 +179,30 @@ > return false; > } > >- public static AreaReference getWholeRow(String start, String end) { >- return new AreaReference("$A" + start + ":$IV" + end); >+ public static AreaReference getWholeRow(SpreadsheetVersion version, String start, String end) { >+ return new AreaReference("$A" + start + ":$" + version.getLastColumnName() + end, version); > } > >- public static AreaReference getWholeColumn(String start, String end) { >- return new AreaReference(start + "$1:" + end + "$65536"); >+ public static AreaReference getWholeColumn(SpreadsheetVersion version, String start, String end) { >+ return new AreaReference(start + "$1:" + end + "$" + version.getMaxRows(), version); > } > > /** > * Is the reference for a whole-column reference, > * such as C:C or D:G ? > */ >- public static boolean isWholeColumnReference(CellReference topLeft, CellReference botRight) { >+ public static boolean isWholeColumnReference(SpreadsheetVersion version, CellReference topLeft, CellReference botRight) { > // These are represented as something like > // C$1:C$65535 or D$1:F$0 > // i.e. absolute from 1st row to 0th one > if(topLeft.getRow() == 0 && topLeft.isRowAbsolute() && >- botRight.getRow() == SpreadsheetVersion.EXCEL97.getLastRowIndex() && botRight.isRowAbsolute()) { >+ botRight.getRow() == version.getLastRowIndex() && botRight.isRowAbsolute()) { > return true; > } > return false; > } > public boolean isWholeColumnReference() { >- return isWholeColumnReference(_firstCell, _lastCell); >+ return isWholeColumnReference(_version, _firstCell, _lastCell); > } > > /** >diff --git a/src/testcases/org/apache/poi/ss/formula/TestFormulaParser.java b/src/testcases/org/apache/poi/ss/formula/TestFormulaParser.java >new file mode 100644 >index 0000000..478ad13 >--- /dev/null >+++ b/src/testcases/org/apache/poi/ss/formula/TestFormulaParser.java >@@ -0,0 +1,48 @@ >+package org.apache.poi.ss.formula; >+ >+import org.apache.poi.hssf.usermodel.HSSFEvaluationWorkbook; >+import org.apache.poi.hssf.usermodel.HSSFWorkbook; >+import org.apache.poi.xssf.usermodel.XSSFEvaluationWorkbook; >+import org.apache.poi.xssf.usermodel.XSSFWorkbook; >+ >+import junit.framework.TestCase; >+ >+/** >+ * Test {@link FormulaParser}'s handling of row numbers at the edge of the >+ * HSSF/XSSF ranges. >+ * >+ * @author David North >+ */ >+public class TestFormulaParser extends TestCase { >+ >+ public void testHSSFFailsForOver65536() { >+ FormulaParsingWorkbook workbook = HSSFEvaluationWorkbook.create(new HSSFWorkbook()); >+ try { >+ FormulaParser.parse("Sheet1!1:65537", workbook, FormulaType.CELL, 0); >+ fail("Expected exception"); >+ } >+ catch (FormulaParseException expected) { >+ } >+ } >+ >+ public void testHSSFPassCase() { >+ FormulaParsingWorkbook workbook = HSSFEvaluationWorkbook.create(new HSSFWorkbook()); >+ FormulaParser.parse("Sheet1!1:65536", workbook, FormulaType.CELL, 0); >+ } >+ >+ public void testXSSFWorksForOver65536() { >+ FormulaParsingWorkbook workbook = XSSFEvaluationWorkbook.create(new XSSFWorkbook()); >+ FormulaParser.parse("Sheet1!1:65537", workbook, FormulaType.CELL, 0); >+ } >+ >+ public void testXSSFFailCase() { >+ FormulaParsingWorkbook workbook = XSSFEvaluationWorkbook.create(new XSSFWorkbook()); >+ try { >+ FormulaParser.parse("Sheet1!1:1048577", workbook, FormulaType.CELL, 0); // one more than max rows. >+ fail("Expected exception"); >+ } >+ catch (FormulaParseException expected) { >+ } >+ } >+ >+} >diff --git a/src/testcases/org/apache/poi/ss/util/TestAreaReference.java b/src/testcases/org/apache/poi/ss/util/TestAreaReference.java >new file mode 100644 >index 0000000..291bb46 >--- /dev/null >+++ b/src/testcases/org/apache/poi/ss/util/TestAreaReference.java >@@ -0,0 +1,44 @@ >+package org.apache.poi.ss.util; >+ >+import org.apache.poi.ss.SpreadsheetVersion; >+ >+import junit.framework.TestCase; >+ >+/** >+ * Test for {@link AreaReference} handling of max rows. >+ * >+ * @author David North >+ */ >+public class TestAreaReference extends TestCase { >+ >+ public void testWholeColumn() { >+ AreaReference oldStyle = AreaReference.getWholeColumn(SpreadsheetVersion.EXCEL97, "A", "B"); >+ assertEquals(0, oldStyle.getFirstCell().getCol()); >+ assertEquals(0, oldStyle.getFirstCell().getRow()); >+ assertEquals(1, oldStyle.getLastCell().getCol()); >+ assertEquals(SpreadsheetVersion.EXCEL97.getLastRowIndex(), oldStyle.getLastCell().getRow()); >+ assertTrue(oldStyle.isWholeColumnReference()); >+ >+ AreaReference newStyle = AreaReference.getWholeColumn(SpreadsheetVersion.EXCEL2007, "A", "B"); >+ assertEquals(0, newStyle.getFirstCell().getCol()); >+ assertEquals(0, newStyle.getFirstCell().getRow()); >+ assertEquals(1, newStyle.getLastCell().getCol()); >+ assertEquals(SpreadsheetVersion.EXCEL2007.getLastRowIndex(), newStyle.getLastCell().getRow()); >+ assertTrue(newStyle.isWholeColumnReference()); >+ } >+ >+ public void testWholeRow() { >+ AreaReference oldStyle = AreaReference.getWholeRow(SpreadsheetVersion.EXCEL97, "1", "2"); >+ assertEquals(0, oldStyle.getFirstCell().getCol()); >+ assertEquals(0, oldStyle.getFirstCell().getRow()); >+ assertEquals(SpreadsheetVersion.EXCEL97.getLastColumnIndex(), oldStyle.getLastCell().getCol()); >+ assertEquals(1, oldStyle.getLastCell().getRow()); >+ >+ AreaReference newStyle = AreaReference.getWholeRow(SpreadsheetVersion.EXCEL2007, "1", "2"); >+ assertEquals(0, newStyle.getFirstCell().getCol()); >+ assertEquals(0, newStyle.getFirstCell().getRow()); >+ assertEquals(SpreadsheetVersion.EXCEL2007.getLastColumnIndex(), newStyle.getLastCell().getCol()); >+ assertEquals(1, newStyle.getLastCell().getRow()); >+ } >+ >+}
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 56328
:
31456
| 32737