]> source.dussan.org Git - poi.git/commitdiff
preserve leading and trailing white spaces in XSSFRichTextString, see Bugzilla 48070
authorYegor Kozlov <yegor@apache.org>
Wed, 28 Oct 2009 10:31:34 +0000 (10:31 +0000)
committerYegor Kozlov <yegor@apache.org>
Wed, 28 Oct 2009 10:31:34 +0000 (10:31 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@830492 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRichTextString.java
src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFRichTextString.java

index 99d07c91f4701124bdb30e7c1fe84e96c4d30355..76eafe8e2afca8553e0c0868777e2fd6b1427f39 100644 (file)
@@ -33,6 +33,7 @@
 
     <changes>
         <release version="3.6-beta1" date="2009-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">48070 - preserve leading and trailing white spaces in XSSFRichTextString</action>
            <action dev="POI-DEVELOPERS" type="add">48044 - added implementation for CountBlank function</action>
            <action dev="POI-DEVELOPERS" type="fix">48036 - added IntersectionEval to allow evaluation of the intersection formula operator</action>
            <action dev="POI-DEVELOPERS" type="fix">47999 - avoid un-needed call to the JVM Garbage Collector when working on OOXML OPC Packages</action>
index aa4e87f78e9f5e441901e3e11d494a09819cf845..fdf23ab9a6c576926ac01b3741d3adb6acdadf5b 100644 (file)
@@ -20,8 +20,11 @@ package org.apache.poi.xssf.usermodel;
 import org.apache.poi.ss.usermodel.Font;
 import org.apache.poi.ss.usermodel.RichTextString;
 import org.apache.poi.xssf.model.StylesTable;
+import org.apache.xmlbeans.XmlObject;
+import org.apache.xmlbeans.XmlCursor;
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.*;
 
+import javax.xml.namespace.QName;
 import java.util.ArrayList;
 
 
@@ -70,15 +73,16 @@ public class XSSFRichTextString implements RichTextString {
     private StylesTable styles;
 
     /**
-     * Create a rich text string and initialize it with empty string
+     * Create a rich text string
      */
     public XSSFRichTextString(String str) {
         st = CTRst.Factory.newInstance();
         st.setT(str);
+        preserveSpaces(st.xgetT());
     }
 
     /**
-     * Create empty rich text string
+     * Create empty rich text string and initialize it with empty string
      */
     public XSSFRichTextString() {
         st = CTRst.Factory.newInstance();
@@ -342,6 +346,7 @@ public class XSSFRichTextString implements RichTextString {
     public void setString(String s){
         clearFormatting();
         st.setT(s);
+        preserveSpaces(st.xgetT());
     }
 
     /**
@@ -461,4 +466,19 @@ public class XSSFRichTextString implements RichTextString {
 
         return ctFont;
     }
+
+    /**
+     * Add the xml:spaces="preserve" attribute if the string has leading or trailing white spaces
+     *
+     * @param xs    the string to check
+     */
+    protected static void preserveSpaces(STXstring xs) {
+        String text = xs.getStringValue();
+        if (text != null && (text.startsWith(" ") || text.endsWith(" "))) {
+            XmlCursor c = xs.newCursor();
+            c.toNextToken();
+            c.insertAttributeWithValue(new QName("http://www.w3.org/XML/1998/namespace", "space"), "preserve");
+            c.dispose();
+        }
+    }
 }
index 427a56ddddf808fe29a9e1dffecc29abea8302f2..e9830795990c7683e4715334a73230ae237b29ee 100644 (file)
@@ -20,6 +20,7 @@ package org.apache.poi.xssf.usermodel;
 import junit.framework.TestCase;
 
 import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst;
+import org.openxmlformats.schemas.spreadsheetml.x2006.main.STXstring;
 
 /**
  * Tests functionality of the XSSFRichTextRun object
@@ -115,4 +116,18 @@ public final class TestXSSFRichTextString extends TestCase {
         assertEquals(font2.getBold(), font2$.getBold());
         assertEquals(font2.getFontName(), font2$.getFontName());
     }
+
+    /**
+     * make sure we insert xml:space="preserve" attribute
+     * if a string has leading or trailing white spaces
+     */
+    public void testPreserveSpaces() {
+        XSSFRichTextString rt = new XSSFRichTextString("Apache");
+        CTRst ct = rt.getCTRst();
+        STXstring xs = ct.xgetT();
+        assertEquals("<xml-fragment>Apache</xml-fragment>", xs.xmlText());
+        rt.setString("  Apache");
+        assertEquals("<xml-fragment xml:space=\"preserve\">  Apache</xml-fragment>", xs.xmlText());
+
+    }
 }