Leia e escreva arquivos do Word Doc usando POI
O módulo HWPF do Apache POI é usado especialmente para ler e escrever arquivos do Word Doc. No HWPF, usamos o HWPFDocument para representar um documento do Word Doc. Existem vários conceitos no HWPFDocument:
Faixa : representa um intervalo, que pode ser o documento inteiro, uma determinada seção, um parágrafo (parágrafo) ou um parágrafo (caractere) com atributos comuns.
Seção : Uma subseção de um documento do Word. Um documento do Word pode ser composto por várias subseções.
Parágrafo : um parágrafo de um documento do Word, uma subseção pode ser composta por vários parágrafos.
Caracterrun : Um parágrafo de texto com as mesmas propriedades e um parágrafo pode ser composto por múltiplos caráters.
Tabela : uma tabela.
Tablerow : a linha correspondente à tabela.
Comprimido : a célula correspondente à tabela.
Seção, parágrafo, caracteres e tabela são todos herdados do intervalo.
1 Leia o arquivo do documento do Word
Em aplicativos diários, é muito raro lermos informações dos arquivos do Word e escrevemos conteúdo em arquivos do Word com mais frequência. Existem duas maneiras principais de ler dados dos arquivos do Word Doc usando POI: Leia através do WordExtractor e leia o HWPFDocument . Ao ler as informações dentro do WordExtractor, elas ainda são obtidas através do HWPFDocument.
1.1 Leia os arquivos através do WordExtractor
Ao ler um arquivo usando o WordExtractor, podemos apenas ler o conteúdo de texto do arquivo e algumas propriedades com base no documento. Quanto às propriedades do conteúdo do documento, não podemos lê -lo. Se você deseja ler as propriedades do conteúdo do documento, precisará usar o HWPFDocument para lê -lo. Aqui está um exemplo de uso do WordExtractor para ler arquivos:
classe pública hwpftest {@suppresswarnings ("deprecação") @test public void testReadByExtractor () lança Exceção {inputStream is = new FileInputStream ("d: //test.doc"); WordExtractor Extrator = new WordExtractor (IS); // em saída todo o texto do documento do Word System.out.println (extrator.getText ()); System.out.println (extrator.getTextFrompieces ()); // em saída o conteúdo do cabeçalho System.out.println ("cabeçalho:" + extrator.getheadeRText ()); // em saída o conteúdo do rodapé System.out.println ("Footer:" + Extrator.getFooterText ()); // em saída as informações de metadados do documento atual do Word, incluindo o autor, tempo de modificação do documento, etc. System.out.println (Extrator.getMetAdAtatexTextractor (). GetText ()); // Obtenha o texto de cada parágrafo string paratexts [] = extrator.getParagraphText (); para (int i = 0; i <paratexts.length; i ++) {System.out.println ("parágrafo" + (i + 1) + ":" + paratexts [i]); } // Expaida algumas informações sobre o Word PrintInfo atual (extrator.getSummaryInformation ()); // Exerta algumas informações sobre a palavra atual this.printInfo (extrator.getDocSummaryImFormation ()); this.ClosEstream (IS); } /** * SummaryInfomation de saída * @param info * /private void printInfo (resumo Informações sobre informações) {// autor system.out.println (info.getauthor ()); // Statistics de caracteres System.out.println (info.getcharcount ()); // número de páginas system.out.println (info.getpageCount ()); // title system.out.println (info.gettitle ()); // tema system.out.println (info.getSubject ()); } / * * // Company System.out.println (info.getcompany ()); } / *** Fechar o fluxo de entrada* @param IS* / private void ClosTream (inputStream is) {if (is! = Null) {try {is.close (); } catch (ioexception e) {e.printStackTrace (); }}}}1.2 Leia os arquivos através do hwpfdocument
O HWPFDocument é um representante dos documentos atuais do Word e suas funções são mais fortes que o WordExtractor. Por meio disso, podemos ler tabelas, listas, etc. no documento, e também podemos adicionar, modificar e excluir o conteúdo do documento. É que, depois que essas novas adições, modificações e exclusões são concluídas, as informações relevantes são salvas no HWPFDocument, o que significa que o que alteramos é o hwpfdocument, não os arquivos no disco. Se desejarmos que essas modificações entrem em vigor, podemos chamar o método de gravação do HWPFDocument para produzir o hwpfdDocument modificado para o fluxo de saída especificado. Este pode ser o fluxo de saída do arquivo original ou o fluxo de saída do novo arquivo (equivalente a salvar como) ou outros fluxos de saída. Aqui está um exemplo de leitura de um arquivo através do hwpfdocument:
classe pública hwpftest {@test public void testReadByDoc () lança Exceção {inputStream is = new FileInputStream ("d: //test.doc"); Hwpfdocument doc = novo hwpfdocument (IS); // Saída Informações de marcador this.printInfo (doc.getbookmarks ()); // Saída de texto text.out.println (doc.getDocumentText ()); Faixa range = doc.getRange (); // this.insertinfo (intervalo); this.printInfo (range); // leia a tabela this.readtable (range); // leia a lista this.readlist (intervalo); // Excluir intervalo r = novo intervalo (2, 5, doc); R.Delete (); // Excluir na memória, se você precisar salvá -lo em um arquivo, precisará grave -lo novamente no arquivo // gravar o hwpfdocument atual no fluxo de saída doc.Write (new FileOutputStream ("d: //test.doc"); this.ClosEstream (IS); } / *** Feche o fluxo de entrada* @param IS* / private void ClosTream (inputStream is) {if (is! = Null) {try {is.close (); } catch (ioexception e) {e.printStackTrace (); }}} / *** Saída de informação de marcador* @param marcadores* / private void printInfo (marcadores de favoritos) {int count = marckmarks.getbookmarksCount (); System.out.println ("Número de marcadores:" + contagem); Bookmark Bookmark; for (int i = 0; i <count; i ++) {markmark = markmarks.getbookmark (i); System.out.println ("marcador" + (i + 1) + "O nome é:" + markmark.getName ()); System.out.println ("Start Position:" + marckmark.getStart ()); System.out.println ("Posição final:" + marcador.getEnd ()); }} /*** Leia a tabela* Cada retorno do carro representa um parágrafo; portanto, para uma tabela, cada célula contém pelo menos um parágrafo e cada linha termina com um parágrafo. * @param range */private void readtable (faixa de faixa) {// transfira a tabela dentro do intervalo. TableIterator Tableiter = new TableIterator (intervalo); Tabela de mesa; Tablerow Row; Célula da mesa; while (Tablaiter.hasNext ()) {tabela = Tableiter.Next (); int rownum = tabela.numrows (); for (int j = 0; j <rOwnum; j ++) {row = tabela.getRow (j); int céllnum = row.numcells (); for (int k = 0; k <Cellnum; k ++) {Cell = row.getCell (k); // Sistema de texto de célula de saída.out.println (Cell.Text (). TRIM ()); }}}}} / *** Lista de leitura* @param range* / readlist private void (intervalo) {int num = range.numParagraphs (); Parágrafo para; for (int i = 0; i <num; i ++) {para = range.getParagraph (i); if (para.isinList ()) {System.out.println ("List:" + para.text ()); }}} /** * intervalo de saída * @param range * /private void printInfo (faixa de faixa) {// Obtenha o número de parágrafos int paranum = range.numparagraphs (); System.out.println (paranum); for (int i = 0; i <paranum; i ++) {// this.insertinfo (range.getParagraph (i)); System.out.println ("parágrafo" + (i + 1) + ":" + range.getParagraph (i) .Text ()); if (i == (paranum-1)) {this.insertinfo (range.getParagraph (i)); }} int secnum = range.numsecsesc (); System.out.println (secnum); Seção seção; for (int i = 0; i <segnum; i ++) {seção = range.getSection (i); System.out.println (Seção.getMarginLeft ()); System.out.println (seção.getMarginright ()); System.out.println (seção.getMarginright ()); System.out.println (seção.getMargintop ()); System.out.println (Section.getMarginBottom ()); System.out.println (Seção.getPageHeight ()); System.out.println (Section.Text ()); }} / *** Insira o conteúdo no intervalo, ele será gravado apenas na memória* @param range* / private void insertinfo (faixa range) {range.insertafter ("hello"); }}2 Escreva o arquivo doc.
Ao gravar arquivos do Word Doc usando POI, devemos primeiro ter um arquivo DOC, porque quando escrevemos arquivos do DOC, o escrevemos através do HWPFDocument e o HWPFDocument deve ser anexado a um arquivo DOC. Portanto, a maneira usual é primeiro preparar um arquivo doc com conteúdo em branco no disco rígido e, em seguida, criar um hwpfdocument com base no arquivo em branco. Depois disso, podemos adicionar um novo conteúdo ao HWPFDocument e, em seguida, escrevê -lo em outro arquivo DOC. Isso é equivalente a usar o POI para gerar um arquivo do Word Doc.
Em aplicativos reais, quando geramos arquivos do Word, geramos um certo tipo de arquivo. O formato desse tipo de arquivo é corrigido, mas alguns campos são diferentes. Portanto, em aplicações práticas, não precisamos gerar o conteúdo de todo o arquivo do Word através do HWPFDocument. Em vez disso, crie um novo documento do Word no disco e seu conteúdo é o conteúdo do arquivo do Word que precisamos gerar e, em seguida, use um método semelhante ao "$ {paramname}" para substituir alguns dos conteúdos que pertencem às variáveis. Dessa forma, quando geramos um arquivo do Word com base em determinadas informações, precisamos apenas obter o hwpfdocument com base no arquivo do Word e, em seguida, chamar o método ReplaceText () de intervalo para substituir a variável correspondente pelo valor correspondente e, em seguida, escreva o HWPFDocument atual no novo fluxo de saída. Esse método é usado com mais frequência em aplicações práticas, pois pode não apenas reduzir nossa carga de trabalho, mas também tornar o formato de texto mais claro. Vamos fazer um exemplo com base nesse método.
Suponha que agora tenhamos algumas informações em mudança e, em seguida, precisamos gerar um arquivo do Word Doc no formato a seguir através dessas informações:
Portanto, de acordo com a descrição acima, a primeira etapa é criar um arquivo DOC no formato correspondente como modelo, e seu conteúdo é o seguinte:
Com esse modelo, podemos criar o HWPFDocument correspondente e substituir a variável correspondente pelo valor correspondente e, em seguida, emitir o hwpfdocument ao fluxo de saída correspondente. Abaixo está o código correspondente.
classe pública hwpftest {@test public void testWrite () lança exceção {string templatePath = "d: //word//template.doc"; InputStream is = new FileInputStream (templatePath); Hwpfdocument doc = novo hwpfdocument (IS); Faixa range = doc.getRange (); // substitua $ {reportdate} no intervalo com o intervalo de data atual.ReplaceText ("$ {reportDate}", novo SimpleDateFormat ("yyyy-mm-dd"). Formato (new Date ())); range.ReplaceText ("$ {Appreseamt}", "100,00"); range.replacetext ("$ {bananaamt}", "200.00"); range.replacetext ("$ {totalamt}", "300.00"); OutputStream OS = new FileOutputStream ("d: //word//write.doc"); // exportar documentos para o fluxo de saída Doc.Write (OS); this.ClosEstream (OS); this.ClosEstream (IS); } / *** Fechar o fluxo de entrada* @param IS* / private void ClosTream (inputStream is) {if (is! = Null) {try {is.close (); } catch (ioexception e) {e.printStackTrace (); }}} / *** Feche o fluxo de saída* @param OS* / private void ClosTream (outputStream OS) {if (os! = Null) {try {OS.Close (); } catch (ioexception e) {e.printStackTrace (); }}}}}(Nota: este artigo é baseado no POI3.9)
Obrigado pela leitura, espero que isso possa ajudá -lo. Obrigado pelo seu apoio a este site!