]> source.dussan.org Git - poi.git/commitdiff
XSSF Pxgs must escape sheet names where required when generating the formula string
authorNick Burch <nick@apache.org>
Sun, 20 Jul 2014 18:53:27 +0000 (18:53 +0000)
committerNick Burch <nick@apache.org>
Sun, 20 Jul 2014 18:53:27 +0000 (18:53 +0000)
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
src/java/org/apache/poi/ss/formula/ptg/Deleted3DPxg.java
src/java/org/apache/poi/ss/formula/ptg/NameXPxg.java
src/java/org/apache/poi/ss/formula/ptg/Ref3DPxg.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFFormulaParser.java

index b02f3e18455ee81569c6998c961e5e881a5b8a56..9fce295ac4b48a4cacc02378a6cfb0b17b267684 100644 (file)
@@ -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();
index 147b329b7004bc0bdcaf57dba0c273fc9bc42f5b..c8cdd3ec3784a0a43509ebe2ece3cdb82a2cd926 100644 (file)
@@ -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));
index bac4fbee2c6532a8c04159c954c84513ac3e5c16..165579032708ed0cef7b9c6812bff6f48955deb3 100644 (file)
@@ -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);
index 9a2dc606f6099df09c737fceff10fdabdc0de408..d851b4474b7c8fadeb1b44bdd5ab48df0e817ebe 100644 (file)
@@ -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();
index 1da7b27ec5614de5ae0450e68408b0259a96fcf2..d18705eb28e27ebe2d35e888953174319c69cc49 100644 (file)
@@ -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);