Java读取word文档解决方案

2019-03-16 14:59

Java读取word文档解决方案

java读取word文档时,虽然网上介绍了很多插件poi、java2Word、jacob、itext等等,poi无法读取格式(新的API估计行好像还在处于研发阶段,不太稳定,做项目不太敢用);java2Word、jacob容易报错找不到注册,比较诡异,我曾经在不同的机器上试过,操作方法完全一致,有的机器不报错,有的报错,去他们论坛找高人解决也说不出原因,项目部署用它有点玄;itxt好像写很方便但是我查了好久资料没有见到过关于读的好办法。经过一番选择还是折中点采用rtf最好,毕竟rtf是开源格式,不需要借助任何插件,只需基本IO操作外加编码转换即可。rtf格式文件表面看来和doc没啥区别,都可以用word打开,各种格式都可以设定。

----- 实现的功能:读取rtf模板内容(格式和文本内容),替换变化部分,形成新的rtf文档。

----- 实现思路:模板中固定部分手动输入,变化的部分用$info$表示,只需替换$info$即可。 1、采用字节的形式读取rtf模板内容 2、将可变的内容字符串转为rtf编码

3、替换原文中的可变部分,形成新的rtf文档

主要程序如下: Java代码

1. /** 2. * 将制定的字符串转换为rtf编码 3. */ 4. public String bin2hex(String bin) { 5. char[] digital = \.toCharArray(); 6. StringBuffer sb = new StringBuffer(\); 7. byte[] bs = bin.getBytes(); 8. int bit; 9. for (int i = 0; i < bs.length;i++) { 10. bit = (bs[i] & 0x0f0) >> 4; 11. sb.append(\); 12. sb.append(digital[bit]); 13. bit = bs[i] & 0x0f; 14. sb.append(digital[bit]); 15. } 16. return sb.toString(); 17. } 18. 19. /** 20. * 字节形式读取rtf模板内容 21. */ 22. public String readByteRtf(InputStream ins, String path){ 23. String sourcecontent = \; 24. try{ 25. ins = new FileInputStream(path); 26. byte[] b = new byte[1024]; 27. if (ins == null) { 28. System.out.println(\源模板文件不存在\); 29. } 30. int bytesRead = 0; 31. while (true) { 32. bytesRead = ins.read(b, 0, 1024); // return final read bytes counts 33. if(bytesRead == -1) {// end of InputStream 34. System.out.println(\读取模板文件结束\); 35. break; 36. } 37. sourcecontent += new String(b, 0, bytesRead); // convert to string using bytes 38. } 39. }catch(Exception e){ 40. e.printStackTrace(); 41. } 42. }

以上为核心代码,剩余部分就是替换,从新组装java中的String.replace(oldstr,newstr);方法可以实现,在这就不贴了。源代码部分详见附件。运行源代码前提:

c盘创建YQ目录,将附件中\模板.rtf\复制到YQ目录之下,运行OpreatorRTF.java文件即可,就会在YQ目录下生成文件名如:21时15分19秒_cheney_记录.rtf 的文件。。。。。文件名是在程序中指定的呵呵。由于是由商业软件中拆分出的demo所以只是将自己原来的写的程序分离,合并在一个java文件中,所以有的方法在示例程序中看似多余,没有必要那么麻烦。

对于替换部分需要循环的特例程序,我不好拆分,里面很容易暴露商业软件的东西,所以就不贴了,有需要的话可以加我QQ或者MSN,一起讨论呵呵。附件传了半天也没有传上去,没有办法只有这样搞了呵呵。模板文件附件无法存放,需要的直接联系呵呵。其实直接看以下的java程序部分,就会明白 Java代码

1. 2. /** 3. * 以下部分是java源代码 4. */ 5. 6. package com; 7. 8. import java.io.File; 9. import java.io.FileInputStream; 10. import java.io.FileWriter; 11. import java.io.IOException; 12. import java.io.InputStream; 13. import java.io.PrintWriter; 14. import java.text.SimpleDateFormat; 15. import java.util.Date; 16. 17. public class OperatorRTF { 18. 19. /** 20. * 字符串转换为rtf编码 21. * @param content 22. * @return 23. */ 24. public String strToRtf(String content){ 25. char[] digital = \.toCharArray(); 26. StringBuffer sb = new StringBuffer(\); 27. byte[] bs = content.getBytes(); 28. int bit; 29. for (int i = 0; i < bs.length; i++) { 30. bit = (bs[i] & 0x0f0) >> 4; 31. sb.append(\); 32. sb.append(digital[bit]); 33. bit = bs[i] & 0x0f; 34. sb.append(digital[bit]); 35. } 36. return sb.toString(); 37. } 38. 39. /** 40. * 替换文档的可变部分 41. * @param content 42. * @param replacecontent 43. * @param flag 44. * @return 45. */ 46. public String replaceRTF(String content,String replacecontent,int flag){ 47. String rc = strToRtf(replacecontent); 48. String target = \; 49. /*if(flag==0){ 50. target = content.replace(\ 51. }*/ 52. if(flag==0){ 53. target = content.replace(\,rc); 54. } 55. if(flag==1){ 56. target = content.replace(\,rc); 57. } 58. if(flag==2){ 59. target = content.replace(\,rc); 60. } 61. if(flag==3){ 62. target = content.replace(\,rc); 63. } 64. if(flag==4){ 65. target = content.replace(\,rc); 66. } 67. return target; 68. } 69. 70. /** 71. * 获取文件路径 72. * @param flag 73. * @return 74. */ 75. public String getSavePath() { 76. 77. String path = \; 78. 79. File fDirecotry = new File(path); 80. if (!fDirecotry.exists()) { 81. fDirecotry.mkdirs(); 82. } 83. return path; 84. } 85. 86. /** 87. * 半角转为全角 88. */ 89. public String ToSBC(String input){ 90. char[] c = input.toCharArray(); 91. for (int i = 0; i < c.length; i++){ 92. if (c[i] == 32){ 93. c[i] = (char) 12288; 94. continue; 95. } 96. if (c[i] < 127){ 97. c[i] = (char) (c[i] + 65248); 98. } 99. } 100. return new String(c); 101. } 102. 103. public void rgModel(String username, String content) { 104. // TODO Auto-generated method stub 105. /* 构建生成文件名 targetname:12时10分23秒_username_记录.rtf */ 106. Date current=new Date(); 107. SimpleDateFormat sdf=new java.text.SimpleDateFormat(\mm:ss\); 108. String targetname = sdf.format(current).substring(11,13) + \时\; 109. targetname += sdf.format(current).substring(14,16) + \分\; 110. targetname += sdf.format(current).substring(17,19) + \秒\; 111. targetname += \ + username +\记录.rtf\; 112. 113. /* 字节形式读取模板文件内容,将结果转为字符串 */ 114. String strpath = getSavePath(); 115. String sourname = strpath+\模板.rtf\ 116. String sourcecontent = \; 117. InputStream ins = null; 118. try{ 119. ins = new FileInputStream(sourname); 120. byte[] b = new byte[1024]; 121. if (ins == null) { 122. System.out.println(\源模板文件不存在\); 123. } 124. int bytesRead = 0; 125. while (true) { 126. bytesRead = ins.read(b, 0, 1024); // return final read bytes counts 127. if(bytesRead == -1) {// end of InputStream 128. System.out.println(\读取模板文件结束\); 129. break; 130. } 131. sourcecontent += new String(b, 0, bytesRead); // convert to string using bytes 132. } 133. }catch(Exception e){ 134. e.printStackTrace(); 135. } 136. /* 修改变化部分 */ 137. String targetcontent = \; 138. /** 139. * 拆分之后的数组元素与模板中的标识符对应关系 140. * array[0]:timetop 141. * array[1]:info


Java读取word文档解决方案.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《制药工程学》复习资料-李红茹

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: