diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index d2d7aebf8..57161cd5a 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 52745 - fixed XSSFRichtextString.append to preserve leading / trailing spaces 52716 - tolerate hyperlinks that have neither location nor relation 52599 - avoid duplicate text when rendering slides in HSLF 52598 - respect slide background when rendering slides in HSLF diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRichTextString.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRichTextString.java index e3ed3223a..39911f393 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRichTextString.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFRichTextString.java @@ -194,11 +194,14 @@ public class XSSFRichTextString implements RichTextString { public void append(String text, XSSFFont font){ if(st.sizeOfRArray() == 0 && st.isSetT()) { //convert string into a text run: string - st.addNewR().setT(st.getT()); + CTRElt lt = st.addNewR(); + lt.setT(st.getT()); + preserveSpaces(lt.xgetT()); st.unsetT(); } CTRElt lt = st.addNewR(); lt.setT(text); + preserveSpaces(lt.xgetT()); CTRPrElt pr = lt.addNewRPr(); if(font != null) setRunAttributes(font.getCTFont(), pr); } @@ -392,7 +395,7 @@ public class XSSFRichTextString implements RichTextString { if(st.sizeOfRArray() > 0) { for (CTRElt r : st.getRArray()) { CTRPrElt pr = r.getRPr(); - if(pr != null){ + if(pr != null && pr.sizeOfRFontArray() > 0){ String fontName = pr.getRFontArray(0).getVal(); if(fontName.startsWith("#")){ int idx = Integer.parseInt(fontName.substring(1)); diff --git a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFRichTextString.java b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFRichTextString.java index 30f794882..481c56dd6 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFRichTextString.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFRichTextString.java @@ -140,6 +140,12 @@ public final class TestXSSFRichTextString extends TestCase { rt.setString(" Apache"); assertEquals(" Apache", xs.xmlText()); + rt.append(" POI"); + rt.append(" "); + assertEquals(" Apache POI ", rt.getString()); + assertEquals(" Apache", rt.getCTRst().getRArray(0).xgetT().xmlText()); + assertEquals(" POI", rt.getCTRst().getRArray(1).xgetT().xmlText()); + assertEquals(" ", rt.getCTRst().getRArray(2).xgetT().xmlText()); } /**