Baca dan Tulis File Word Doc Menggunakan POI
Modul HWPF dari Apache POI secara khusus digunakan untuk membaca dan menulis file DOC Word. Di HWPF, kami menggunakan HWPFDocument untuk mewakili dokumen DOC Word. Ada beberapa konsep di HWPFDocument:
Rentang : Ini mewakili rentang, yang dapat berupa seluruh dokumen, bagian tertentu, paragraf (paragraf), atau paragraf (karakterrun) dengan atribut umum.
Bagian : Subbagian dokumen Word. Dokumen Word dapat terdiri dari beberapa subbagian.
Paragraf : Paragraf dari dokumen Word, ayat dapat terdiri dari beberapa paragraf.
Karakterrun : Paragraf teks dengan sifat yang sama, dan paragraf dapat terdiri dari beberapa karakterrun.
Tabel : Tabel.
Tablerow : Baris yang sesuai dengan tabel.
TableCell : Sel yang sesuai dengan tabel.
Bagian, paragraf, karakterrun, dan tabel semuanya diwarisi dari jangkauan.
1 Baca file dokumen Word
Dalam aplikasi harian, sangat jarang bagi kami untuk membaca informasi dari file Word, dan kami lebih sering menulis konten ke dalam file Word. Ada dua cara utama untuk membaca data dari file Word Doc menggunakan POI: Baca melalui WordExtractor dan baca melalui HWPFDocument . Saat membaca informasi di dalam WordExtractor, masih diperoleh melalui HWPFDocument.
1.1 Baca file melalui WordExtractor
Saat membaca file menggunakan WordExtractor, kami hanya dapat membaca konten teks file dan beberapa properti berdasarkan dokumen. Adapun properti konten dokumen, kami tidak dapat membacanya. Jika Anda ingin membaca properti konten dokumen, Anda perlu menggunakan HWPFDocument untuk membacanya. Berikut adalah contoh menggunakan WordExtractor untuk membaca file:
kelas publik hwpftest {@suppresswarnings ("deprecation") @test public void testReadByExtractor () melempar Exception {InputStream adalah = FileInputStream baru ("d: //test.doc"); WordExtractor Extractor = WordExtractor baru (IS); // output semua teks dari kata dokumen System.out.println (extractor.gettext ()); System.out.println (extractor.gettextFrompieces ()); // output konten header system.out.println ("header:" + extractor.getHeaderText ()); // output konten footer system.out.println ("footer:" + extractor.getFooterText ()); // output informasi metadata dari dokumen kata saat ini, termasuk penulis, waktu modifikasi dokumen, dll. System.out.println (Extractor.GetMetAdateTextExtractor (). GetText ()); // Dapatkan teks dari setiap paragraf string paratexts [] = extractor.getParagraphText (); untuk (int i = 0; i <paratexts.length; i ++) {System.out.println ("paragraf" + (i + 1) + ":" + paratexts [i]); } // output Beberapa informasi tentang kata printinfo saat ini (extractor.getSummaryInformation ()); // output Beberapa informasi tentang kata saat ini this.printinfo (extractor.getDocsummaryInformation ()); this.closestream (IS); } /** * output ringkasanInfomation * @param info * /private void printinfo (info informasi ringkasan) {// penulis system.out.println (info.getAuthor ()); // statistik karakter.out.println (info.getCharCount ()); // Jumlah halaman System.out.println (info.getPageCount ()); // title system.out.println (info.gettitle ()); // tema system.out.println (info.getSubject ()); } /** * Output DocumentumMaryInfomation * @param info * /private void printinfo (DocumentSmaryInformation Info) {// Category System.out.println (info.getCategory ()); // perusahaan System.out.println (info.getCompany ()); } / *** Tutup aliran input* @param adalah* / private void closeStream (inputStream is) {if (is! = Null) {try {is.close (); } catch (ioException e) {e.printstacktrace (); }}}}1.2 Baca file melalui HWPFDocument
HWPFDocument adalah perwakilan dari dokumen kata saat ini dan fungsinya lebih kuat dari WordExtractor. Melalui itu, kita dapat membaca tabel, daftar, dll. Dalam dokumen, dan kami juga dapat menambah, memodifikasi, dan menghapus konten dokumen. Hanya saja setelah penambahan baru ini, modifikasi dan penghapusan diselesaikan, informasi yang relevan disimpan dalam HWPFDocument, yang berarti bahwa apa yang kami ubah adalah HWPFDocument, bukan file pada disk. Jika kita ingin modifikasi ini berlaku, kita dapat memanggil metode tulis HWPFDocument untuk menampilkan HWPFDocument yang dimodifikasi ke aliran output yang ditentukan. Ini bisa berupa aliran output dari file asli, atau aliran output file baru (setara dengan menyimpan AS) atau aliran output lainnya. Berikut adalah contoh membaca file melalui hwpfdocument:
kelas publik hwpftest {@test public void testReadByDoc () melempar Exception {inputStream is = new FileInputStream ("d: //test.doc"); Hwpfdocument doc = hwpfdocument baru (IS); // output informasi bookmark this.printinfo (doc.getBookMarks ()); // output Text system.out.println (doc.getDocumenttext ()); Range range = doc.getRange (); // this.insertInfo (rentang); this.printinfo (rentang); // Baca tabel this.readtable (rentang); // Baca daftar this.readlist (rentang); // Hapus rentang rentang r = rentang baru (2, 5, doc); r.delete (); // hapus dalam memori, jika Anda perlu menyimpannya ke file, Anda perlu menulisnya kembali ke file // tulis hwpfdocument saat ini ke aliran output doc.write (fileoutputStream baru ("d: //test.doc")); this.closestream (IS); } / *** Tutup aliran input* @param adalah* / private void closeStream (inputStream is) {if (is! = Null) {try {is.close (); } catch (ioException e) {e.printstacktrace (); }}} / *** Output informasi bookmark* @param bookmarks* / private void printinfo (bookmarks bookmarks) {int count = bookmark.getBookMarkscount (); System.out.println ("Jumlah Bookmark:" + Count); Bookmark bookmark; untuk (int i = 0; i <count; i ++) {bookmark = bookmark.getBookmark (i); System.out.println ("Bookmark" + (i + 1) + "Nama adalah:" + bookmark.getName ()); System.out.println ("Posisi Mulai:" + bookmark.getStart ()); System.out.println ("posisi akhir:" + bookmark.getend ()); }} /*** Baca tabel* Setiap pengembalian kereta mewakili paragraf, jadi untuk tabel, setiap sel berisi setidaknya satu paragraf, dan setiap baris berakhir dengan paragraf. * @param range */private void readTable (rentang rentang) {// Transfer tabel dalam rentang rentang. Tableiterator tableiter = Tableiterator baru (rentang); Tabel tabel; Baris tablerow; Sel TableCell; while (tableiter.hasnext ()) {table = TableIter.next (); int rownum = tabel.numrows (); untuk (int j = 0; j <rownum; j ++) {row = Table.getRow (j); int cellnum = row.numcells (); untuk (int k = 0; k <cellnum; k ++) {cell = row.getCell (k); // output System Teks sel.out.println (cell.text (). Trim ()); }}}}} / *** Baca daftar* @param range* / private void readlist (range range) {int num = range.numparagraphs (); Paragraf para; for (int i = 0; i <num; i ++) {paragral = range.getParagraph (i); if (para.isInlist ()) {System.out.println ("Daftar:" + Para.Text ()); }}} /** * Rentang output * @param range * /private void printinfo (range) {// Dapatkan jumlah paragraf int paranum = range.numparagraphs (); System.out.println (paranum); untuk (int i = 0; i <paranum; i ++) {// this.insertInfo (range.getParagraph (i)); System.out.println ("paragraf" + (i + 1) + ":" + range.getParagraph (i) .text ()); if (i == (paranum-1)) {this.insertInfo (range.getParagraph (i)); }} int secnum = range.numsection (); System.out.println (secnum); Bagian bagian; untuk (int i = 0; i <secnum; i ++) {section = range.getSection (i); System.out.println (bagian.getMarginleft ()); System.out.println (bagian.getMarginRight ()); System.out.println (bagian.getMarginRight ()); System.out.println (bagian.getMargintop ()); System.out.println (bagian.getMarginBottom ()); System.out.println (bagian.getPageHeight ()); System.out.println (bagian.Text ()); }} / *** Masukkan konten ke dalam rentang, itu hanya akan ditulis ke dalam memori* @param range* / private void insertInfo (range) {range.insertafter ("hello"); }}2 Tulis file doc Word
Saat menulis file Word Doc menggunakan POI, pertama -tama kita harus memiliki file DOC, karena ketika kita menulis file DOC, kita menulisnya melalui HWPFDocument, dan HWPFDocument harus dilampirkan ke file DOC. Jadi cara yang biasa adalah menyiapkan file dokumen dengan konten kosong pada hard disk, dan kemudian membuat HWPFDocument berdasarkan file kosong. Setelah itu, kami dapat menambahkan konten baru ke HWPFDocument dan kemudian menulisnya ke file dokumen lain. Ini setara dengan menggunakan POI untuk menghasilkan file dokumen Word.
Dalam aplikasi yang sebenarnya, ketika kami menghasilkan file kata, kami menghasilkan jenis file tertentu. Format jenis file ini diperbaiki, tetapi beberapa bidang berbeda. Jadi dalam aplikasi praktis, kami tidak perlu menghasilkan konten seluruh file kata melalui HWPFDocument. Alih -alih, buat dokumen kata baru di disk, dan isinya adalah konten dari file kata yang perlu kita hasilkan, dan kemudian menggunakan metode yang mirip dengan "$ {paramname}" untuk mengganti beberapa konten yang dimiliki oleh variabel. Dengan cara ini, ketika kami menghasilkan file kata berdasarkan informasi tertentu, kami hanya perlu mendapatkan HWPFDocument berdasarkan file Word, dan kemudian memanggil metode REPLACETEXT () untuk mengganti variabel yang sesuai dengan nilai yang sesuai, dan kemudian menulis HWPFDocument saat ini ke aliran output baru. Metode ini digunakan lebih sering dalam aplikasi praktis karena tidak hanya dapat mengurangi beban kerja kami, tetapi juga membuat format teks lebih jelas. Mari kita buat contoh berdasarkan metode ini.
Misalkan kita sekarang memiliki beberapa informasi yang berubah, dan kemudian kita perlu menghasilkan file Doc Word dalam format berikut melalui informasi ini:
Jadi sesuai dengan deskripsi di atas, langkah pertama adalah membuat file dokumen dalam format yang sesuai sebagai templat, dan isinya adalah sebagai berikut:
Dengan templat seperti itu, kami dapat membuat HWPFDocument yang sesuai, kemudian mengganti variabel yang sesuai dengan nilai yang sesuai, dan kemudian output HWPFDocument ke aliran output yang sesuai. Di bawah ini adalah kode yang sesuai.
kelas publik hwpftest {@test public void testwrite () melempar pengecualian {string templatePath = "d: //word//template.doc"; InputStream adalah = FileInputStream baru (TemplatePath); Hwpfdocument doc = hwpfdocument baru (IS); Range range = doc.getRange (); // Ganti $ {ReportDate} dalam rentang rentang dengan rentang tanggal saat ini.replacetext ("$ {ReportDate}", new SimpleDateFormat ("yyyy-mm-dd"). Format (tanggal baru ())); range.replacetext ("$ {appleamt}", "100.00"); range.replacetext ("$ {pisang}", "200.00"); range.replacetext ("$ {totalamt}", "300.00"); OutputStream os = new fileoutputStream ("d: //word//write.doc"); // Ekspor dokumen ke aliran output doc.write (OS); this.closestream (OS); this.closestream (IS); } / *** Tutup aliran input* @param adalah* / private void closeStream (inputStream is) {if (is! = Null) {try {is.close (); } catch (ioException e) {e.printstacktrace (); }}} / *** Tutup aliran output* @param os* / private void closeStream (outputStream os) {if (os! = Null) {coba {os.close (); } catch (ioException e) {e.printstacktrace (); }}}}}(Catatan: Artikel ini didasarkan pada POI3.9)
Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!