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>
<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>

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.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();
}
}
}

View 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());
}
}