Fix bug #50718 - More helpful error message when you try to create a CellReference with #REF!

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1078039 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2011-03-04 16:17:21 +00:00
parent 93e7799a7b
commit 18153d96ef
4 changed files with 23 additions and 2 deletions

View File

@ -34,6 +34,7 @@
<changes> <changes>
<release version="3.8-beta2" date="2011-??-??"> <release version="3.8-beta2" date="2011-??-??">
<action dev="poi-developers" type="fix">50718 - More helpful error message when you try to create a CellReference with #REF!</action>
<action dev="poi-developers" type="fix">50784 - XSSFColors return by XSSFFont now have theme information applied to them</action> <action dev="poi-developers" type="fix">50784 - XSSFColors return by XSSFFont now have theme information applied to them</action>
<action dev="poi-developers" type="fix">50846 - Improve how XSSFColor inherits from Themes</action> <action dev="poi-developers" type="fix">50846 - Improve how XSSFColor inherits from Themes</action>
<action dev="poi-developers" type="fix">50847 - XSSFFont now accepts the full range of Charsets from FontChartset</action> <action dev="poi-developers" type="fix">50847 - XSSFFont now accepts the full range of Charsets from FontChartset</action>

View File

@ -85,6 +85,10 @@ public class CellReference {
* delimited and escaped as per normal syntax rules for formulas. * delimited and escaped as per normal syntax rules for formulas.
*/ */
public CellReference(String cellRef) { public CellReference(String cellRef) {
if(cellRef.endsWith("#REF!")) {
throw new IllegalArgumentException("Cell reference invalid: " + cellRef);
}
String[] parts = separateRefParts(cellRef); String[] parts = separateRefParts(cellRef);
_sheetName = parts[0]; _sheetName = parts[0];
String colRef = parts[1]; String colRef = parts[1];
@ -335,7 +339,6 @@ public class CellReference {
* name still in ALPHA-26 number format. The third element is the row. * name still in ALPHA-26 number format. The third element is the row.
*/ */
private static String[] separateRefParts(String reference) { private static String[] separateRefParts(String reference) {
int plingPos = reference.lastIndexOf(SHEET_NAME_DELIMITER); int plingPos = reference.lastIndexOf(SHEET_NAME_DELIMITER);
String sheetName = parseSheetName(reference, plingPos); String sheetName = parseSheetName(reference, plingPos);
int start = plingPos+1; int start = plingPos+1;

View File

@ -231,7 +231,7 @@ public final class TestHSSFName extends BaseTestNamedRange {
try { try {
new AreaReference(name2.getRefersToFormula()); new AreaReference(name2.getRefersToFormula());
fail("attempt to supply an invalid reference to AreaReference constructor results in exception"); fail("attempt to supply an invalid reference to AreaReference constructor results in exception");
} catch (StringIndexOutOfBoundsException e) { // TODO - use a different exception for this condition } catch (IllegalArgumentException e) { // TODO - use a stronger typed exception for this condition
// expected during successful test // expected during successful test
} }
} }

View File

@ -193,6 +193,23 @@ public final class TestCellReference extends TestCase {
confirmCrInRange(false, "A", "0", v2007); confirmCrInRange(false, "A", "0", v2007);
} }
public void testInvalidReference() {
try {
new CellReference("Sheet1!#REF!");
fail("Shouldn't be able to create a #REF! refence");
} catch(IllegalArgumentException e) {}
try {
new CellReference("'MySheetName'!#REF!");
fail("Shouldn't be able to create a #REF! refence");
} catch(IllegalArgumentException e) {}
try {
new CellReference("#REF!");
fail("Shouldn't be able to create a #REF! refence");
} catch(IllegalArgumentException e) {}
}
private static void confirmCrInRange(boolean expResult, String colStr, String rowStr, private static void confirmCrInRange(boolean expResult, String colStr, String rowStr,
SpreadsheetVersion sv) { SpreadsheetVersion sv) {
if (expResult == CellReference.cellReferenceIsWithinRange(colStr, rowStr, sv)) { if (expResult == CellReference.cellReferenceIsWithinRange(colStr, rowStr, sv)) {