Skip to content

Commit af23e15

Browse files
author
Yegor Kozlov
committed
Fixed XSSFWorkbook#setRepeatingRowsAndColumns to tolerate sheet names with quotes, see bugzilla #47294
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@783445 13f79535-47bb-0310-9956-ffa450edef68
1 parent c6134f5 commit af23e15

File tree

4 files changed

+19
-6
lines changed

4 files changed

+19
-6
lines changed

src/documentation/content/xdocs/status.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
<release version="3.5-beta7" date="2009-??-??">
3636
</release>
3737
<release version="3.5-beta6" date="2009-06-??">
38+
<action dev="POI-DEVELOPERS" type="fix">47294 - Fixed XSSFWorkbook#setRepeatingRowsAndColumns to tolerate sheet names with quotes</action>
3839
<action dev="POI-DEVELOPERS" type="fix">47309 - Fixed logic in HSSFCell.getCellComment to handle sheets with more than 65536 comments</action>
3940
<action dev="POI-DEVELOPERS" type="fix">46776 - Added clone() method to MulBlankRecord to fix crash in Sheet.cloneSheet()</action>
4041
<action dev="POI-DEVELOPERS" type="fix">47244 - Fixed HSSFSheet to handle missing header / footer records</action>

src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -944,15 +944,17 @@ private static String getReferenceBuiltInRecord(String sheetName, int startC, in
944944
CellReference colRef = new CellReference(sheetName, 0, startC, true, true);
945945
CellReference colRef2 = new CellReference(sheetName, 0, endC, true, true);
946946

947-
String c = "'" + sheetName + "'!$" + colRef.getCellRefParts()[2] + ":$" + colRef2.getCellRefParts()[2];
947+
String escapedName = SheetNameFormatter.format(sheetName);
948+
949+
String c = escapedName + "!$" + colRef.getCellRefParts()[2] + ":$" + colRef2.getCellRefParts()[2];
948950

949951
CellReference rowRef = new CellReference(sheetName, startR, 0, true, true);
950952
CellReference rowRef2 = new CellReference(sheetName, endR, 0, true, true);
951953

952954
String r = "";
953955

954956
if (!rowRef.getCellRefParts()[1].equals("0") && !rowRef2.getCellRefParts()[1].equals("0")) {
955-
r = ",'" + sheetName + "'!$" + rowRef.getCellRefParts()[1] + ":$" + rowRef2.getCellRefParts()[1];
957+
r = "," + escapedName + "!$" + rowRef.getCellRefParts()[1] + ":$" + rowRef2.getCellRefParts()[1];
956958
}
957959
return c + r;
958960
}

src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFName.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public void testRepeatingRowsAndColums() {
3737
// First test that setting RR&C for same sheet more than once only creates a
3838
// single Print_Titles built-in record
3939
XSSFWorkbook wb = getTestDataProvider().createWorkbook();
40-
XSSFSheet sheet = wb.createSheet("FirstSheet");
40+
XSSFSheet sheet = wb.createSheet("First Sheet");
4141

4242
// set repeating rows and columns twice for the first sheet
4343
for (int i = 0; i < 2; i++) {
@@ -48,7 +48,7 @@ public void testRepeatingRowsAndColums() {
4848
XSSFName nr1 = wb.getNameAt(0);
4949

5050
assertEquals(XSSFName.BUILTIN_PRINT_TITLE, nr1.getNameName());
51-
assertEquals("'FirstSheet'!$A:$A,'FirstSheet'!$1:$4", nr1.getRefersToFormula());
51+
assertEquals("'First Sheet'!$A:$A,'First Sheet'!$1:$4", nr1.getRefersToFormula());
5252

5353
// Save and re-open
5454
XSSFWorkbook nwb = XSSFTestDataSamples.writeOutAndReadBack(wb);
@@ -57,7 +57,7 @@ public void testRepeatingRowsAndColums() {
5757
nr1 = nwb.getNameAt(0);
5858

5959
assertEquals(XSSFName.BUILTIN_PRINT_TITLE, nr1.getNameName());
60-
assertEquals("'FirstSheet'!$A:$A,'FirstSheet'!$1:$4", nr1.getRefersToFormula());
60+
assertEquals("'First Sheet'!$A:$A,'First Sheet'!$1:$4", nr1.getRefersToFormula());
6161

6262
// check that setting RR&C on a second sheet causes a new Print_Titles built-in
6363
// name to be created
@@ -68,7 +68,7 @@ public void testRepeatingRowsAndColums() {
6868
XSSFName nr2 = nwb.getNameAt(1);
6969

7070
assertEquals(XSSFName.BUILTIN_PRINT_TITLE, nr2.getNameName());
71-
assertEquals("'SecondSheet'!$B:$C,'SecondSheet'!$1:$1", nr2.getRefersToFormula());
71+
assertEquals("SecondSheet!$B:$C,SecondSheet!$1:$1", nr2.getRefersToFormula());
7272

7373
nwb.setRepeatingRowsAndColumns(1, -1, -1, -1, -1);
7474
}

src/testcases/org/apache/poi/ss/usermodel/BaseTestWorkbook.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,16 @@ public void testParentReferences(){
293293
assertSame(row, cell.getRow());
294294
}
295295

296+
public void testSetRepeatingRowsAnsColumns(){
297+
Workbook wb = getTestDataProvider().createWorkbook();
298+
Sheet sheet1 = wb.createSheet();
299+
wb.setRepeatingRowsAndColumns(wb.getSheetIndex(sheet1), 0, 0, 0, 3);
300+
301+
//must handle sheets with quotas, see Bugzilla #47294
302+
Sheet sheet2 = wb.createSheet("My' Sheet");
303+
wb.setRepeatingRowsAndColumns(wb.getSheetIndex(sheet2), 0, 0, 0, 3);
304+
}
305+
296306
/**
297307
* Tests that all of the unicode capable string fields can be set, written and then read back
298308
*/

0 commit comments

Comments
 (0)