Cuando Java lee un documento de Word, aunque hay muchos complementos poi, java2Word, jacob, itext, etc. introducidos en Internet, poi no puede leer el formato (la nueva API parece estar todavía en la etapa de investigación y desarrollo, no muy estable y no tengo miedo de hacer proyectos. Usar java2Word, jaco. b es fácil de informar errores y no puedo encontrar el registro, lo cual es bastante extraño. Lo he probado en diferentes máquinas y los métodos de operación son exactamente los mismos. Algunas máquinas no informan errores y algunas informan errores. foro para encontrar un experto para resolverlo, pero no pude decir el motivo. Proyecto Es un poco confuso implementarlo y usarlo. Parece muy conveniente escribirlo, pero revisé la información durante mucho tiempo y lo he hecho; No he visto una buena manera de leerlo. Después de una selección, es mejor usar RTF como compromiso. Después de todo, RTF es un formato de código abierto y no requiere ningún complemento. Solo requiere operaciones IO básicas y conversión de codificación. A primera vista, los archivos en formato rtf no son diferentes de los doc. Se pueden abrir con Word y se pueden configurar varios formatos.
----- Funciones implementadas: leer el contenido de la plantilla RTF (formato y contenido de texto), reemplazar las partes modificadas y formar un nuevo documento RTF.
----- Idea de implementación: las partes fijas en la plantilla se ingresan manualmente y las partes modificadas se representan con $ info $. Simplemente reemplace $ info $.
1. Lea el contenido de la plantilla RTF en forma de bytes.
2. Convierta cadenas de contenido variable a codificación RTF
3. Reemplace las partes variables en el texto original para formar un nuevo documento RTF.
Los principales procedimientos son los siguientes:
public String bin2hex(String bin) { char[] digital = "0123456789ABCDEF".toCharArray(); StringBuffer sb = new StringBuffer(""); bs = bin.getBytes(); int bit; 0; yo < bs.longitud;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 = nuevo); byte[1024]; if (ins == null) { System.out.println("El archivo de plantilla de origen no existe"); int bytesRead = 0; mientras (verdadero) { bytesRead = ins.read(b, 0, 1024); // devuelve el recuento de bytes de lectura final if(bytesRead == -1) {// fin de InputStream System.out.println("Fin de lectura del archivo de plantilla"); += new String(b, 0, bytesRead); // convertir a cadena usando bytes } }catch(Exception e){ e.printStackTrace() } return sourcecontent ;}
Lo anterior es el código principal y la parte restante es el reemplazo. El método String.replace(oldstr, newstr) en Java se puede volver a ensamblar e implementar, por lo que no lo publicaré aquí. Consulte el archivo adjunto para obtener detalles del código fuente.
Requisitos previos para ejecutar el código fuente:
Cree el directorio YQ en la unidad c, copie "template.rtf" en el archivo adjunto al directorio YQ y ejecute el archivo OperadorRTF.java. El nombre del archivo se generará en el directorio YQ, como por ejemplo: 21:15: 19_cheney_record archivos .rtf.
paquete com; importar java.io.File; importar java.io.FileInputStream; importar java.io.FileWriter; importar java.io.IOException; importar java.io.InputStream; importar java.io.PrintWriter; importar java.text. SimpleDateFormat;importar java.util.Date; clase pública OperadorRTF { cadena pública strToRtf(Cadena contenido){ char[] digital = "0123456789ABCDEF".toCharArray(); StringBuffer sb = new StringBuffer(""); byte[] bs = content.getBytes(); int bit; .longitud; i++) { bit = (bs[i] & 0x0f0) >> 4; sb.append("//'"); sb.append(digital[bit]); bit = bs[i] & 0x0f; sb.append(digital[bit]); Reemplazo de cadenaRTF (contenido de cadena, contenido de reemplazo de cadena, bandera int){ Cadena rc = strToRtf (reemplazar contenido de cadena = ""); if(bandera==0){ destino = contenido.replace("$timetop$",rc } if(bandera==1){ destino = content.replace("$info$",rc); bandera==2){ destino = contenido.replace("$idea$",rc); } if(bandera==3){ destino = contenido.replace("$consejo$",rc } if(bandera= =4){ objetivo = content.replace("$infosend$",rc); } destino de retorno; } cadena pública getSavePath() { ruta de cadena = "C://YQ"; Archivo fDirecotry = nuevo archivo (ruta); ()) { fDirecotry.mkdirs(); } ruta de retorno } public String ToSBC(String input){ char[] c = input.toCharArray(); (int i = 0; i < c.length; i++){ si (c[i] == 32){ c[i] = (char) 12288; continuar } si (c[i] < 127){ c [i] = (char) (c[i] + 65248); } } return new String(c } public void rgModel(String nombre de usuario, String content) { // TODO); Código auxiliar de método generado automáticamente Fecha actual=nueva Fecha(); SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String targetname = sdf.format(current).substring(11) ,13) + "hora"; nombre de destino += sdf.format(current).substring(14,16) + "minuto"; += sdf.format(current).substring(17,19) + "segundos"; nombre de destino += "_" + nombre de usuario +"_record.rtf"; String strpath = getSavePath(); String sourname +"// " +"template.rtf"; String sourcecontent = ""; InputStream ins = null; try{ ins = nuevo FileInputStream(sourname) b = nuevo; byte[1024]; if (ins == null) { System.out.println("El archivo de plantilla de origen no existe"); int bytesRead = 0; mientras (verdadero) { bytesRead = ins.read(b, 0, 1024); // devuelve el recuento de bytes de lectura final if(bytesRead == -1) {// fin de InputStream System.out.println("Fin de lectura del archivo de plantilla"); += new String(b, 0, bytesRead); // convertir a cadena usando bytes } }catch(Exception e){ e.printStackTrace(); String targetcontent = ""; ~"); for(int i=0;i<array.length;i++){ if(i==0){ contenido objetivo = reemplazarRTF(contenido fuente, matriz[i], i); }else{ contenido objetivo = reemplazarRTF(targetcontent, array[i], i); try { FileWriter fw = new FileWriter(getSavePath()+"//" + targetname,true out = new PrintWriter(fw); ("")||targetcontent==""){ out.println(sourcecontent); }else{ out.println(targetcontent); out.close(); fw.close(); System.out.println(getSavePath()+" Archivo generado en este directorio" + nombre de destino + "Éxito"); bloque de captura e.printStackTrace(); } } public static void main(String[] args) { // TODO Código auxiliar de método generado automáticamente OperadorRTF oRTF = nuevo OperadorRTF(); String content = "Desde las 9:00 del 12 de octubre de 2008 hasta las 6:00 del 12 de octubre de 2008 ~ nos referimos al método de prueba de medicamentos ~ nos referimos al método de prueba de medicamentos ~ nos referimos al método de probar medicamentos ~ nos referimos al método de prueba de medicamentos"; oRTF.rgModel("cheney",content); }}
Ejemplo de uso de POI para leer datos tabulares de un archivo de Word:
<span style="font-size:14px;">paquete com.poi.world; importar java.io.FileInputStream; importar org.apache.poi.hwpf.HWPFDocument; ; importar org.apache.poi.hwpf.usermodel.Range; org.apache.poi.hwpf.usermodel.Table; importar org.apache.poi.hwpf.usermodel.TableCell; importar org.apache.poi.hwpf.usermodel.TableIterator; ; importar org.apache.poi.poifs.filesystem.POIFSFileSystem; clase pública POI_Word{ vacío estático público; main(String[] args){ prueba { String[] s=new FileInputStream in=new FileInputStream("D://mayi.doc"); nuevo HWPFDocument(pfs); rango rango =hwpf.getRange(); TableIterator it=nuevo TableIterator(rango); int index=0; while(it.hasNext()){ Tabla tb=(Tabla)it.next(); for(int i=0;i<tb.numRows();i++){ //System.out. println("Numeros :"+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()); Párrafo 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]); e.printStackTrace(); } } }</span>