Въведение в Docx4J

1. Общ преглед

В тази статия ще се съсредоточим върху създаването на. docx документ с помощта на библиотеката docx4j.

Docx4j е библиотека на Java, използвана за създаване и манипулиране на Office OpenXML файлове - което означава, че може да работи само с файловия тип .docx , докато по-старите версии на Microsoft Word използват разширение .doc (двоични файлове).

Имайте предвид, че форматът OpenXML се поддържа от Microsoft Office, започвайки с версията от 2007 г.

2. Настройка на Maven

За да започнем работа с docx4j, трябва да добавим необходимата зависимост в нашия pom.xml :

 org.docx4j docx4j 3.3.5   javax.xml.bind jaxb-api 2.1 

Имайте предвид, че винаги можем да търсим най-новите версии на зависимостите в Maven Central Repository.

Необходима е зависимостта JAXB , тъй като docx4j използва тази библиотека под капака, за да маршира / демаршалира XML части в docx файл.

3. Създайте документ на Docx файл

3.1. Текстови елементи и стил

Нека първо видим как да създадем прост docx файл - с текстов абзац:

WordprocessingMLPackage wordPackage = WordprocessingMLPackage.createPackage(); MainDocumentPart mainDocumentPart = wordPackage.getMainDocumentPart(); mainDocumentPart.addStyledParagraphOfText("Title", "Hello World!"); mainDocumentPart.addParagraphOfText("Welcome To Baeldung"); File exportFile = new File("welcome.docx"); wordPackage.save(exportFile); 

Ето полученият файл welcome.docx :

За да създадем нов документ, трябва да използваме WordprocessingMLPackage , който представлява docx файл във формат OpenXML , докато класът MainDocumentPart съдържа представяне на основната част document.xml .

За да изясним нещата, нека разархивираме файла welcome.docx и отворим файла word / document.xml, за да видим как изглежда XML представлението:

      Hello World!     Welcome To Baeldung!   

Както виждаме, всяко изречение е представено от цикъл ( r ) от текст ( t ) вътре в параграф ( p ) и за това е предназначен методът addParagraphOfText () .

В addStyledParagraphOfText () направи малко повече от това; той създава свойства на абзаца ( pPr ), който съдържа стила, който да се приложи към абзаца.

Просто казано, абзаците декларират отделни изпълнения и всяко изпълнение съдържа някои текстови елементи:

За да създадем добре изглеждащ документ, трябва да имаме пълен контрол върху тези елементи (абзац, изпълнение и текст).

И така, нека да открием как да стилизираме нашето съдържание, като използваме обекта runProperties ( RPr ):

ObjectFactory factory = Context.getWmlObjectFactory(); P p = factory.createP(); R r = factory.createR(); Text t = factory.createText(); t.setValue("Welcome To Baeldung"); r.getContent().add(t); p.getContent().add(r); RPr rpr = factory.createRPr(); BooleanDefaultTrue b = new BooleanDefaultTrue(); rpr.setB(b); rpr.setI(b); rpr.setCaps(b); Color green = factory.createColor(); green.setVal("green"); rpr.setColor(green); r.setRPr(rpr); mainDocumentPart.getContent().add(p); File exportFile = new File("welcome.docx"); wordPackage.save(exportFile);

Ето как изглежда резултатът:

След като сте създали параграф, тичам и текстов елемент, използвайки createP () , createR () и createText () съответно, ние сме обявен нов runProperties обект ( RPR ), за да добавите малко стил на текст елемент.

Обектът rpr се използва за задаване на свойства за форматиране, получер ( B ), курсив ( I ) и главни букви ( Caps ), тези свойства се прилагат към текстовото изпълнение с помощта на метода setRPr () .

3.2. Работа с изображения

Docx4j предлага лесен начин за добавяне на изображения към нашия документ на Word:

File image = new File("image.jpg" ); byte[] fileContent = Files.readAllBytes(image.toPath()); BinaryPartAbstractImage imagePart = BinaryPartAbstractImage .createImagePart(wordPackage, fileContent); Inline inline = imagePart.createImageInline( "Baeldung Image (filename hint)", "Alt Text", 1, 2, false); P Imageparagraph = addImageToParagraph(inline); mainDocumentPart.getContent().add(Imageparagraph);

И ето как изглежда изпълнението на метода addImageToParagraph () :

private static P addImageToParagraph(Inline inline) { ObjectFactory factory = new ObjectFactory(); P p = factory.createP(); R r = factory.createR(); p.getContent().add(r); Drawing drawing = factory.createDrawing(); r.getContent().add(drawing); drawing.getAnchorOrInline().add(inline); return p; }

Първо, създадохме файла, който съдържа изображението, което искаме да добавим в основната част на документа, след това свързахме байтовия масив, представляващ изображението, с обекта wordMLPackage .

След като частта от изображението е създадена, трябва да създадем Inline обект, използвайки метода createImageInline ( ).

Методът addImageToParagraph () вгражда Inline обекта в Чертеж , за да може да бъде добавен към изпълнение.

И накрая, подобно на текстов абзац, абзацът, съдържащ изображението, се добавя към mainDocumentPart .

И ето полученият документ:

3.3. Създаване на таблици

Docx4j също улеснява манипулирането на таблици (Tbl), редове (Tr) и колони (Tc).

Нека да видим как да създадем таблица 3 × 3 и да добавим малко съдържание към нея:

int writableWidthTwips = wordPackage.getDocumentModel() .getSections().get(0).getPageDimensions().getWritableWidthTwips(); int columnNumber = 3; Tbl tbl = TblFactory.createTable(3, 3, writableWidthTwips/columnNumber); List rows = tbl.getContent(); for (Object row : rows) { Tr tr = (Tr) row; List cells = tr.getContent(); for(Object cell : cells) { Tc td = (Tc) cell; td.getContent().add(p); } }

Като се имат предвид редове и колони, методът createTable () създава нов Tbl обект, третият аргумент се отнася до ширината на колоната в twips (което е измерване на разстоянието - 1 / 1440th от инча).

Веднъж създадени, можем да прегледаме съдържанието на tbl обекта и да добавим параграфни обекти във всяка клетка.

Нека да видим как изглежда крайният резултат:

4. Четене на документ от файл Docx

Сега, когато открихме как да използваме docx4j за създаване на документи, нека видим как да прочетем съществуващ docx файл и да отпечатаме съдържанието му:

File doc = new File("helloWorld.docx"); WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage .load(doc); MainDocumentPart mainDocumentPart = wordMLPackage .getMainDocumentPart(); String textNodesXPath = "//w:t"; List textNodes= mainDocumentPart .getJAXBNodesViaXPath(textNodesXPath, true); for (Object obj : textNodes) { Text text = (Text) ((JAXBElement) obj).getValue(); String textValue = text.getValue(); System.out.println(textValue); }

В този пример създадохме обект WordprocessingMLPackage въз основа на съществуващ файл helloWorld.docx , използвайки метода load () .

След това използвахме израз на XPath ( // w: t ), за да получим всички текстови възли от основната част на документа.

Методът getJAXBNodesViaXPath () връща списък с обекти JAXBElement .

В резултат на това всички текстови елементи вътре в обекта mainDocumentPart се отпечатват в конзолата.

Имайте предвид, че винаги можем да разархивираме нашите docx файлове, за да получим по-добро разбиране на XML структурата, което помага при анализирането на проблемите и дава по-добра представа за това как да се справим с тях.

5. Заключение

В тази статия открихме как docx4j улеснява извършването на сложни операции с MSWord документ, като създаване на абзаци, таблици, части на документи и добавяне на изображения.

Фрагментите на кода могат да бъдат намерени, както винаги, в GitHub.