DOCX generation: POI OOXML trims spaces from string
I'm trying to generate a docx-document using poi-ooxml. The following code produces almost the document I want, but for some reason it removes end and start spaces from the text.
XWPFDocument document = new XWPFDocument();
XWPFParagraph paragraph1 = document.createParagraph();
XWPFRun para1run1 = paragraph1.createRun();
para1run1.setText("Dette er ein tekst med space på slutten. Den har ein ");
XWPFRun para1run2 = paragraph1.createRun();
para1run2.setText("utheva tekst");
para1run2.setBold(true);
XWPFRun para1run3 = paragraph1.createRun();
para1run3.setText(" før ein tekst med space i byrjinga. Denne paragrafen skal også ha litt tekst slik at den blir ganske lang og går over fleire linjer.");
XWPFParagraph paragraph2 = document.createParagraph();
XWPFRun para2run1 = paragraph2.createRun();
para2run1.setText("Dette er ein tekst med space på slutten. Den har ein ");
XWPFRun para2run2 = paragraph2.createRun();
para2run2.setText("kursiv tekst");
para2run2.setItalic(true);
XWPFRun para2run3 = paragraph2.createRun();
para2run3.setText(" før ein tekst med space i byrjinga. Denne paragrafen skal også ha litt tekst slik at den blir ganske lang og går over fleire linjer.");
document.write(new FileOutputStream("c:/tmp/doc/docxtest.docx"));
The code generates the document, but the spaces before and after the texts "utheva tekst" and "kursiv tekst" are removed, and the end result looks like this:
Dette er ein tekst med space på slutten. Den har einutheva tekstfør ein tekst med space i byrjinga. Denne paragrafen skal også ha litt tekst slik at den blir ganske lang og går over fleire linjer.
Dette er ein tekst med space på slutten. Den har einkursiv tekstfør ein tekst med space i byrjing开发者_开发知识库a. Denne paragrafen skal også ha litt tekst slik at den blir ganske lang og går over fleire linjer.
Where "utheva tekst" is bold and "kursiv tekst" is italic.
Any help on this will be very useful.
Whether you use poi or docx4j, I expect you need @xml:space ie
<w:t xml:space="preserve">
In docx4j, there is a method setSpace(String value) for setting this.
I know this is a really old question, but I've just had a similar issue and managed to figure it out using the hint given by JasonPlutext.
Instead of setting the text on the run directly, you need to use this:
XWPFRun firstBit = para.createRun();
CTText firstBitText = linkPrefix.getCTR().addNewT();
linkPrefixText.setStringValue("This is the first half of text with trailing space ");
linkPrefixText.setSpace(SpaceAttribute.Space.PRESERVE);
para.createRun().setText("and here is more text that doesn't need space preserved");
Which will give you
This is the first half of text with trailing space and here is more text that doesn't need space preserved
rather than
This is the first half of text with trailing spaceand here is more text that doesn't need space preserved
You should still be able to set the formatting on the run directly.
精彩评论