Pemprosesan Microsoft Word di Java dengan Apache POI

1. Gambaran keseluruhan

Apache POI adalah perpustakaan Java untuk bekerja dengan berbagai format fail berdasarkan standard Open Office XML (OOXML) dan format Microsoft Compound Document OLE 2 (OLE2).

Tutorial ini memfokuskan pada sokongan Apache POI untuk Microsoft Word, format fail Office yang paling kerap digunakan. Ia melalui langkah-langkah yang diperlukan untuk memformat dan menghasilkan fail MS Word dan cara menguraikan fail ini.

2. Pergantungan Maven

Satu-satunya kebergantungan yang diperlukan untuk Apache POI untuk mengendalikan fail MS Word adalah:

 org.apache.poi poi-ooxml 3.15 

Klik di sini untuk versi terbaru artifak ini.

3. Persiapan

Sekarang mari kita lihat beberapa elemen yang digunakan untuk memudahkan penghasilan fail MS Word.

3.1. Fail Sumber

Kami akan mengumpulkan kandungan tiga fail teks dan menulisnya ke dalam fail MS Word - bernama rest-with-spring.docx .

Sebagai tambahan, file logo-leaf.png digunakan untuk memasukkan gambar ke dalam fail baru itu. Semua fail ini ada di classpath dan diwakili oleh beberapa pemboleh ubah statik:

public static String logo = "logo-leaf.png"; public static String paragraph1 = "poi-word-para1.txt"; public static String paragraph2 = "poi-word-para2.txt"; public static String paragraph3 = "poi-word-para3.txt"; public static String output = "rest-with-spring.docx";

Bagi mereka yang ingin tahu, kandungan fail sumber ini di repositori, yang pautannya diberikan di bahagian terakhir tutorial ini, diekstrak dari halaman kursus ini di sini di laman web ini.

3.2. Kaedah Pembantu

Kaedah utama yang terdiri daripada logik yang digunakan untuk menghasilkan fail MS Word, yang dijelaskan dalam bahagian berikut, menggunakan kaedah penolong:

public String convertTextFileToString(String fileName) { try (Stream stream = Files.lines(Paths.get(ClassLoader.getSystemResource(fileName).toURI()))) { return stream.collect(Collectors.joining(" ")); } catch (IOException | URISyntaxException e) { return null; } }

Kaedah ini mengekstrak kandungan yang terdapat dalam fail teks yang terletak di classpath, yang namanya adalah argumen String yang dilalui . Kemudian, ia menggabungkan baris dalam fail ini dan mengembalikan String yang bergabung .

4. Penjanaan Fail MS Word

Bahagian ini memberikan arahan mengenai cara memformat dan menghasilkan fail Microsoft Word. Sebelum mengerjakan mana-mana bahagian fail, kita perlu mempunyai contoh XWPFDocument :

XWPFDocument document = new XWPFDocument();

4.1. Memformat Tajuk dan Sarikata

Untuk membuat tajuk, kita perlu terlebih dahulu membuat kelas XWPFParagraph dan menetapkan penjajaran pada objek baru:

XWPFParagraph title = document.createParagraph(); title.setAlignment(ParagraphAlignment.CENTER);

Kandungan perenggan perlu dibungkus dalam objek XWPFRun . Kami mungkin mengkonfigurasi objek ini untuk menetapkan nilai teks dan gaya yang berkaitan:

XWPFRun titleRun = title.createRun(); titleRun.setText("Build Your REST API with Spring"); titleRun.setColor("009933"); titleRun.setBold(true); titleRun.setFontFamily("Courier"); titleRun.setFontSize(20);

Seseorang harus dapat menyimpulkan tujuan kaedah set dari namanya.

Dengan cara yang sama, kami membuat contoh XWPFParagraph yang merangkumi subtitle:

XWPFParagraph subTitle = document.createParagraph(); subTitle.setAlignment(ParagraphAlignment.CENTER);

Mari kita format sari kata juga:

XWPFRun subTitleRun = subTitle.createRun(); subTitleRun.setText("from HTTP fundamentals to API Mastery"); subTitleRun.setColor("00CC44"); subTitleRun.setFontFamily("Courier"); subTitleRun.setFontSize(16); subTitleRun.setTextPosition(20); subTitleRun.setUnderline(UnderlinePatterns.DOT_DOT_DASH);

The setTextPosition kaedah menetapkan jarak antara sari kata dan imej yang berikutnya, manakala setUnderline menentukan corak garis bawah itu.

Perhatikan bahawa kita menyusun semula kandungan tajuk dan sari kata kerana pernyataan ini terlalu pendek untuk membenarkan penggunaan kaedah penolong.

4.2. Memasukkan Imej

Gambar juga perlu dibungkus dalam instance XWPFParagraph . Kami mahu gambar berpusat secara mendatar dan diletakkan di bawah sari kata, oleh itu coretan berikut mesti diletakkan di bawah kod yang diberikan di atas:

