Wenn Java ein Word-Dokument liest, kann POI das Format nicht lesen, obwohl im Internet viele Plug-Ins wie POI, Java2Word, Jacob, IText usw. eingeführt wurden (die neue API scheint sich noch in der Forschungs- und Entwicklungsphase zu befinden). sehr stabil, und ich habe keine Angst, Projekte durchzuführen; java2Word, jaco b ist einfach, Fehler zu melden und kann die Registrierung nicht finden, was ziemlich seltsam ist. Ich habe es auf verschiedenen Maschinen versucht, und die Bedienungsmethoden sind genau die gleichen. Einige Maschinen melden keine Fehler Forum, um einen Experten zu finden, der das Problem löst, aber ich konnte den Grund nicht nennen. Die Bereitstellung und Verwendung von itxt scheint sehr praktisch zu sein, aber ich habe die Informationen lange überprüft und es getan Ich habe keine gute Möglichkeit gesehen, es zu lesen. Nach einiger Auswahl ist es am besten, RTF als Kompromiss zu verwenden. Schließlich ist RTF ein Open-Source-Format und erfordert keine Plug-Ins. Es sind lediglich grundlegende E/A-Vorgänge und die Kodierungskonvertierung erforderlich. Oberflächlich betrachtet unterscheiden sich Dateien im RTF-Format nicht von Dokumenten. Sie können mit Word geöffnet werden und es können verschiedene Formate eingestellt werden.
----- Implementierte Funktionen: Lesen Sie den Inhalt der RTF-Vorlage (Format und Textinhalt), ersetzen Sie die geänderten Teile und erstellen Sie ein neues RTF-Dokument.
----- Umsetzungsidee: Die festen Teile in der Vorlage werden manuell eingegeben und die geänderten Teile werden durch $info$ dargestellt. Ersetzen Sie einfach $info$.
1. Lesen Sie den Inhalt der RTF-Vorlage in Byteform
2. Konvertieren Sie Zeichenfolgen mit variablem Inhalt in RTF-Kodierung
3. Ersetzen Sie die variablen Teile im Originaltext, um ein neues RTF-Dokument zu erstellen
Die wichtigsten Verfahren sind wie folgt:
public String bin2hex(String bin) { char[] digital = "0123456789ABCDEF(); sb = new StringBuffer(""); bs = bin.getBytes(); 0; i < bs.length;i++) { bit = (bs[i] & 0x0f0) >> 4; sb.append("//'"); sb.append(digital[bit]); String readByteRtf(InputStream ins, String path){ String sourcecontent = ""; try{ ins = new FileInputStream(path) b = new byte[1024]; if (ins == null) { System.out.println("Quellvorlagendatei existiert nicht"); int bytesRead = 0; 1024); // letzte gelesene Byteanzahl zurückgeben if(bytesRead == -1) {// end of InputStream System.out.println("End of reading template file"); += new String(b, 0, bytesRead); // in String konvertieren mit Bytes } }catch(Exception e){ e.printStackTrace();
Das Obige ist der Kerncode und der verbleibende Teil ist der Ersatz. Die String.replace(oldstr, newstr);-Methode kann in Java neu zusammengesetzt und implementiert werden, daher werde ich sie hier nicht veröffentlichen. Einzelheiten zum Quellcode finden Sie im Anhang.
Voraussetzungen für die Ausführung des Quellcodes:
Erstellen Sie das YQ-Verzeichnis auf dem Laufwerk C, kopieren Sie die Datei „template.rtf“ im Anhang in das YQ-Verzeichnis und führen Sie die Datei OperatorRTF.java aus. Der Dateiname wird im YQ-Verzeichnis generiert, z. B.: 21:15: 19_cheney_record .rtf-Dateien.
package com; import java.io.File;import java.io.FileInputStream;import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;import java.io.PrintWriter;import java.text. SimpleDateFormat;import java.util.Date; public class OperatorRTF { public String strToRtf(String content){ char[] digital = "0123456789ABCDEF".toCharArray(); StringBuffer(""); for (int i = 0; i < bs .length; i++) { bit = (bs[i] & 0x0f0) >> 4; sb.append("//'"); sb.append(digital[bit]); String replaceRTF(String content,String replacecontent,int flag){ String rc = strToRtf(replacecontent); if(flag==0){ target = content.replace("$timetop$",rc } if(flag==1){ target = content.replace("$info$",rc } if( flag==2){ target = content.replace("$idea$",rc); } if(flag==3){ target = content.replace("$advice$",rc } if(flag= =4){ Ziel = content.replace("$infosend$",rc); } return target; } public String getSavePath() { String path = "C://YQ"; if (!fDirecotry.exists ()) { fDirecotry.mkdirs(); } return path; } public String ToSBC(String input){ char[] c = input.toCharArray(); (int i = 0; i < c.length; i++){ if (c[i] == 32){ c[i] = (char) 12288 } if (c[i] < 127){ c [i] = (char) (c[i] + 65248); return new String(c); } public void rgModel(String username, String content) { // TODO Automatisch generierter Methoden-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) + „Stunde“; Zielname += sdf.format(aktuell).substring(14,16) + „Minute“; += sdf.format(current).substring(17,19) + "seconds"; targetname += "_" + username +"_record.rtf"; String strath = getSavePath(); +"template.rtf"; String sourcecontent = ""; InputStream ins = null; byte[1024]; if (ins == null) { System.out.println("Quellvorlagendatei existiert nicht"); int bytesRead = 0; 1024); // letzte gelesene Byteanzahl zurückgeben if(bytesRead == -1) {// end of InputStream System.out.println("End of reading template file"); += new String(b, 0, bytesRead); // in String konvertieren mit Bytes } }catch(Exception e){ e.printStackTrace(); } String targetcontent = ""; ~"); for(int i=0;i<array.length;i++){ if(i==0){ targetcontent = replacementRTF(sourcecontent, array[i], i); }else{ targetcontent = replaceRTF(targetcontent, array[i], i); try { FileWriter fw = new FileWriter(getSavePath()+"//" + targetname,true); if(targetcontent.equals ("")||targetcontent==""){ out.println(sourcecontent); }else{ out.println(targetcontent }); out.close(); fw.close(); System.out.println(getSavePath()+" In diesem Verzeichnis generierte Datei" + Zielname + "Erfolg"); Catch-Block e.printStackTrace(); } } public static void main(String[] args) { // TODO Automatisch generierter Methoden-Stub OperatorRTF orRTF = new OperatorRTF(); String content = "Von 9:00 Uhr am 12. Oktober 2008 bis 6:00 Uhr am 12. Oktober 2008 ~ wir beziehen uns auf die Methode zum Testen von Medikamenten ~ wir beziehen uns auf die Methode zum Testen von Medikamenten ~ wir beziehen uns auf die Methode zum Testen von Medikamenten ~ wir beziehen uns auf die Methode zum Testen von Medikamenten"; oRTF.rgModel("cheney",content); }}
Beispiel für die Verwendung von POI zum Lesen tabellarischer Daten aus einer Word-Datei:
<span style="font-size:14px;">package com.poi.world; import java.io.FileInputStream; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.usermodel.Paragraph ; import org.apache.poi.hwpf.usermodel.Range; org.apache.poi.hwpf.usermodel.Table; import org.apache.poi.hwpf.usermodel.TableCell; import org.apache.poi.hwpf.usermodel.TableIterator; import org.apache.poi.hwpf.usermodel.TableRow ; import org.apache.poi.poifs.filesystem.POIFSFileSystem; public class POI_Word{ public static void main(String[] args){ try { String[] s=new String[20]; FileInputStream in=new FileInputStream("D://mayi.doc"); new HWPFDocument(pfs); Range range =hwpf.getRange(); it=new TableIterator(range); 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); 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()); Absatz 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 (Exception e) { e.printStackTrace(); } } </span>