Pemrosesan Kata Microsoft di Java dengan Apache POI

1. Ikhtisar

Apache POI adalah pustaka Java untuk bekerja dengan berbagai format file berdasarkan standar Office Open XML (OOXML) dan format Dokumen Gabungan OLE 2 (OLE2) Microsoft.

Tutorial ini berfokus pada dukungan Apache POI untuk Microsoft Word, format file Office yang paling umum digunakan. Ini berjalan melalui langkah-langkah yang diperlukan untuk memformat dan menghasilkan file MS Word dan cara mengurai file ini.

2. Ketergantungan Maven

Satu-satunya ketergantungan yang diperlukan Apache POI untuk menangani file MS Word adalah:

 org.apache.poi poi-ooxml 3.15 

Silakan klik di sini untuk versi terbaru dari artefak ini.

3. Persiapan

Sekarang mari kita lihat beberapa elemen yang digunakan untuk memfasilitasi pembuatan file MS Word.

3.1. File Sumber Daya

Kami akan mengumpulkan konten dari tiga file teks dan menuliskannya ke dalam file MS Word - bernama rest-with-spring.docx .

Selain itu, file logo-leaf.png digunakan untuk memasukkan gambar ke dalam file baru tersebut. Semua file ini ada di classpath dan diwakili oleh beberapa variabel statis:

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 penasaran, konten file sumber daya ini di repositori, yang tautannya diberikan di bagian terakhir tutorial ini, diekstrak dari halaman kursus ini di sini di situs.

3.2. Metode Pembantu

Metode utama yang terdiri dari logika yang digunakan untuk menghasilkan file MS Word, yang dijelaskan di bagian berikut, menggunakan metode pembantu:

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; } }

Metode ini mengekstrak konten yang terdapat dalam file teks yang terletak di jalur kelas, yang namanya adalah argumen String yang diteruskan . Kemudian, itu menggabungkan baris dalam file ini dan mengembalikan String yang bergabung .

4. Pembuatan File MS Word

Bagian ini memberikan instruksi tentang cara memformat dan membuat file Microsoft Word. Sebelum mengerjakan bagian mana pun dari file, kita perlu memiliki turunan XWPFDocument :

XWPFDocument document = new XWPFDocument();

4.1. Memformat Judul dan Subjudul

Untuk membuat judul, pertama-tama kita harus membuat instance kelas XWPFParagraph dan mengatur perataan pada objek baru:

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

Isi paragraf harus dibungkus dalam objek XWPFRun . Kita dapat mengonfigurasi objek ini untuk menyetel nilai teks dan gaya yang terkait:

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 bisa menyimpulkan tujuan set-method dari namanya.

Dengan cara yang sama kami membuat instance XWPFParagraph yang menyertakan subtitle:

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

Mari format subtitle 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 metode menetapkan jarak antara subtitle dan gambar berikutnya, sementara setUnderline menentukan pola menggarisbawahi.

Perhatikan bahwa kami melakukan hard-code pada konten judul dan subtitle karena pernyataan ini terlalu pendek untuk membenarkan penggunaan metode helper.

4.2. Memasukkan Gambar

Gambar juga perlu dibungkus dalam instance XWPFParagraph . Kami ingin gambar dipusatkan secara horizontal dan ditempatkan di bawah subtitle, sehingga cuplikan berikut harus diletakkan di bawah kode yang diberikan di atas:

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

Berikut cara mengatur jarak antara gambar ini dan teks di bawahnya:

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

Gambar diambil dari file di classpath dan kemudian dimasukkan ke dalam file 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 Paragraf

Berikut adalah cara kami membuat paragraf pertama dengan konten yang diambil dari file poi-word-para1.txt :

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

Terlihat jelas bahwa pembuatan paragraf mirip dengan pembuatan judul atau subjudul. Satu-satunya perbedaan di sini adalah penggunaan metode helper alih-alih string yang di-hardcode.

Dengan cara yang sama, kita dapat membuat dua paragraf lain menggunakan konten dari file 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 paragraf ini hampir sama, kecuali untuk beberapa gaya seperti alignment atau italics.

4.4. Menghasilkan File 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 dukungan Apache POI untuk format Microsoft Word. Itu melalui langkah-langkah yang diperlukan untuk menghasilkan file MS Word dan untuk memverifikasi isinya.

Penerapan semua contoh dan cuplikan kode ini dapat ditemukan di proyek GitHub.