Ketika Java membaca dokumen Word, meskipun ada banyak plug-in poi, java2Word, jacob, itext, dll. yang diperkenalkan di Internet, poi tidak dapat membaca formatnya (API baru tampaknya masih dalam tahap penelitian dan pengembangan, bukan sangat stabil, dan saya tidak takut mengerjakan proyek. Gunakan); java2Word, jaco b mudah untuk melaporkan kesalahan dan tidak dapat menemukan registrasi, yang cukup aneh. Saya telah mencobanya di mesin yang berbeda, dan metode operasinya persis sama. Beberapa mesin tidak melaporkan kesalahan, dan beberapa melaporkan kesalahan forum untuk mencari ahli untuk menyelesaikannya, tetapi saya tidak tahu alasannya. Proyek Agak membingungkan untuk menyebarkan dan menggunakannya; sepertinya sangat nyaman untuk menulis, tetapi saya sudah memeriksa informasinya untuk waktu yang lama dan saya belum melakukannya tidak melihat cara yang baik untuk membacanya. Setelah beberapa pilihan, yang terbaik adalah menggunakan RTF sebagai kompromi. Bagaimanapun, RTF adalah format sumber terbuka dan tidak memerlukan plug-in apa pun. Ini hanya memerlukan operasi IO dasar dan konversi pengkodean. Di permukaan, file berformat rtf tidak berbeda dengan doc. File tersebut dapat dibuka dengan word dan berbagai format dapat diatur.
----- Fungsi yang diterapkan: Membaca konten template RTF (format dan konten teks), mengganti bagian yang diubah, dan membentuk dokumen RTF baru.
----- Ide implementasi: Bagian tetap dalam templat dimasukkan secara manual, dan bagian yang diubah diwakili oleh $info$. Ganti saja $info$.
1. Baca konten template RTF dalam bentuk byte
2. Ubah string konten variabel menjadi pengkodean RTF
3. Ganti bagian variabel pada teks asli untuk membentuk dokumen RTF baru
Prosedur utamanya adalah sebagai berikut:
public String bin2hex(String bin) { char[] digital = "0123456789ABCDEF".toCharArray(); StringBuffer sb = new StringBuffer(""); 0; saya < bs.panjang;i++) { bit = (bs[i] & 0x0f0) >> 4; sb.append("//'"); sb.append(digital[bit]); bit = bs[i] & 0x0f; String readByteRtf(InputStream in, jalur String){ String sourcecontent = ""; coba{ ins = new FileInputStream(path byte[] b = baru byte[1024]; if (ins == null) { System.out.println("File template sumber tidak ada"); int bytesRead = 0; 1024 ); // mengembalikan jumlah byte baca akhir if(bytesRead == -1) {// akhir dari InputStream System.out.println("Akhir dari pembacaan file template"); += String baru(b, 0, bytesRead); // konversikan ke string menggunakan byte } }catch(Exception e){ e.printStackTrace() } return sourcecontent ;}
Di atas adalah kode inti, dan sisanya adalah penggantinya. Metode String.replace(oldstr, newstr); di Java dapat dirakit kembali dan diimplementasikan, jadi saya tidak akan mempostingnya di sini. Silakan lihat lampiran untuk detail kode sumber.
Prasyarat untuk menjalankan kode sumber:
Buat direktori YQ di drive c, salin "template.rtf" di lampiran ke direktori YQ, dan jalankan file OperatorRTF.java. Nama file akan dihasilkan di direktori YQ, seperti: 21:15: 19_cheney_rekam file .rtf.
paket com; impor java.io.File;impor java.io.FileInputStream;impor java.io.FileWriter;impor java.io.IOException;impor java.io.InputStream;impor java.io.PrintWriter;impor java.text. SimpleDateFormat;impor java.util.Date; public class OperatorRTF { public String strToRtf(String konten){ char[] digital = "0123456789ABCDEF".toCharArray(); StringBuffer sb = new StringBuffer(""); byte[] bs = konten.getBytes(); .panjang; saya++) { bit = (bs[i] & 0x0f0) >> 4; sb.append("//'"); sb.append(digital[bit]); bit = bs[i] & 0x0f; String replaceRTF(String konten,String replacecontent,int flag){ String rc = strToRtf(replacecontent); if(bendera==0){ target = content.replace("$timetop$",rc); } if(flag==1){ target = content.replace("$info$",rc); bendera==2){ target = konten.replace("$idea$",rc); } if(bendera==3){ target = konten.replace("$saran$",rc); =4){ sasaran = content.replace("$infosend$",rc); } target kembali; } public String getSavePath() { String path = "C://YQ"; File fDirecotry = File baru(jalur); ()) { fDirecotry.mkdirs(); } jalur kembali; } public String ToSBC(String input){ char[] c = input.toCharArray(); (int i = 0; i < c.panjang; i++){ jika (c[i] == 32){ c[i] = (char) 12288; } jika (c[i] < 127){ c [i] = (char) (c[i] + 65248); } kembalikan String baru(c } public void rgModel(Nama pengguna string, konten String) { // TODO Metode yang dibuat secara otomatis stub Date current=new Date(); SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); ,13) + "jam"; nama target += sdf.format(saat ini).substring(14,16) + "nama target"; += sdf.format(saat ini).substring(17,19) + "detik"; nama target += "_" + nama pengguna +"_record.rtf"; String strpath = getSavePath(); +"template.rtf"; String sourcecontent = ""; InputStream ins = null; coba{ ins = new FileInputStream(nama sumber); byte[1024]; if (ins == null) { System.out.println("File template sumber tidak ada"); int bytesRead = 0; 1024 ); // mengembalikan jumlah byte baca akhir if(bytesRead == -1) {// akhir dari InputStream System.out.println("Akhir dari pembacaan file template"); += new String(b, 0, bytesRead); // konversikan ke string menggunakan byte } }catch(Exception e){ e.printStackTrace(); } String targetcontent = ""; ~"); for(int i=0;i<array.length;i++){ if(i==0){ targetcontent = replaceRTF(sourcecontent, array[i], i); }else{ targetcontent = replaceRTF(targetcontent, array[i], i); } } coba { FileWriter fw = new FileWriter(getSavePath()+"//" + nama target,true); ("")||targetcontent==""){ out.println(sourcecontent); }else{ out.println(targetcontent); out.close(); fw.close(); System.out.println(getSavePath()+" File dihasilkan di direktori ini" + nama target + "Sukses"); catch block e.printStackTrace(); } public static void main(String[] args) { // TODO Metode yang dibuat secara otomatis stub OperatorRTF oRTF = new OperatorRTF(); String content = "Dari jam 9:00 tanggal 12 Oktober 2008 sampai jam 6:00 tanggal 12 Oktober 2008 ~ kita mengacu pada metode pengujian obat ~ kita mengacu pada metode pengujian obat ~ kita mengacu pada metode pengujian obat ~ kami mengacu pada metode pengujian Obat"; oRTF.rgModel("cheney",content); }}
Contoh penggunaan POI untuk membaca data tabular dari file word:
<span style="font-size:14px;">paket com.poi.world; impor java.io.FileInputStream; impor org.apache.poi.hwpf.HWPFDocument; ; impor org.apache.poi.hwpf.usermodel.Range impor; org.apache.poi.hwpf.usermodel.Table; import org.apache.poi.hwpf.usermodel.TableCell; import org.apache.poi.hwpf.usermodel.TableIterator; ; impor org.apache.poi.poifs.filesystem.POIFSFileSystem; kelas publik POI_Word{ public static void main(String[] args){ coba { String[] s=String baru[20]; FileInputStream di=FileInputStream baru("D://mayi.doc"); HWPFDocument baru(pfs); Rentang rentang =hwpf.getRange(); TableIterator it=New TableIterator(rentang); int indeks=0; while(it.hasNext()){ Tabel tb=(Tabel)it.next(); for(int i=0;i<tb.numRows();i++){ //Sistem.keluar. println("Bilangan :"+tb.numRows()); TableRow tr=tb.getRow(i); j=0;j<tr.numCells();j++){ //Sistem.out.println("numCells :"+tr.numCells()); // Sistem.out.println("j :"+j) ; TableCell td=tr.getCell(j); for(int k=0;k<td.numParagraphs();k++){ //Sistem.out.println("numParagraphs :"+td.numParagraphs()); Paragraf para=td.getParagraph(k); s[index]=para.text().trim(); indeks++; } } } } // System.out.println(s .toString()); for(int i=0;i<s.length;i++){ System.out.println(s[i]); e.printStackTrace();