Lorsque Java lit un document Word, bien qu'il existe de nombreux plug-ins poi, java2Word, jacob, itext, etc. introduits sur Internet, poi ne peut pas lire le format (la nouvelle API semble être encore en phase de recherche et développement, pas très stable, et je n'ai pas peur de faire des projets ); java2Word, jaco. b est facile de signaler les erreurs et ne trouve pas l'enregistrement, ce qui est assez étrange. Je l'ai essayé sur différentes machines, et les méthodes de fonctionnement sont exactement les mêmes. Certaines machines ne signalent pas d'erreurs, et certaines signalent des erreurs. forum pour trouver un expert pour le résoudre, mais je n'ai pas pu en dire la raison. Projet C'est un peu déroutant de le déployer et de l'utiliser ; itxt semble être très pratique à écrire, mais j'ai vérifié les informations pendant longtemps et je l'ai fait. Je n'ai pas vu une bonne façon de le lire. Après une certaine sélection, il est préférable d'utiliser RTF comme compromis. Après tout, RTF est un format open source et ne nécessite aucun plug-in. Il nécessite uniquement des opérations d'E/S de base et une conversion d'encodage. En apparence, les fichiers au format RTF ne sont pas différents des fichiers Doc. Ils peuvent être ouverts avec Word et différents formats peuvent être définis.
----- Fonctions implémentées : Lire le contenu du modèle RTF (format et contenu du texte), remplacer les parties modifiées et former un nouveau document RTF.
----- Idée d'implémentation : les parties fixes dans le modèle sont saisies manuellement et les parties modifiées sont représentées par $info$.
1. Lisez le contenu du modèle RTF sous forme d'octets
2. Convertir les chaînes de contenu variable en encodage RTF
3. Remplacez les parties variables dans le texte original pour former un nouveau document RTF
Les principales procédures sont les suivantes :
public String bin2hex(String bin) { char[] digital = "0123456789ABCDEF".toCharArray(); StringBuffer sb = new StringBuffer(""); byte[] bs = bin.getBytes(); 0; je < bs.length;i++) { bit = (bs[i] & 0x0f0) >> 4; sb.append("//'"); sb.append(digital[bit]); bit = bs[i] & 0x0f; sb.append(digital[bit]); String readByteRtf(InputStream ins, String path){ String sourcecontent = ""; try{ ins = new FileInputStream(path byte[] b = new); byte[1024]; if (ins == null) { System.out.println("Le fichier modèle source n'existe pas"); } int bytesRead = 0 while (true) { bytesRead = ins.read(b, 0, 1024 ); // renvoie le nombre final d'octets lus if(bytesRead == -1) {// fin de InputStream System.out.println("Fin de lecture du fichier modèle"); += new String(b, 0, bytesRead); // convertir en chaîne en utilisant des octets } }catch(Exception e){ e.printStackTrace( } return sourcecontent ;}
Ce qui précède est le code de base, et la partie restante est un remplacement. La méthode String.replace(oldstr, newstr); en java peut être réassemblée et implémentée, je ne la publierai donc pas ici. Veuillez consulter la pièce jointe pour les détails du code source.
Conditions préalables à l'exécution du code source :
Créez le répertoire YQ sur le lecteur c, copiez le "template.rtf" dans la pièce jointe dans le répertoire YQ et exécutez le fichier OperatorRTF.java. Le nom du fichier sera généré dans le répertoire YQ, tel que : 21:15 : 19_cheney_record Fichiers .rtf.
package com ; importer java.io.File ; importer java.io.FileInputStream ; importer java.io.FileWriter ; importer java.io.IOException ; importer java.io.InputStream ; importer java.io.PrintWriter ; importer java.text. SimpleDateFormat; importer java.util.Date; public class OperatorRTF { public String strToRtf (String content){ char[] digital = "0123456789ABCDEF".toCharArray(); StringBuffer sb = new StringBuffer(""); byte[] bs = content.getBytes(); .longueur; i++) { bit = (bs[i] & 0x0f0) >> 4; sb.append("//'"); sb.append(digital[bit]); bit = bs[i] & 0x0f; 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){ cible = content.replace("$infosend$",rc); } return target; } public String getSavePath() { String path = "C://YQ"; File fDirecotry = new File(path); ()) { fDirecotry.mkdirs(); } chemin de retour ; } public String ToSBC(String input){ char[] c = input.toCharArray(); (int i = 0; i < c.length; i++){ if (c[i] == 32){ c[i] = (char) 12288; continuer } if (c[i] < 127){ c [i] = (char) (c[i] + 65248); } } return new String(c); } public void rgModel (nom d'utilisateur String, contenu de la chaîne) { // TODO Stub de méthode généré automatiquement Date current=new Date(); SimpleDateFormat sdf=new java.text.SimpleDateFormat("aaaa-MM-jj HH:mm:ss"); ,13) + "heure" ; nom de la cible += sdf.format(current).substring(14,16) + "minute" ; += sdf.format(current).substring(17,19) + "secondes"; nomcible += "_" + nom d'utilisateur +"_record.rtf"; String strpath = getSavePath(); +"template.rtf"; String sourcecontent = ""; InputStream ins = null; try{ ins = new FileInputStream(sourname[] b = new); byte[1024]; if (ins == null) { System.out.println("Le fichier modèle source n'existe pas"); } int bytesRead = 0 while (true) { bytesRead = ins.read(b, 0, 1024 ); // renvoie le nombre final d'octets lus if(bytesRead == -1) {// fin de InputStream System.out.println("Fin de lecture du fichier modèle"); += new String(b, 0, bytesRead); // convertir en chaîne en utilisant des octets } }catch(Exception e){ e.printStackTrace( } String targetcontent = "" String array[] = content.split(" ~"); for(int i=0;i<array.length;i++){ if(i==0){ targetcontent = replaceRTF(sourcecontent, array[i], i); }else{ targetcontent = replaceRTF(targetcontent, array[i], i); } } try { FileWriter fw = new FileWriter(getSavePath()+"//" + targetname,true = new PrintWriter(fw); ("")||targetcontent==""){ out.println(sourcecontent); }else{ out.println(targetcontent); out.close(); fw.close(); System.out.println(getSavePath()+" Fichier généré dans ce répertoire" + targetname + "Success"); catch block e.printStackTrace(); } } public static void main(String[] args) { // TODO Stub de méthode généré automatiquement OperatorRTF oRTF = new OperatorRTF(); String content = "Du 12 octobre 2008 à 9h00 au 12 octobre 2008 à 6h00 ~ nous nous référons à la méthode de test des médicaments ~ nous nous référons à la méthode de test des médicaments ~ nous nous référons à la méthode de tester des médicaments ~ nous faisons référence à la méthode de test des médicaments"; oRTF.rgModel("cheney",content); }}
Exemple d'utilisation de POI pour lire des données tabulaires à partir d'un fichier Word :
<span style="font-size:14px;">package com.poi.world; importer java.io.FileInputStream ; importer org.apache.poi.hwpf.HWPFDocument ; importer org.apache.poi.hwpf.usermodel.Paragraph; ; importer org.apache.poi.hwpf.usermodel.Range ; org.apache.poi.hwpf.usermodel.Table; importer org.apache.poi.hwpf.usermodel.TableCell; importer org.apache.poi.hwpf.usermodel.TableIterator; ; importer org.apache.poi.poifs.filesystem.POIFSFileSystem ; public class POI_Word{ public static void main(String[] args){ try { String[] s=new String[20]; new HWPFDocument(pfs); Range range =hwpf.getRange(); TableIterator 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()); ; TableCell td=tr.getCell(j); for(int k=0;k<td.numParagraphs();k++){ //System.out.println("numParagraphs :"+td.numParagraphs()); Paragraphe 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>