เมื่อ Java อ่านเอกสาร word แม้ว่าจะมีปลั๊กอิน poi, java2Word, jacob, itext และอื่นๆ มากมายที่แนะนำบนอินเทอร์เน็ต แต่ poi ก็ไม่สามารถอ่านรูปแบบได้ (ดูเหมือนว่า API ใหม่จะยังอยู่ในขั้นตอนการวิจัยและพัฒนา ไม่ใช่ มีเสถียรภาพมากและฉันไม่กลัวที่จะทำโปรเจ็กต์ ใช้ java2Word, jaco b ง่ายต่อการรายงานข้อผิดพลาดและไม่พบการลงทะเบียน ซึ่งค่อนข้างแปลก ฉันได้ลองใช้กับเครื่องอื่นแล้ว และวิธีการดำเนินการก็เหมือนกันทุกประการ ฟอรัมเพื่อหาผู้เชี่ยวชาญมาแก้ไข แต่ฉันไม่สามารถบอกเหตุผลได้ Project มันค่อนข้างสับสนในการปรับใช้และใช้งาน ดูเหมือนว่า itxt จะสะดวกมากในการเขียน แต่ฉันตรวจสอบข้อมูลมานานแล้วและฉันก็ยังไม่ได้ ไม่เห็นมีวิธีที่ดีในการอ่านเลย หลังจากเลือกแล้ว วิธีที่ดีที่สุดคือใช้ RTF เป็นการประนีประนอม อย่างไรก็ตาม RTF เป็นรูปแบบโอเพ่นซอร์สและไม่ต้องใช้ปลั๊กอินใดๆ เพียงใช้การดำเนินการ IO พื้นฐานและการแปลงการเข้ารหัสเท่านั้น โดยพื้นฐานแล้ว ไฟล์รูปแบบ rtf ก็ไม่ต่างจาก doc สามารถเปิดด้วยคำและสามารถตั้งค่ารูปแบบต่างๆ ได้
----- ฟังก์ชั่นที่นำมาใช้: อ่านเนื้อหาเทมเพลต RTF (รูปแบบและเนื้อหาข้อความ) แทนที่ส่วนที่เปลี่ยนแปลง และสร้างเอกสาร RTF ใหม่
----- แนวคิดในการนำไปใช้: ส่วนที่คงที่ในเทมเพลตจะถูกป้อนด้วยตนเอง และส่วนที่เปลี่ยนแปลงจะแสดงด้วย $info$ เพียงแทนที่ $info$
1. อ่านเนื้อหาเทมเพลต RTF ในรูปแบบไบต์
2. แปลงสตริงเนื้อหาตัวแปรเป็นการเข้ารหัส RTF
3. แทนที่ส่วนตัวแปรในข้อความต้นฉบับเพื่อสร้างเอกสาร RTF ใหม่
ขั้นตอนหลักมีดังนี้:
สาธารณะ String bin2hex (ถังสตริง) { ถ่าน [] digital = "0123456789ABCDEF".toCharArray(); StringBuffer sb = new StringBuffer(""); ไบต์ [] bs = bin.getBytes(); 0; i <bs.length;i++) { บิต = (bs[i] & 0x0f0) >> 4; sb.append("//'"); sb.append(ดิจิทัล[บิต]); bit = bs[i] & 0x0f; sb.append(ดิจิทัล[bit]); } กลับ sb.toString( } สตริง readByteRtf (InputStream ins, String path) { String sourcecontent = ""; ลอง { ins = new FileInputStream (path); byte [] b = new ไบต์ [1024]; if (ins == null) { System.out.println ("ไม่มีไฟล์เทมเพลตต้นฉบับ"); } int bytesRead = 0; 1024 ); // ส่งคืนจำนวนไบต์การอ่านสุดท้าย if(bytesRead == -1) {// end of InputStream System.out.println("End of reading template file"); += new String(b, 0, bytesRead); // แปลงเป็นสตริงโดยใช้ bytes } }catch(Exception e){ e.printStackTrace(); } return sourcecontent ;}
ด้านบนคือโค้ดหลัก และส่วนที่เหลือคือการแทนที่ เมธอด String.replace(oldstr, newstr); ใน java สามารถประกอบและนำไปใช้ใหม่ได้ ดังนั้นฉันจะไม่โพสต์ไว้ที่นี่ โปรดดูเอกสารแนบสำหรับรายละเอียดซอร์สโค้ด
ข้อกำหนดเบื้องต้นสำหรับการรันซอร์สโค้ด:
สร้างไดเร็กทอรี YQ บนไดรฟ์ c คัดลอก "template.rtf" ในไฟล์แนบไปยังไดเร็กทอรี YQ และเรียกใช้ไฟล์ OperatorRTF.java ชื่อไฟล์จะถูกสร้างขึ้นในไดเร็กทอรี YQ เช่น: 21:15: 19_cheney_record ไฟล์ .rtf
แพ็คเกจ com; นำเข้า java.io.File; นำเข้า java.io.FileInputStream; นำเข้า java.io.FileWriter; นำเข้า java.io.IOException; นำเข้า java.io.InputStream; นำเข้า java.io.PrintWriter; นำเข้า java.text SimpleDateFormat; นำเข้า java.util.Date; คลาสสาธารณะ OperatorRTF { สตริงสาธารณะ strToRtf (String เนื้อหา){ char[] digital = "0123456789ABCDEF".toCharArray(); StringBuffer sb = new StringBuffer(""); byte[] bs = content.getBytes(); .length; i++) { บิต = (bs[i] & 0x0f0) >> 4; sb.append("//'"); sb.append(ดิจิทัล[บิต]); bit = bs[i] & 0x0f; sb.append(ดิจิทัล[bit]); } กลับ sb.toString( } สตริงแทนที่RTF (เนื้อหาสตริง, สตริงแทนที่เนื้อหา, ธง int) { สตริง rc = strToRtf (แทนที่เนื้อหา); สตริงเป้าหมาย = ""; if(flag==0){ target = content.replace("$timetop$",rc); } if(ธง==1){ target = content.replace("$info$",rc } ถ้า( flag==2){ target = content.replace("$idea$",rc); } if(flag==3){ target = content.replace("$advice$",rc); } ถ้า(ธง= =4){ เป้าหมาย = content.replace("$infosend$",rc); } ส่งคืนเป้าหมาย; } public String getSavePath() { String path = "C://YQ"; File fDirecotry = new File(path); ()) { fDirecotry.mkdirs(); } เส้นทางกลับ; } สตริงสาธารณะ ToSBC (อินพุตสตริง) { ถ่าน [] c = input.toCharArray(); (int i = 0; i < c.length; i++){ if (c[i] == 32){ c[i] = (char) 12288; Continue; [i] = (char) (c[i] + 65248); } } ส่งคืนสตริงใหม่ (c); } โมฆะสาธารณะ rgModel (ชื่อผู้ใช้สตริง, เนื้อหาสตริง) { // TODO วิธีการสร้างอัตโนมัติ stub Date current=new Date(); SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String targetname = sdf.format(current).substring(11 ,13) + "ชั่วโมง"; targetname += sdf.format(current).substring(14,16) + "นาที"; += sdf.format(current).substring(17,19) + "seconds"; targetname += "_" + ชื่อผู้ใช้ +"_record.rtf"; String strpath = getSavePath(); +"template.rtf"; String sourcecontent = ""; InputStream ins = null; ลอง { ins = new FileInputStream(sourname); byte[] b = new ไบต์ [1024]; if (ins == null) { System.out.println ("ไม่มีไฟล์เทมเพลตต้นฉบับ"); } int bytesRead = 0; 1024 ); // ส่งคืนจำนวนไบต์การอ่านสุดท้าย if(bytesRead == -1) {// end of InputStream System.out.println("End of reading template file"); += new String(b, 0, bytesRead); // แปลงเป็นสตริงโดยใช้ไบต์ } }catch(Exception e){ e.printStackTrace(); } String targetcontent = ""; ~"); for(int i=0;i<array.length;i++){ if(i==0){ targetcontent = แทนที่RTF(sourcecontent, array[i], i); }else{ targetcontent = แทนที่RTF(targetcontent, array[i], i); } } ลอง { FileWriter fw = new FileWriter(getSavePath()+"//" + targetname,true); PrintWriter out = new PrintWriter(fw); ("")||targetcontent==""){ out.println(sourcecontent); }else{ out.println(เนื้อหาเป้าหมาย); out.close(); fw.close(); System.out.println(getSavePath()+" ไฟล์ที่สร้างในไดเร็กทอรีนี้" + targetname + "Success"); } catch (IOException e) { // TODO สร้างอัตโนมัติ catch block e.printStackTrace (); } } โมฆะสาธารณะหลัก (String [] args) { // TODO วิธีการสร้างอัตโนมัติ stub OperatorRTF oRTF = ใหม่ OperatorRTF(); String content = "ตั้งแต่ 9.00 น. วันที่ 12 ตุลาคม 2551 ถึง 12 ตุลาคม 2551 เวลา 06.00 น. ~ เราอ้างถึงวิธีการทดสอบยา ~ เราอ้างถึงวิธีการทดสอบยา ~ เราอ้างถึงวิธีการ ของการทดสอบยา ~ เราหมายถึงการทดสอบวิธียา"; oRTF.rgModel("cheney",content); }}
ตัวอย่างการใช้ POI เพื่ออ่านข้อมูลแบบตารางจากไฟล์คำ:
<span style="font-size:14px;">แพ็คเกจ com.poi.world; import java.io.FileInputStream; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.usermodel.Paragraph ; นำเข้า org.apache.poi.hwpf.usermodel.Range; org.apache.poi.hwpf.usermodel.Table; นำเข้า org.apache.poi.hwpf.usermodel.TableCell; นำเข้า org.apache.poi.hwpf.usermodel.TableIterator; ; นำเข้า org.apache.poi.poifs.filesystem.POIFSFileSystem คลาสสาธารณะ POI_Word { โมฆะคงที่สาธารณะ main(String[] args){ ลอง { String[] s=new FileInputStream in=new FileInputStream("D://mayi.doc"); ใหม่ HWPFDocument(pfs); ช่วงช่วง =hwpf.getRange(); TableIterator มัน=ใหม่ TableIterator(ช่วง); int index=0; while(it.hasNext()){ Table tb=(Table)it.next(); for(int i=0;i<tb.numRows();i++){ //System.out. println("Numrows :"+tb.numRows()); TableRow tr=tb.getRow(i); สำหรับ (int j=0;j<tr.numCells();j++){ //System.out.println("numCells :"+tr.numCells()); // System.out.println("j :"+j) ; TableCell td=tr.getCell(j); for(int k=0;k<td.numParagraphs();k++){ //System.out.println("numParagraphs) :"+td.numParagraphs()); ย่อหน้า para=td.getParagraph(k); s[index]=para.text().trim(); index++; } } } } // System.out.println(s .toString()); for(int i=0;i<s.length;i++){ System.out.println(s[i]); } catch (ข้อยกเว้น e) { e.printStackTrace(); } } }</span>