From a550397ac2cb2a0b1e0478523aeb43ebd224f79a Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Sun, 20 Jul 2014 18:53:27 +0000 Subject: [PATCH] XSSF Pxgs must escape sheet names where required when generating the formula string git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1612150 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/poi/ss/formula/ptg/Area3DPxg.java | 3 ++- src/java/org/apache/poi/ss/formula/ptg/Deleted3DPxg.java | 3 ++- src/java/org/apache/poi/ss/formula/ptg/NameXPxg.java | 3 ++- src/java/org/apache/poi/ss/formula/ptg/Ref3DPxg.java | 5 ++++- .../apache/poi/xssf/usermodel/TestXSSFFormulaParser.java | 9 +++++++++ 5 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/poi/ss/formula/ptg/Area3DPxg.java b/src/java/org/apache/poi/ss/formula/ptg/Area3DPxg.java index b02f3e184..9fce295ac 100644 --- a/src/java/org/apache/poi/ss/formula/ptg/Area3DPxg.java +++ b/src/java/org/apache/poi/ss/formula/ptg/Area3DPxg.java @@ -17,6 +17,7 @@ package org.apache.poi.ss.formula.ptg; +import org.apache.poi.ss.formula.SheetNameFormatter; import org.apache.poi.ss.util.AreaReference; import org.apache.poi.util.LittleEndianOutput; @@ -87,7 +88,7 @@ public final class Area3DPxg extends AreaPtgBase implements Pxg { sb.append(externalWorkbookNumber); sb.append(']'); } - sb.append(sheetName); + SheetNameFormatter.appendFormat(sb, sheetName); sb.append('!'); sb.append(formatReferenceAsString()); return sb.toString(); diff --git a/src/java/org/apache/poi/ss/formula/ptg/Deleted3DPxg.java b/src/java/org/apache/poi/ss/formula/ptg/Deleted3DPxg.java index 147b329b7..c8cdd3ec3 100644 --- a/src/java/org/apache/poi/ss/formula/ptg/Deleted3DPxg.java +++ b/src/java/org/apache/poi/ss/formula/ptg/Deleted3DPxg.java @@ -17,6 +17,7 @@ package org.apache.poi.ss.formula.ptg; +import org.apache.poi.ss.formula.SheetNameFormatter; import org.apache.poi.ss.usermodel.ErrorConstants; import org.apache.poi.util.LittleEndianOutput; @@ -71,7 +72,7 @@ public final class Deleted3DPxg extends OperandPtg implements Pxg { sb.append(']'); } if (sheetName != null) { - sb.append(sheetName); + SheetNameFormatter.appendFormat(sb, sheetName); } sb.append('!'); sb.append(ErrorConstants.getText(ErrorConstants.ERROR_REF)); diff --git a/src/java/org/apache/poi/ss/formula/ptg/NameXPxg.java b/src/java/org/apache/poi/ss/formula/ptg/NameXPxg.java index bac4fbee2..165579032 100644 --- a/src/java/org/apache/poi/ss/formula/ptg/NameXPxg.java +++ b/src/java/org/apache/poi/ss/formula/ptg/NameXPxg.java @@ -17,6 +17,7 @@ package org.apache.poi.ss.formula.ptg; +import org.apache.poi.ss.formula.SheetNameFormatter; import org.apache.poi.util.LittleEndianOutput; /** @@ -79,7 +80,7 @@ public final class NameXPxg extends OperandPtg implements Pxg { sb.append(']'); } if (sheetName != null) { - sb.append(sheetName); + SheetNameFormatter.appendFormat(sb, sheetName); } sb.append('!'); sb.append(nameName); diff --git a/src/java/org/apache/poi/ss/formula/ptg/Ref3DPxg.java b/src/java/org/apache/poi/ss/formula/ptg/Ref3DPxg.java index 9a2dc606f..d851b4474 100644 --- a/src/java/org/apache/poi/ss/formula/ptg/Ref3DPxg.java +++ b/src/java/org/apache/poi/ss/formula/ptg/Ref3DPxg.java @@ -17,6 +17,7 @@ package org.apache.poi.ss.formula.ptg; +import org.apache.poi.ss.formula.SheetNameFormatter; import org.apache.poi.ss.util.CellReference; import org.apache.poi.util.LittleEndianOutput; @@ -86,7 +87,9 @@ public final class Ref3DPxg extends RefPtgBase implements Pxg { sb.append(externalWorkbookNumber); sb.append(']'); } - sb.append(sheetName); + if (sheetName != null) { + SheetNameFormatter.appendFormat(sb, sheetName); + } sb.append('!'); sb.append(formatReferenceAsString()); return sb.toString(); diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaParser.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaParser.java index 1da7b27ec..d18705eb2 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaParser.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaParser.java @@ -130,6 +130,15 @@ public final class TestXSSFFormulaParser { assertEquals("A1", ((Ref3DPxg)ptgs[0]).format2DRefAsString()); assertEquals("Uses!A1", ((Ref3DPxg)ptgs[0]).toFormulaString()); + // Reference to a single cell in a different sheet, which needs quoting + ptgs = parse(fpb, "'Testing 47100'!A1"); + assertEquals(1, ptgs.length); + assertEquals(Ref3DPxg.class, ptgs[0].getClass()); + assertEquals(-1, ((Ref3DPxg)ptgs[0]).getExternalWorkbookNumber()); + assertEquals("Testing 47100", ((Ref3DPxg)ptgs[0]).getSheetName()); + assertEquals("A1", ((Ref3DPxg)ptgs[0]).format2DRefAsString()); + assertEquals("'Testing 47100'!A1", ((Ref3DPxg)ptgs[0]).toFormulaString()); + // Reference to a sheet scoped named range from another sheet ptgs = parse(fpb, "Defines!NR_To_A1"); assertEquals(1, ptgs.length);