]> source.dussan.org Git - poi.git/commitdiff
Fix bug #49941 - Correctly handle space preservation of XSSFRichTextRuns when applyin...
authorNick Burch <nick@apache.org>
Thu, 16 Sep 2010 16:01:12 +0000 (16:01 +0000)
committerNick Burch <nick@apache.org>
Thu, 16 Sep 2010 16:01:12 +0000 (16:01 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@997811 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/TestXSSFBugs.java

index 8d05120a9769269d9d5351b94076311a80e10d9a..1332578fff9267140f5088e192ceddb1e3182ae2 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.7-beta3" date="2010-??-??">
+           <action dev="poi-developers" type="fix">49941 - Correctly handle space preservation of XSSFRichTextRuns when applying fonts to parts of the string</action>
            <action dev="poi-developers" type="fix">Correct XWPFRun detection of bold/italic in a paragraph with multiple runs of different styles</action>
            <action dev="poi-developers" type="add">Link XWPFPicture to XWPFRun, so that embedded pictures can be access from where they live in the text stream</action>
            <action dev="poi-developers" type="fix">Improve handling of Hyperlinks inside XWPFParagraph objects through XWPFHyperlinkRun</action>
index 736a15b3ad81895946e37a8e92c53cebee832f47..c406a9b9dee64d68c45d6119c4fe03dde1775ab5 100644 (file)
@@ -193,6 +193,7 @@ public class XSSFRichTextString implements RichTextString {
                 c.setT(txt);
                 runs.add(c);
                 pos += txt.length();
+                preserveSpaces(c.xgetT());
             }
         }
 
index 9c451034c463a172f3179353ccbe7ec5b6147ca8..6e9583826f706e00b173d5022b8d2ecdaf76a539 100644 (file)
@@ -26,7 +26,16 @@ import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.openxml4j.opc.OPCPackage;
 import org.apache.poi.openxml4j.opc.PackagePart;
 import org.apache.poi.openxml4j.opc.PackagingURIHelper;
-import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.usermodel.BaseTestBugzillaIssues;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.DataFormatter;
+import org.apache.poi.ss.usermodel.Font;
+import org.apache.poi.ss.usermodel.FormulaError;
+import org.apache.poi.ss.usermodel.FormulaEvaluator;
+import org.apache.poi.ss.usermodel.Name;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.xssf.XSSFITestDataProvider;
 import org.apache.poi.xssf.XSSFTestDataSamples;
 import org.apache.poi.xssf.usermodel.extensions.XSSFCellFill;
@@ -431,6 +440,84 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
         assertEquals("#REF!", FormulaError.forInt(cell.getErrorCellValue()).getString());
     }
     
+    /**
+     * Creating a rich string of "hello world" and applying
+     *  a font to characters 1-5 means we have two strings,
+     *  "hello" and " world". As such, we need to apply
+     *  preserve spaces to the 2nd bit, lest we end up
+     *  with something like "helloworld" !
+     */
+    public void test49941() throws Exception {
+       XSSFWorkbook wb = new XSSFWorkbook();
+       XSSFSheet s = wb.createSheet();
+       XSSFRow r = s.createRow(0);
+       XSSFCell c = r.createCell(0);
+       
+       // First without fonts
+       c.setCellValue(
+             new XSSFRichTextString(" with spaces ")
+       );
+       assertEquals(" with spaces ", c.getRichStringCellValue().toString());
+       assertEquals(0, c.getRichStringCellValue().getCTRst().sizeOfRArray());
+       assertEquals(true, c.getRichStringCellValue().getCTRst().isSetT());
+       // Should have the preserve set
+       assertEquals(
+             1,
+             c.getRichStringCellValue().getCTRst().xgetT().getDomNode().getAttributes().getLength()
+       );
+       assertEquals(
+             "preserve",
+             c.getRichStringCellValue().getCTRst().xgetT().getDomNode().getAttributes().item(0).getNodeValue()
+       );
+       
+       // Save and check
+       wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
+       s = wb.getSheetAt(0);
+       r = s.getRow(0);
+       c = r.getCell(0);
+       assertEquals(" with spaces ", c.getRichStringCellValue().toString());
+       assertEquals(0, c.getRichStringCellValue().getCTRst().sizeOfRArray());
+       assertEquals(true, c.getRichStringCellValue().getCTRst().isSetT());
+       
+       // Change the string
+       c.setCellValue(
+             new XSSFRichTextString("hello world")
+       );
+       assertEquals("hello world", c.getRichStringCellValue().toString());
+       // Won't have preserve
+       assertEquals(
+             0,
+             c.getRichStringCellValue().getCTRst().xgetT().getDomNode().getAttributes().getLength()
+       );
+       
+       // Apply a font
+       XSSFFont f = wb.createFont();
+       f.setBold(true);
+       c.getRichStringCellValue().applyFont(0, 5, f);
+       assertEquals("hello world", c.getRichStringCellValue().toString());
+       // Does need preserving on the 2nd part
+       assertEquals(2, c.getRichStringCellValue().getCTRst().sizeOfRArray());
+       assertEquals(
+             0,
+             c.getRichStringCellValue().getCTRst().getRArray(0).xgetT().getDomNode().getAttributes().getLength()
+       );
+       assertEquals(
+             1,
+             c.getRichStringCellValue().getCTRst().getRArray(1).xgetT().getDomNode().getAttributes().getLength()
+       );
+       assertEquals(
+             "preserve",
+             c.getRichStringCellValue().getCTRst().getRArray(1).xgetT().getDomNode().getAttributes().item(0).getNodeValue()
+       );
+       
+       // Save and check
+       wb = XSSFTestDataSamples.writeOutAndReadBack(wb);
+       s = wb.getSheetAt(0);
+       r = s.getRow(0);
+       c = r.getCell(0);
+       assertEquals("hello world", c.getRichStringCellValue().toString());
+    }
+    
     /**
      * Repeatedly writing the same file which has styles
      * TODO Currently failing