preserve leading and trailing white spaces in XSSFRichTextString, see Bugzilla 48070

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@830492 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Yegor Kozlov 2009-10-28 10:31:34 +00:00
parent fe00a182a7
commit ab1748ab50
3 changed files with 38 additions and 2 deletions

View File

@ -33,6 +33,7 @@
<changes> <changes>
<release version="3.6-beta1" date="2009-??-??"> <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="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">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> <action dev="POI-DEVELOPERS" type="fix">47999 - avoid un-needed call to the JVM Garbage Collector when working on OOXML OPC Packages</action>

View File

@ -20,8 +20,11 @@ package org.apache.poi.xssf.usermodel;
import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.RichTextString; import org.apache.poi.ss.usermodel.RichTextString;
import org.apache.poi.xssf.model.StylesTable; 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 org.openxmlformats.schemas.spreadsheetml.x2006.main.*;
import javax.xml.namespace.QName;
import java.util.ArrayList; import java.util.ArrayList;
@ -70,15 +73,16 @@ public class XSSFRichTextString implements RichTextString {
private StylesTable styles; private StylesTable styles;
/** /**
* Create a rich text string and initialize it with empty string * Create a rich text string
*/ */
public XSSFRichTextString(String str) { public XSSFRichTextString(String str) {
st = CTRst.Factory.newInstance(); st = CTRst.Factory.newInstance();
st.setT(str); st.setT(str);
preserveSpaces(st.xgetT());
} }
/** /**
* Create empty rich text string * Create empty rich text string and initialize it with empty string
*/ */
public XSSFRichTextString() { public XSSFRichTextString() {
st = CTRst.Factory.newInstance(); st = CTRst.Factory.newInstance();
@ -342,6 +346,7 @@ public class XSSFRichTextString implements RichTextString {
public void setString(String s){ public void setString(String s){
clearFormatting(); clearFormatting();
st.setT(s); st.setT(s);
preserveSpaces(st.xgetT());
} }
/** /**
@ -461,4 +466,19 @@ public class XSSFRichTextString implements RichTextString {
return ctFont; 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();
}
}
} }

View File

@ -20,6 +20,7 @@ package org.apache.poi.xssf.usermodel;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRst;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STXstring;
/** /**
* Tests functionality of the XSSFRichTextRun object * Tests functionality of the XSSFRichTextRun object
@ -115,4 +116,18 @@ public final class TestXSSFRichTextString extends TestCase {
assertEquals(font2.getBold(), font2$.getBold()); assertEquals(font2.getBold(), font2$.getBold());
assertEquals(font2.getFontName(), font2$.getFontName()); 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());
}
} }