1. 程式人生 > >Java引用POI實現Word轉Html方法

Java引用POI實現Word轉Html方法

1.下載POI工具並引用

2.讀取整個doc文件,獲得該文件的所有字串。

3.從該字串中得到標題,把該標題構成一個HTML格式的字串,如<html><head><title>測試文件</title></head><body>

4.從該文件中判斷是否有表格,如有,把每個表格的開始偏移量,結束偏移量記錄下來,同時根據每個表格的行,列讀取表格的內容,並構造出表格的HTML字串。

5.從該字串的第一個字元開始逐個字元迴圈,得到字元的字型,字號大小,直到下一個字元的字型,字號不一樣時,把這些字元內容構造成一個HTML格式的字串。

6.如果碰到字元為回車符,製表符,把回車符,製表符構造成HTML格式的字串。

7.如果碰到字元為圖片,讀取圖片,把圖片放在指定路徑,再把這一路徑的資訊構造成HTML字串,如<img src='c://test//1.jpg'/>

8.如讀取字串的位置等於表格的開始偏移量時,插入前面一構造出的表格HTML字串,同時跳過表格的結束偏移量,繼續往下迴圈讀取字元。

9.由於以上讀取是按字串逐個讀取,並且根據字元的變化同時構造出HTML字串,所以當字串讀取完畢後,即構造出一個完整的HTML字串。

10.舉例

Word檔案

HTML檔案

11.原始碼

WordExcelToHtml.java