XWPFParagraph image = document.createParagraph(); image.setAlignment(ParagraphAlignment.CENTER);

Berikut adalah cara menetapkan jarak antara gambar ini dan teks di bawahnya:

XWPFRun imageRun = image.createRun(); imageRun.setTextPosition(20);

Gambar diambil dari fail di classpath dan kemudian dimasukkan ke dalam fail MS Word dengan dimensi yang ditentukan:

Path imagePath = Paths.get(ClassLoader.getSystemResource(logo).toURI()); imageRun.addPicture(Files.newInputStream(imagePath), XWPFDocument.PICTURE_TYPE_PNG, imagePath.getFileName().toString(), Units.toEMU(50), Units.toEMU(50));

4.3. Memformat Perenggan

Inilah cara kami membuat perenggan pertama dengan kandungan yang diambil dari fail poi-word-para1.txt :

XWPFParagraph para1 = document.createParagraph(); para1.setAlignment(ParagraphAlignment.BOTH); String string1 = convertTextFileToString(paragraph1); XWPFRun para1Run = para1.createRun(); para1Run.setText(string1);

Jelas bahawa penciptaan perenggan serupa dengan penciptaan judul atau sari kata. Satu-satunya perbezaan di sini adalah penggunaan kaedah penolong dan bukannya tali yang keras.

Dengan cara yang serupa, kita dapat membuat dua perenggan lain menggunakan isi dari fail poi-word-para2.txt dan poi-word-para3.txt :

XWPFParagraph para2 = document.createParagraph(); para2.setAlignment(ParagraphAlignment.RIGHT); String string2 = convertTextFileToString(paragraph2); XWPFRun para2Run = para2.createRun(); para2Run.setText(string2); para2Run.setItalic(true); XWPFParagraph para3 = document.createParagraph(); para3.setAlignment(ParagraphAlignment.LEFT); String string3 = convertTextFileToString(paragraph3); XWPFRun para3Run = para3.createRun(); para3Run.setText(string3);

Pembuatan ketiga-tiga perenggan ini hampir sama, kecuali untuk beberapa gaya seperti penjajaran atau miring.

4.4. Menghasilkan Fail MS Word

Now we are ready to write out a Microsoft Word file to memory from the document variable:

FileOutputStream out = new FileOutputStream(output); document.write(out); out.close(); document.close();

All the code snippets in this section are wrapped in a method named handleSimpleDoc.

5. Parsing and Testing

This section outlines the parsing of MS Word files and verification of the result.

5.1. Preparation

We declare a static field in the test class:

static WordDocument wordDocument;

This field is used to reference to an instance of the class that encloses all the code fragments shown in sections 3 and 4.

Before parsing and testing, we need to initialize the static variable declared right above and generate the rest-with-spring.docx file in the current working directory by invoking the handleSimpleDoc method:

@BeforeClass public static void generateMSWordFile() throws Exception { WordTest.wordDocument = new WordDocument(); wordDocument.handleSimpleDoc(); }

Let's move on to the final step: parsing the MS Word file and the verification of the outcome.

5.2. Parsing MS Word File and Verification

First, we extract contents from the given MS Word file in the project directory and the store the contents in a List of XWPFParagraph:

Path msWordPath = Paths.get(WordDocument.output); XWPFDocument document = new XWPFDocument(Files.newInputStream(msWordPath)); List paragraphs = document.getParagraphs(); document.close();

Next, let's make sure that the content and style of the title is the same as what we have set before:

XWPFParagraph title = paragraphs.get(0); XWPFRun titleRun = title.getRuns().get(0); assertEquals("Build Your REST API with Spring", title.getText()); assertEquals("009933", titleRun.getColor()); assertTrue(titleRun.isBold()); assertEquals("Courier", titleRun.getFontFamily()); assertEquals(20, titleRun.getFontSize());

For the sake of simplicity, we just validate the contents of other parts of the file, leaving out the styles. The verification of their styles is similar to what we have done with the title:

assertEquals("from HTTP fundamentals to API Mastery", paragraphs.get(1).getText()); assertEquals("What makes a good API?", paragraphs.get(3).getText()); assertEquals(wordDocument.convertTextFileToString (WordDocument.paragraph1), paragraphs.get(4).getText()); assertEquals(wordDocument.convertTextFileToString (WordDocument.paragraph2), paragraphs.get(5).getText()); assertEquals(wordDocument.convertTextFileToString (WordDocument.paragraph3), paragraphs.get(6).getText());

Now we can be confident that the creation of the rest-with-spring.docx file has been successful.

6. Conclusion

Tutorial ini memperkenalkan sokongan Apache POI untuk format Microsoft Word. Ia melalui langkah-langkah yang diperlukan untuk menghasilkan fail MS Word dan untuk mengesahkan kandungannya.

Pelaksanaan semua contoh dan coretan kod ini terdapat dalam projek GitHub.