Quando Java lê um documento do Word, embora existam muitos plug-ins poi, java2Word, jacob, itext, etc. introduzidos na Internet, poi não consegue ler o formato (a nova API parece ainda estar em fase de pesquisa e desenvolvimento, não muito estável e não tenho medo de fazer projetos Use); b é fácil reportar erros e não consegue encontrar o registro, o que é bastante estranho. Tentei em máquinas diferentes, e os métodos de operação são exatamente os mesmos. fórum para encontrar um especialista para resolvê-lo, mas não consegui dizer o motivo. Projeto É um pouco confuso implantar e usar itxt parece ser muito conveniente de escrever, mas verifiquei as informações há muito tempo e não o fiz. não vi uma boa maneira de lê-lo. Depois de alguma seleção, é melhor usar RTF como meio-termo. Afinal, RTF é um formato de código aberto e não requer nenhum plug-in. Requer apenas operações básicas de IO e conversão de codificação. Superficialmente, os arquivos no formato rtf não são diferentes dos doc. Eles podem ser abertos com word e vários formatos podem ser definidos.
----- Funções implementadas: Leia o conteúdo do modelo RTF (formato e conteúdo de texto), substitua as partes alteradas e forme um novo documento RTF.
----- Ideia de implementação: As partes fixas no template são inseridas manualmente e as partes alteradas são representadas por $info$.
1. Leia o conteúdo do modelo RTF em formato de byte
2. Converta strings de conteúdo variável em codificação RTF
3. Substitua as partes variáveis no texto original para formar um novo documento RTF
Os principais procedimentos são os seguintes:
public String bin2hex(String bin) { char[] digital = "0123456789ABCDEF".toCharArray(); 0; eu <bs.comprimento;i++) { bit = (bs[i] & 0x0f0) >> 4; sb.append("//'"); sb.append(digital[bit]); bit = bs[i] & 0x0f(digital[bit]); String readByteRtf(InputStream ins, String path){ String sourcecontent = ""; byte[1024]; if (ins == null) { System.out.println("O arquivo de modelo de origem não existe"); int bytesRead = 0 while (true) { bytesRead = ins.read(b, 0, 1024 ); // retorna a contagem final de bytes de leitura if(bytesRead == -1) {// fim do InputStream System.out.println("Fim da leitura do arquivo de modelo"); += new String(b, 0, bytesRead); // converte em string usando bytes } }catch(Exception e){ e.printStackTrace() } return sourcecontent ;}
O texto acima é o código principal e a parte restante é a substituição. O método String.replace(oldstr, newstr); Consulte o anexo para obter detalhes do código-fonte.
Pré-requisitos para executar o código-fonte:
Crie o diretório YQ na unidade c, copie o "template.rtf" do anexo para o diretório YQ e execute o arquivo OperatorRTF.java O nome do arquivo será gerado no diretório YQ, como: 21:15: 19_cheney_record arquivos .rtf.
pacote 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; classe pública OperadorRTF { public String strToRtf (String conteúdo){ char[] digital = "0123456789ABCDEF".toCharArray(); .comprimento; i++) { bit = (bs[i] & 0x0f0) >> 4; sb.append("//'"); sb.append(digital[bit]); bit = bs[i] & 0x0f(digital[bit]); String replaceRTF(String content,String replacecontent,int flag){ String rc = strToRtf(replacecontent String target = ""); 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=3){ target = content.replace("$advice$",rc); =4){ alvo = content.replace("$infosend$",rc); return target } public String getSavePath() { String path = "C://YQ"; ()) { fDirecotry.mkdirs() } caminho de retorno } 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 nome de usuário, String content) { // TODO Stub de método gerado automaticamente Date current=new Date() sdf=new java.text.SimpleDateFormat("aaaa-MM-dd HH:mm:ss"); ,13) + "hora"; nome do destino += sdf.format(atual).substring(14,16) + "minuto nome do destino"; += sdf.format(atual).substring(17,19) + "segundos"; targetname += "_" + nome de usuário +"_record.rtf"; +"template.rtf"; String sourcecontent = ""; InputStream ins = null; byte[1024]; if (ins == null) { System.out.println("O arquivo de modelo de origem não existe"); int bytesRead = 0 while (true) { bytesRead = ins.read(b, 0, 1024 ); // retorna a contagem final de bytes de leitura if(bytesRead == -1) {// fim do InputStream System.out.println("Fim da leitura do arquivo de modelo"); += new String(b, 0, bytesRead); // converte em string usando bytes } }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 = substituaRTF(targetcontent, array[i], i); } try { FileWriter fw = new FileWriter(getSavePath()+"//" + targetname,true); ("")||targetcontent==""){ out.println(sourcecontent); }else{ out.println(targetcontent }); out.close(); fw.close(); System.out.println(getSavePath()+" Arquivo gerado neste diretório" + targetname + "Sucesso"); catch block e.printStackTrace(); } public static void main(String[] args) { // TODO Método gerado automaticamente stub OperatorRTF oRTF = new OperatorRTF(); String content = "Das 9h do dia 12 de outubro de 2008 às 6h do dia 12 de outubro de 2008 ~ nos referimos ao método de teste de drogas ~ nos referimos ao método de teste de drogas ~ nos referimos ao método de testar drogas ~ nos referimos ao método de teste de drogas"; oRTF.rgModel("cheney",content); }}
Exemplo de uso de POI para ler dados tabulares de um arquivo word:
<span style="font-size:14px;">pacote com.poi.world; import java.io.FileInputStream; import 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; classe pública POI_Word{ public static void; main(String[] args){ tente { String[] s=new FileInputStream in=new FileInputStream("D://mayi.doc"); new HWPFDocument(pfs); intervalo intervalo =hwpf.getRange(); int índice=0; while(it.hasNext()){ Tabela tb=(Tabela)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()); Parágrafo 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();