Java引用POI实现Word转Html方法

论坛 期权论坛 脚本     
匿名网站用户   2020-12-21 09:34   945   0

原文: http://blog.csdn.net/fyqcdbdx/article/details/7630122

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

  1. packagecom;
  2. importjava.io.BufferedWriter;
  3. importjava.io.File;
  4. importjava.io.FileInputStream;
  5. importjava.io.FileNotFoundException;
  6. importjava.io.FileOutputStream;
  7. importjava.io.IOException;
  8. importjava.io.OutputStream;
  9. importjava.io.OutputStreamWriter;
  10. importorg.apache.poi.hwpf.HWPFDocument;
  11. importorg.apache.poi.hwpf.model.PicturesTable;
  12. importorg.apache.poi.hwpf.usermodel.CharacterRun;
  13. importorg.apache.poi.hwpf.usermodel.Picture;
  14. importorg.apache.poi.hwpf.usermodel.Range;
  15. importorg.apache.poi.hwpf.extractor.WordExtractor;
  16. importorg.apache.poi.hwpf.usermodel.Paragraph;
  17. importorg.apache.poi.hwpf.usermodel.Table;
  18. importorg.apache.poi.hwpf.usermodel.TableCell;
  19. importorg.apache.poi.hwpf.usermodel.TableIterator;
  20. importorg.apache.poi.hwpf.usermodel.TableRow;
  21. publicclassWordExcelToHtml{
  22. /**
  23. *回车符ASCII码
  24. */
  25. privatestaticfinalshortENTER_ASCII=13;
  26. /**
  27. *空格符ASCII码
  28. */
  29. privatestaticfinalshortSPACE_ASCII=32;
  30. /**
  31. *水平制表符ASCII码
  32. */
  33. privatestaticfinalshortTABULATION_ASCII=9;
  34. publicstaticStringhtmlText="";
  35. publicstaticStringhtmlTextTbl="";
  36. publicstaticintcounter=0;
  37. publicstaticintbeginPosi=0;
  38. publicstaticintendPosi=0;
  39. publicstaticintbeginArray[];
  40. publicstaticintendArray[];
  41. publicstaticStringhtmlTextArray[];
  42. publicstaticbooleantblExist=false;
  43. publicstaticfinalStringinputFile="c://bb.doc";
  44. publicstaticvoidmain(Stringargv[])
  45. {
  46. try{
  47. getWordAndStyle(inputFile);
  48. }catch(Exceptione){
  49. //TODOAuto-generatedcatchblock
  50. e.printStackTrace();
  51. }
  52. }
  53. /**
  54. *读取每个文字样式
  55. *
  56. *@paramfileName
  57. *@throwsException
  58. */
  59. publicstaticvoidgetWordAndStyle(StringfileName)throwsException{
  60. FileInputStreamin=newFileInputStream(newFile(fileName));
  61. HWPFDocumentdoc=newHWPFDocument(in);
  62. Rangerangetbl=doc.getRange();//得到文档的读取范围
  63. TableIteratorit=newTableIterator(rangetbl);
  64. intnum=100;
  65. beginArray=newint[num];
  66. endArray=newint[num];
  67. htmlTextArray=newString[num];
  68. //取得文档中字符的总数
  69. intlength=doc.characterLength();
  70. //创建图片容器
  71. PicturesTablepTable=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. intcur=0;
  79. StringtempString="";
  80. for(inti=0;i<length-1;i++){
  81. //整篇文章的字符通过一个个字符的来判断,range为得到文档的范围
  82. Rangerange=newRange(i,i+1,doc);
  83. CharacterRuncr=range.getCharacterRun(0);
  84. //beginArray=newint[num];
  85. //endArray=newint[num];
  86. //htmlTextArray=newString[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. Rangerange2=newRange(i+1,i+2,doc);
  106. //第二个字符
  107. CharacterRuncr2=range2.getCharacterRun(0);
  108. charc=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. booleanflag=compareCharStyle(cr,cr2);
  123. if(flag)
  124. tempString+=cr.text();
  125. else{
  126. StringfontStyle="<spanstyle="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. *@parampTable
  148. *@paramcr
  149. *@throwsException
  150. */
  151. publicstaticvoidreadTable(TableIteratorit,Rangerangetbl)throwsException{
  152. htmlTextTbl="";
  153. //迭代文档中的表格
  154. counter=-1;
  155. while(it.hasNext())
  156. {
  157. tblExist=true;
  158. htmlTextTbl="";
  159. Tabletb=(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+="<tableborder>";
  168. for(inti=0;i<tb.numRows();i++){
  169. TableRowtr=tb.getRow(i);
  170. htmlTextTbl+="<tr>";
  171. //迭代列,默认从0开始
  172. for(intj=0;j<tr.numCells();j++){
  173. TableCelltd=tr.getCell(j);//取得单元格
  174. intcellWidth=td.getWidth();
  175. //取得单元格的内容
  176. for(intk=0;k<td.numParagraphs();k++){
  177. Paragraphpara=td.getParagraph(k);
  178. Strings=para.text().toString().trim();
  179. if(s=="")
  180. {
  181. s="";
  182. }
  183. System.out.println(s);
  184. htmlTextTbl+="<tdwidth="+cellWidth+">"+s+"</td>";
  185. System.out.println(i+":"+j+":"+cellWidth+":"+s);
  186. }//endfor
  187. }//endfor
  188. }//endfor
  189. htmlTextTbl+="</table>";
  190. htmlTextArray[counter]=htmlTextTbl;
  191. }//endwhile
  192. }
  193. /**
  194. *读写文档中的图片
  195. *
  196. *@parampTable
  197. *@paramcr
  198. *@throwsException
  199. */
  200. publicstaticvoidreadPicture(PicturesTablepTable,CharacterRuncr)throwsException{
  201. //提取图片
  202. Picturepic=pTable.extractPicture(cr,false);
  203. //返回POI建议的图片文件名
  204. StringafileName=pic.suggestFullFileName();
  205. OutputStreamout=newFileOutputStream(newFile("c://test"+File.separator+afileName));
  206. pic.writeImageContent(out);
  207. htmlText+="<imgsrc="c://test//"+afileName+""mce_src="c://test//"+afileName+""/>";
  208. }
  209. publicstaticbooleancompareCharStyle(CharacterRuncr1,CharacterRuncr2)
  210. {
  211. booleanflag=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. returnflag;
  217. }
  218. /**
  219. *写文件
  220. *
  221. *@params
  222. */
  223. publicstaticvoidwriteFile(Strings){
  224. FileOutputStreamfos=null;
  225. BufferedWriterbw=null;
  226. try{
  227. Filefile=newFile("c://abc.html");
  228. fos=newFileOutputStream(file);
  229. bw=newBufferedWriter(newOutputStreamWriter(fos));
  230. bw.write(s);
  231. }catch(FileNotFoundExceptionfnfe){
  232. fnfe.printStackTrace();
  233. }catch(IOExceptionioe){
  234. ioe.printStackTrace();
  235. }finally{
  236. try{
  237. if(bw!=null)
  238. bw.close();
  239. if(fos!=null)
  240. fos.close();
  241. }catch(IOExceptionie){
  242. }
  243. }
  244. }
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP