From 068c820ef432a7e5e2de549e5471979ffbcf9ea3 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Sun, 13 Jan 2019 17:14:05 +0000 Subject: [PATCH] Bug 62810: AreaReference ctor looses sheet name if rows or columns swapped git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1851209 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/poi/ss/util/AreaReference.java | 16 +++++++--- .../poi/hssf/util/TestAreaReference.java | 20 ++++++------ .../apache/poi/ss/util/TestAreaReference.java | 32 ++++++++++++++++--- 3 files changed, 50 insertions(+), 18 deletions(-) diff --git a/src/java/org/apache/poi/ss/util/AreaReference.java b/src/java/org/apache/poi/ss/util/AreaReference.java index 821413af11..4dd4771be6 100644 --- a/src/java/org/apache/poi/ss/util/AreaReference.java +++ b/src/java/org/apache/poi/ss/util/AreaReference.java @@ -113,6 +113,8 @@ public class AreaReference { boolean swapRows = topLeft.getRow() > botRight.getRow(); boolean swapCols = topLeft.getCol() > botRight.getCol(); if (swapRows || swapCols) { + String firstSheet; + String lastSheet; int firstRow; int lastRow; int firstColumn; @@ -133,18 +135,22 @@ public class AreaReference { lastRowAbs = botRight.isRowAbsolute(); } if (swapCols) { + firstSheet = botRight.getSheetName(); firstColumn = botRight.getCol(); firstColAbs = botRight.isColAbsolute(); + lastSheet = topLeft.getSheetName(); lastColumn = topLeft.getCol(); lastColAbs = topLeft.isColAbsolute(); } else { + firstSheet = topLeft.getSheetName(); firstColumn = topLeft.getCol(); firstColAbs = topLeft.isColAbsolute(); + lastSheet = botRight.getSheetName(); lastColumn = botRight.getCol(); lastColAbs = botRight.isColAbsolute(); } - _firstCell = new CellReference(firstRow, firstColumn, firstRowAbs, firstColAbs); - _lastCell = new CellReference(lastRow, lastColumn, lastRowAbs, lastColAbs); + _firstCell = new CellReference(firstSheet, firstRow, firstColumn, firstRowAbs, firstColAbs); + _lastCell = new CellReference(lastSheet, lastRow, lastColumn, lastRowAbs, lastColAbs); } else { _firstCell = topLeft; _lastCell = botRight; @@ -220,7 +226,7 @@ public class AreaReference { new AreaReference(st.nextToken(), version) ); } - return refs.toArray(new AreaReference[refs.size()]); + return refs.toArray(new AreaReference[0]); } /** @@ -271,7 +277,7 @@ public class AreaReference { refs.add(ref); } } - return refs.toArray(new CellReference[refs.size()]); + return refs.toArray(new CellReference[0]); } /** @@ -316,7 +322,7 @@ public class AreaReference { try { sb.append(formatAsString()); } catch(Exception e) { - sb.append(e.toString()); + sb.append(e); } sb.append(']'); return sb.toString(); diff --git a/src/testcases/org/apache/poi/hssf/util/TestAreaReference.java b/src/testcases/org/apache/poi/hssf/util/TestAreaReference.java index 8668b95688..4594cf5655 100644 --- a/src/testcases/org/apache/poi/hssf/util/TestAreaReference.java +++ b/src/testcases/org/apache/poi/hssf/util/TestAreaReference.java @@ -46,18 +46,18 @@ public final class TestAreaReference extends TestCase { AreaReference ar = new AreaReference("$A$1:$B$2", SpreadsheetVersion.EXCEL97); assertFalse("Two cells expected", ar.isSingleCell()); CellReference cf = ar.getFirstCell(); - assertTrue("row is 4",cf.getRow()==0); - assertTrue("col is 1",cf.getCol()==0); + assertEquals("row is 4", 0, cf.getRow()); + assertEquals("col is 1", 0, cf.getCol()); assertTrue("row is abs",cf.isRowAbsolute()); assertTrue("col is abs",cf.isColAbsolute()); - assertTrue("string is $A$1",cf.formatAsString().equals("$A$1")); + assertEquals("string is $A$1", "$A$1", cf.formatAsString()); cf = ar.getLastCell(); - assertTrue("row is 4",cf.getRow()==1); - assertTrue("col is 1",cf.getCol()==1); + assertEquals("row is 4", 1, cf.getRow()); + assertEquals("col is 1", 1, cf.getCol()); assertTrue("row is abs",cf.isRowAbsolute()); assertTrue("col is abs",cf.isColAbsolute()); - assertTrue("string is $B$2",cf.formatAsString().equals("$B$2")); + assertEquals("string is $B$2", "$B$2", cf.formatAsString()); CellReference[] refs = ar.getAllReferencedCells(); assertEquals(4, refs.length); @@ -225,11 +225,13 @@ public final class TestAreaReference extends TestCase { HSSFName aNamedCell = wb.getNameAt(idx); // Should have 2 references - assertEquals(ref, aNamedCell.getRefersToFormula()); + String formulaRefs = aNamedCell.getRefersToFormula(); + assertNotNull(formulaRefs); + assertEquals(ref, formulaRefs); // Check the parsing of the reference into cells - assertFalse(AreaReference.isContiguous(aNamedCell.getRefersToFormula())); - AreaReference[] arefs = AreaReference.generateContiguous(SpreadsheetVersion.EXCEL97, aNamedCell.getRefersToFormula()); + assertFalse(AreaReference.isContiguous(formulaRefs)); + AreaReference[] arefs = AreaReference.generateContiguous(SpreadsheetVersion.EXCEL97, formulaRefs); assertEquals(2, arefs.length); assertEquals(refA, arefs[0].formatAsString()); assertEquals(refB, arefs[1].formatAsString()); diff --git a/src/testcases/org/apache/poi/ss/util/TestAreaReference.java b/src/testcases/org/apache/poi/ss/util/TestAreaReference.java index d8416972c1..d15dd5f7dd 100644 --- a/src/testcases/org/apache/poi/ss/util/TestAreaReference.java +++ b/src/testcases/org/apache/poi/ss/util/TestAreaReference.java @@ -16,17 +16,24 @@ ==================================================================== */ package org.apache.poi.ss.util; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.SpreadsheetVersion; -import junit.framework.TestCase; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; /** * Test for {@link AreaReference} handling of max rows. * * @author David North */ -public class TestAreaReference extends TestCase { - +public class TestAreaReference { + @Test public void testWholeColumn() { AreaReference oldStyle = AreaReference.getWholeColumn(SpreadsheetVersion.EXCEL97, "A", "B"); assertEquals(0, oldStyle.getFirstCell().getCol()); @@ -48,7 +55,8 @@ public class TestAreaReference extends TestCase { AreaReference newStyleNonWholeColumn = new AreaReference("A1:B23", SpreadsheetVersion.EXCEL2007); assertFalse(newStyleNonWholeColumn.isWholeColumnReference()); } - + + @Test public void testWholeRow() { AreaReference oldStyle = AreaReference.getWholeRow(SpreadsheetVersion.EXCEL97, "1", "2"); assertEquals(0, oldStyle.getFirstCell().getCol()); @@ -62,4 +70,20 @@ public class TestAreaReference extends TestCase { assertEquals(SpreadsheetVersion.EXCEL2007.getLastColumnIndex(), newStyle.getLastCell().getCol()); assertEquals(1, newStyle.getLastCell().getRow()); } + + @Test + public void test62810() { + final Workbook wb = new HSSFWorkbook(); + final Sheet sheet = wb.createSheet("Ctor test"); + final String sheetName = sheet.getSheetName(); + final CellReference topLeft = new CellReference(sheetName, 1, 1, true, true); + final CellReference bottomRight = new CellReference(sheetName, 5, 10, true, true); + final AreaReference goodAreaRef = new AreaReference(topLeft, bottomRight, SpreadsheetVersion.EXCEL2007); + final AreaReference badAreaRef = new AreaReference(bottomRight, topLeft, SpreadsheetVersion.EXCEL2007); + + assertEquals("'Ctor test'!$B$2", topLeft.formatAsString()); + assertEquals("'Ctor test'!$K$6", bottomRight.formatAsString()); + assertEquals("'Ctor test'!$B$2:$K$6", goodAreaRef.formatAsString()); + assertEquals("'Ctor test'!$B$2:$K$6", badAreaRef.formatAsString()); + } } -- 2.39.5