Как применить новую строку при создании файла docx с помощью DOCX4J

По учебникам, которые я видел. Я научился добавлять текст при создании файла docx. но потом каждый раз, когда я добавляю строку текста. Я заметил, что между первой строкой текста и второй строкой текста всегда есть пробел. так же, как дважды нажать клавишу ввода. Я знаю, что основная причина в том, что каждый раз, когда я добавляю строку текста, я использую абзац. и абзац начинается с пробела после другого абзаца.

Вот как я добавляю текст

ObjectFactory factory;
factory = Context.getWmlObjectFactory();
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
P spc = factory.createP();
R rspc = factory.createR();
rspc.getContent().add(wordMLPackage.getMainDocumentPart().createParagraphOfText("sample"));
spc.getContent().add(rspc);

java.io.InputStream is = new java.io.FileInputStream(file);
wordMLPackage.getMainDocumentPart().addObject(spc);

поэтому этот код успешно работает и выдает правильный результат. но когда я добавляю еще один абзац. или текст. я хочу, чтобы это было только под первой строкой текста. есть ли способ добавить простую строку текста без использования абзаца? заранее спасибо

РЕДАКТИРОВАТЬ: я также пытался добавить простой org.docx4j.wml.Text, подобный этому

Text newtext = factory.createText();
newtext.setValue("sample new text");
wordMLPackage.getMainDocumentPart().addObject(newtext);

программа запустится, но когда я открою сгенерированный файл docx, она просто выдаст сообщение о том, что есть проблема с содержимым.


person Weddy    schedule 16.04.2013    source источник
comment
Если вы хотите использовать абзацы, вы можете контролировать пространство до и после. Вы можете установить это для абзаца или стиля абзаца, или в параметрах документа по умолчанию в части стилей.   -  person JasonPlutext    schedule 16.04.2013


Ответы (2)


Приведенный ниже код будет генерировать вывод построчно.

Ключ здесь добавить Text(1) ->paragraph1 и Br ->paragraph1 после Text(2) ->paragraph1

Br — это такой же элемент, как Text и P. используя это, мы можем перейти на новую строку.

ObjectFactory factory = Context.getWmlObjectFactory();
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage
        .createPackage();

P spc = factory.createP();
R rspc = factory.createR();

Text t1 = factory.createText();
t1.setValue("tset");
rspc.getContent().add(t1);
Br br = factory.createBr(); // this Br element is used break the current and go for next line
rspc.getContent().add(br);
Text t2 = factory.createText();
t2.setValue("\r\n tset2");
rspc.getContent().add(t2);

spc.getContent().add(rspc);

wordMLPackage.getMainDocumentPart().addObject(spc);

wordMLPackage.save(new java.io.File("helloworld.docx"));

ВЫВОД:

цет

цет2

person NPKR    schedule 16.04.2013
comment
совет: org.docx4j.wml.ObjectFactory factory = Context.getWmlObjectFactory();, раз в пакете org.docx4j несколько разных ObjectFacotry - person Math; 15.05.2014
comment
привет, я только что проверил ваш код, и t2.setValue("\r\n tset2"); не возвращает разрыв строки. - person Charles Yeung; 19.09.2018

Вы можете использовать ObjectFactory.createBr() для создания нового окончания строки.

    ObjectFactory factory = Context.getWmlObjectFactory();

    R run = factory.createR();

    Text text1 = factory.createText();
    text1.setValue("asd");
    run.getContent().add(text1);

    Br nl = factory.createBr();
    run.getContent().add(nl);

    Text text2 = factory.createText();
    text2.setValue("efg");
    run.getContent().add(text2);

    P para = factory.createP();
    para.getParagraphContent().add(run);

    WordprocessingMLPackage wordMLPackage =
            WordprocessingMLPackage.createPackage();
    wordMLPackage.getMainDocumentPart().addObject(para);

    wordMLPackage.getMainDocumentPart().addParagraphOfText("p1");
    wordMLPackage.getMainDocumentPart().addParagraphOfText("p2");

    wordMLPackage.save(new File("test.docx"));
person longhua    schedule 16.04.2013