[java] view plaincopyprint?
  1. package com;  
  2. import java.io.BufferedWriter;  
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileNotFoundException;  
  6. import java.io.FileOutputStream;  
  7. import java.io.IOException;  
  8. import java.io.OutputStream;  
  9. import java.io.OutputStreamWriter;  
  10. import org.apache.poi.hwpf.HWPFDocument;  
  11. import org.apache.poi.hwpf.model.PicturesTable;  
  12. import org.apache.poi.hwpf.usermodel.CharacterRun;  
  13. import org.apache.poi.hwpf.usermodel.Picture;  
  14. import org.apache.poi.hwpf.usermodel.Range;  
  15. import org.apache.poi.hwpf.extractor.WordExtractor;  
  16. import org.apache.poi.hwpf.usermodel.Paragraph;     
  17. import org.apache.poi.hwpf.usermodel.Table;     
  18. import org.apache.poi.hwpf.usermodel.TableCell;     
  19. import org.apache.poi.hwpf.usermodel.TableIterator;     
  20. import org.apache.poi.hwpf.usermodel.TableRow;     
  21. publicclass WordExcelToHtml {  
  22. /** 
  23.      * 回車符ASCII碼 
  24.      */
  25. privatestaticfinalshort ENTER_ASCII = 13;  
  26. /** 
  27.      * 空格符ASCII碼 
  28.      */
  29. privatestaticfinalshort SPACE_ASCII = 32;  
  30. /** 
  31.      * 水平製表符ASCII碼 
  32.      */
  33. privatestaticfinalshort TABULATION_ASCII = 9;  
  34. publicstatic String htmlText = "";  
  35. publicstatic String htmlTextTbl = "";  
  36. publicstaticint counter=0;  
  37. publicstaticint beginPosi=0;  
  38. publicstaticint endPosi=0;  
  39. publicstaticint beginArray[];  
  40. publicstaticint endArray[];  
  41. publicstatic String htmlTextArray[];  
  42. publicstaticboolean tblExist=false;  
  43. publicstaticfinal String inputFile="c://bb.doc";  
  44. publicstaticvoid main(String argv[])  
  45.     {         
  46. try {  
  47.             getWordAndStyle(inputFile);  
  48.         } catch (Exception e) {  
  49. // TODO Auto-generated catch block
  50.             e.printStackTrace();  
  51.         }  
  52.     }  
  53. /** 
  54.      * 讀取每個文字樣式 
  55.      *  
  56.      * @param fileName 
  57.      * @throws Exception 
  58.      */
  59. publicstaticvoid getWordAndStyle(String fileName) throws Exception {  
  60.         FileInputStream in = new FileInputStream(new File(fileName));  
  61.         HWPFDocument doc = new HWPFDocument(in);  
  62.          Range rangetbl = doc.getRange();//得到文件的讀取範圍   
  63.          TableIterator it = new TableIterator(rangetbl);   
  64. int num=100;          
  65.          beginArray=newint[num];  
  66.          endArray=newint[num];  
  67.          htmlTextArray=new String[num];  
  68. // 取得文件中字元的總數
  69. int length = doc.characterLength();  
  70. // 建立圖片容器
  71.         PicturesTable pTable = doc.getPicturesTable();  
  72.         htmlText = "<html><head><title>" + doc.getSummaryInformation().getTitle() + "</title></head><body>";  
  73. // 建立臨時字串,好加以判斷一串字元是否存在相同格式
  74. if(it.hasNext())  
  75.          {  
  76.              readTable(it,rangetbl);  
  77.          }  
  78. int cur=0;  
  79.         String tempString = "";  
  80. for (int i = 0; i < length - 1; i++) {  
  81. // 整篇文章的字元通過一個個字元的來判斷,range為得到文件的範圍
  82.             Range range = new Range(i, i + 1, doc);  
  83.             CharacterRun cr = range.getCharacterRun(0);   
  84. //beginArray=new int[num];
  85. //endArray=new int[num];
  86. //htmlTextArray=new String[num];
  87. if(tblExist)  
  88.             {  
  89. if(i==beginArray[cur])  
  90.                 {          
  91.                     htmlText+=tempString+htmlTextArray[cur];  
  92.                     tempString="";  
  93.                     i=endArray[cur]-1;  
  94.                     cur++;  
  95. continue;  
  96.                 }  
  97.             }  
  98. if (pTable.hasPicture(cr)) {  
  99.                 htmlText +=  tempString ;                 
  100. // 讀寫圖片             
  101.                 readPicture(pTable, cr);  
  102.                 tempString = "";                  
  103.             }   
  104. else {  
  105.                 Range range2 = new Range(i + 1, i + 2, doc);  
  106. // 第二個字元
  107.                 CharacterRun cr2 = range2.getCharacterRun(0);  
  108. char c = cr.text().charAt(0);  
  109.                 System.out.println(i+"::"+range.getEndOffset()+"::"+range.getStartOffset()+"::"+c);  
  110. // 判斷是否為回車符
  111. if (c == ENTER_ASCII)  
  112.                     {  
  113.                     tempString += "<br/>";  
  114.                     }  
  115. // 判斷是否為空格符
  116. elseif (c == SPACE_ASCII)  
  117.                     tempString += " ";  
  118. // 判斷是否為水平製表符
  119. elseif (c == TABULATION_ASCII)  
  120.                     tempString += "    ";  
  121. // 比較前後2個字元是否具有相同的格式
  122. boolean flag = compareCharStyle(cr, cr2);  
  123. if (flag)  
  124.                     tempString += cr.text();  
  125. else {  
  126.                     String fontStyle = "<span style="font-family:" + cr.getFontName() + ";font-size:" + cr.getFontSize() / 2 + "pt;";  
  127. if (cr.isBold())  
  128.                         fontStyle += "font-weight:bold;";  
  129. if (cr.isItalic())  
  130.                         fontStyle += "font-style:italic;";  
  131.                     htmlText += fontStyle + "" mce_style="font-family:" + cr.getFontName() + ";font-size:" + cr.getFontSize() / 2 + "pt;";  
  132. if (cr.isBold())  
  133.                         fontStyle += "font-weight:bold;";  
  134. if (cr.isItalic())  
  135.                         fontStyle += "font-style:italic;";  
  136.                     htmlText += fontStyle + "">" + tempString + cr.text() + "</span>";  
  137.                     tempString = "";  
  138.                 }  
  139.             }  
  140.         }  
  141.         htmlText += tempString+"</body></html>";  
  142.         writeFile(htmlText);  
  143.     }  
  144. /** 
  145.      * 讀寫文件中的表格 
  146.      *  
  147.      * @param pTable 
  148.      * @param cr 
  149.      * @throws Exception 
  150.      */
  151. publicstaticvoid readTable(TableIterator it, Range rangetbl) throws Exception {  
  152.         htmlTextTbl="";  
  153. //迭代文件中的表格  
  154.         counter=-1;  
  155. while (it.hasNext())   
  156.         {   
  157.             tblExist=true;  
  158.              htmlTextTbl="";  
  159.              Table tb = (Table) it.next();      
  160.              beginPosi=tb.getStartOffset() ;  
  161.              endPosi=tb.getEndOffset();  
  162.              System.out.println("............"+beginPosi+"...."+endPosi);  
  163.              counter=counter+1;  
  164. //迭代行,預設從0開始
  165.              beginArray[counter]=beginPosi;  
  166.              endArray[counter]=endPosi;  
  167.              htmlTextTbl+="<table border>";  
  168. for (int i = 0; i < tb.numRows(); i++) {        
  169.              TableRow tr = tb.getRow(i);     
  170.              htmlTextTbl+="<tr>";  
  171. //迭代列,預設從0開始   
  172. for (int j = 0; j < tr.numCells(); j++) {        
  173.                  TableCell td = tr.getCell(j);//取得單元格
  174. int cellWidth=td.getWidth();  
  175. //取得單元格的內容   
  176. for(int k=0;k<td.numParagraphs();k++){        
  177.                          Paragraph para =td.getParagraph(k);        
  178.                          String s = para.text().toString().trim();     
  179. if(s=="")  
  180.                          {  
  181.                              s=" ";  
  182.                          }  
  183.                          System.out.println(s);     
  184.                          htmlTextTbl += "<td width="+cellWidth+ ">"+s+"</td>";  
  185.                          System.out.println(i+":"+j+":"+cellWidth+":"+s);  
  186.                     } //end for       
  187.                  }   //end for   
  188.               }   //end for   
  189.             htmlTextTbl+="</table>" ;      
  190.             htmlTextArray[counter]=htmlTextTbl;  
  191.         } //end while 
  192.     }     
  193. /** 
  194.      * 讀寫文件中的圖片 
  195.      *  
  196.      * @param pTable 
  197.      * @param cr 
  198.      * @throws Exception 
  199.      */
  200. publicstaticvoid readPicture(PicturesTable pTable, CharacterRun cr) throws Exception {  
  201. // 提取圖片
  202.         Picture pic = pTable.extractPicture(cr, false);  
  203. // 返回POI建議的圖片檔名
  204.         String afileName = pic.suggestFullFileName();  
  205.         OutputStream out = new FileOutputStream(new File("c://test" + File.separator + afileName));  
  206.         pic.writeImageContent(out);  
  207.         htmlText += "<img src="c://test//" + afileName + "" mce_src="c://test//" + afileName + ""/>";
  208.     }  
  209. publicstaticboolean compareCharStyle(CharacterRun cr1, CharacterRun cr2)   
  210.     {  
  211. boolean flag = false;  
  212. if (cr1.isBold() == cr2.isBold() && cr1.isItalic() == cr2.isItalic() && cr1.getFontName().equals(cr2.getFontName()) && cr1.getFontSize() == cr2.getFontSize())   
  213.         {  
  214.             flag = true;  
  215.         }  
  216. return flag;  
  217.     }  
  218. /** 
  219.      * 寫檔案 
  220.      *  
  221.      * @param s 
  222.      */
  223. publicstaticvoid writeFile(String s) {  
  224.         FileOutputStream fos = null;  
  225.         BufferedWriter bw = null;  
  226. try {  
  227.             File file = new File("c://abc.html");  
  228.             fos = new FileOutputStream(file);  
  229.             bw = new BufferedWriter(new OutputStreamWriter(fos));  
  230.             bw.write(s);  
  231.         } catch (FileNotFoundException fnfe) {  
  232.             fnfe.printStackTrace();  
  233.         } catch (IOException ioe) {  
  234.             ioe.printStackTrace();  
  235.         } finally {  
  236. try {  
  237. if (bw != null)  
  238.                     bw.close();  
  239. if (fos != null)  
  240.                     fos.close();  
  241.             } catch (IOException ie) {  
  242.             }  
  243.         }  
  244.     }  

相關推薦

Java引用POI實現WordHtml方法

1.下載POI工具並引用 2.讀取整個doc文件,獲得該文件的所有字串。 3.從該字串中得到標題,把該標題構成一個HTML格式的字串,如<html><head><title>測試文件</title></head&

POI實現WordHTML檔案

package cn.wgd.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOExcept

poi實現dochtml

alt 保存圖片 man input bdb result amr try catch 廢話,不多說直接上代碼。 一、doc轉html,並且帶文件夾 / * word轉html * html轉圖片 * @param tagPath 轉換htm

poi實現PPThtml

temp nts user 阿裏 oat ali bag exc ffffff 哈哈,終於兩個月了(筆者不玩網遊,雖然脾氣越來越不好,但是生活越來越充實)。不扯了,今晚還要再寫一篇呢,直接上代碼。 package com.css.java.learn

poi實現dochtml獲取帶樣式內容,並在ueditor中顯示

doc轉html獲取帶樣式內容,並在ueditor中顯示 工具類: 獲取返回的內容,存到資料庫。 package com.wb.core.utils; import org.apache.poi.hwpf.HWPFDocument; import org.apach

C# web實現word Html、officeHtml、pdf圖片 線上預覽檔案

 改篇 pdf 預覽再本機沒問題,釋出再iis中 不行 ,(使用剪貼簿的問題..excel和word 可以,) 詳細配置及程式碼 word 轉Html 複製程式碼  1 /// <summary>  2         /// word轉成html  3  

Java:封裝POI實現word的docx檔案的簡單模板功能

一:場景 通過Word模板來實現動態的word生成 二: 基本要求 1:替換文字中的內容 2:替換表格中的內容(不用動態生成表格) 3:替換後的內容應該與替換前的內容格式相同 4:模板修改方便 5:效果如下: 模板: 結果: 三:p

java實現線上預覽--poi實現word、excel、ppthtml

分享一下我的偶像大神的人工智慧教程!http://blog.csdn.net/jiangjunshow 也歡迎轉載我的文章,轉載請註明出處 https://blog.csdn.net/aabbyyz java實現線上預覽 - -之poi實現word、e

java實現線上預覽--poi實現word excel ppthtml

                        java實現線上

java語言通過Aspose元件 實現wordpdf、png、html..

    :使用Aspose元件可以實現word向DOC, DOCX, OOXML, RTF HTML,OpenDocument, PDF,EPUB, XPS, SWF 轉換 由於基本方法都一樣,在此我只展示word轉pdf的功能      前期準備: MyEcl

java 實現word PDF (採用第三方技術 IText、Poi、Jsoup)

    先講講思路:                        第一步:使用 poi 將word轉換成 html,這裡程式碼一搜一堆沒什麼好說的,千篇一律。                         (值得注意的地方是IText 根據html生成pdf檔案的時候

javapoi實現word讀取和修改操作(

java程式設計要實現對word的操作沒有vb那種程式語言來得容易,得藉助一些開源元件,其中就包括jacob、poi等, 而poi應用得最為廣泛,對word2003和2007的讀和寫word操作都十分方便。它是Apache組織的一個專案,早在2001年就已經發布了第 一個版本,可以說是apache組織的一

java實現wordpdf第二種方法

import java.io.FileInputStream;   import java.io.FileOutputStream;   import java.io.InputStream;   import java.io.OutputStream;   import java.util.HashMap;

[轉載]java實現wordpdf

write 方法 class toolbar servlet 效果 app 文檔 實現  最近遇到一個項目需要把word 轉成pdf,百度了一下網上的方案有很多,比如虛擬打印、給word 裝擴展插件等,這些方案都依賴於ms word 程序,在java代碼中也得使用諸如jac

實現wordpdf,HTMLpdf(探索篇)

ner ase node eth ack line prope fin -o 筆者找依賴的jar包,找的好辛苦。 ITextRenderer、ITextFontResolver這兩個類依賴的jar包到底是哪個,還有怎麽下載?苦苦糾結了3個小時。終於找到你了!記錄個網址:ht

POIword化為html

參考資料 1.POI包依賴:https://poi.apache.org/components/index.html 2.包版本問題:https://bbs.csdn.net/topics/392208805 並沒有使用其中的3.9的版本,使用的為3.13 最開始使用的

PCB MS SQL 標量函式(CLR) 實現DataTableHTML方法

 一.準備需轉為HMLT字串的DataTable資料       在資料庫中執行一段SQL返回的資料                 需轉換後的HTML的文字 <

Java實現WordPDF方案選擇

Java實現Word轉PDF方案選擇       很多應用場景中都會涉及到Word轉PDF,但Word轉PDF的方案在網上一搜一大把,讓人眼花繚亂,筆者踩過無數的坑後,最終總結出以下三種方案 OpenOffice實現

Wordhtml實現線上預覽

word轉html,可以同時支援doc和docx兩種格式,非常好用 開發工具:idea 專案管理工具:maven 不多說,直接擼程式碼 1、首先配置pom.xml檔案,具體配置如下 2、工具類的開發 /** * WORD轉HTML docx格式 * POI版本: 3.10-

C#實現wordhtml命令列工具

需求 有個CMS系統的詳細資訊的來源是人手工編寫的word文件,需求如下: 文件是手工編輯而成的word文件(.docx) 文件具備一定的基本格式,其中包括標題、圖片、流程圖、簡介、按序號排布的詳細說明 初步只需要將這些文件可以以html頁面的形