之前遇到一导出word文件的需求,我的做法是把对应导出内容放到一个word文件中,把其中变化的内容作为变量,然后把该word文件放在WEB-INF目录下用来作为模板。在导出时通过ServletContext的getRealPath()方法获取到作为模板的word文件的真实路径,然后针对该路径new一个FileInputStream。之后通过该word的InputStream构造一个HWPFDocument,再对里面的变量进行替换后输出到response的输出流中。大概代码如下所示:

  1. @WebServlet("/servlet/word/export.do")
  2. public class WordExportorServlet extends HttpServlet {
  3. /**
  4. * serialVersionUID
  5. */
  6. private static final long serialVersionUID = 1L;
  7. @Override
  8. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  9. throws ServletException, IOException {
  10. this.doPost(request, response);
  11. }
  12. @Override
  13. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  14. throws ServletException, IOException {
  15. String wordName = "中国人";  //假设这是我们word文档导出的文件名
  16. //假设这里获取到了word模板文件的相对于ServletContext根的路径
  17. String path = "/template.doc";
  18. ServletContext context = getServletContext();
  19. //获取word模板文件的绝对路径
  20. String realPath = context.getRealPath(path);
  21. //获取到作为模板的word文件的输入流
  22. InputStream is = new FileInputStream(realPath);
  23. HWPFDocument doc = new HWPFDocument(is);
  24. Range range = doc.getRange();
  25. //替换变量
  26. range.replaceText("${xx}", "xxx");
  27. response.setHeader("Content-Disposition", "attachment;filename=" + this.getFileName(wordName) + "");
  28. OutputStream output = response.getOutputStream();
  29. doc.write(output);
  30. output.close();
  31. is.close();
  32. }
  33. /**
  34. * 把wordName以ISO-8859-1编码,同时加上“.doc”后缀进行返回。
  35. * @param wordName 要导出的word文件的名称
  36. * @return
  37. */
  38. private String getFileName(String wordName) {
  39. try {
  40. wordName = new String(wordName.getBytes("UTF-8"), "ISO-8859-1"); //防中文乱码
  41. } catch (UnsupportedEncodingException e) {
  42. e.printStackTrace();
  43. }
  44. return wordName + ".doc";
  45. }
  46. }

这种方式放在tomcat或runJetty上都是没有问题的,但是一旦打包放到weblogic上就不行了。原因是weblogic上访问的是未解压的包里面的内容,这个时候通过ServletContext的getRealPath()方法是获取不到模板文件基于硬盘的真实路径的,从而导致获取不到模板文件的输入流,也就不能利用它来生成新的Word文档进行导出了。解决方法是在获取模板文件对应的输入流时不要通过ServletContext获取到文件的真实路径后再通过FileInputStream去取对应的输入流,而是直接通过ServletContext的getResourceAsStream()方法来获取到ServletContext环境下的资源作为输入流。建议以后需要在Web环境下获取资源文件时都通过getResourceAsStream()来获取。

  1. @WebServlet("/servlet/word/export.do")
  2. public class WordExportorServlet extends HttpServlet {
  3. /**
  4. * serialVersionUID
  5. */
  6. private static final long serialVersionUID = 1L;
  7. @Override
  8. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  9. throws ServletException, IOException {
  10. this.doPost(request, response);
  11. }
  12. @Override
  13. protected void doPost(HttpServletRequest request, HttpServletResponse response)
  14. throws ServletException, IOException {
  15. String wordName = "中国人";  //假设这是我们word文档导出的文件名
  16. //假设这里获取到了word模板文件的相对于ServletContext根的路径
  17. String path = "/template.doc";
  18. ServletContext context = getServletContext();
  19. //获取到作为模板的word文件的输入流
  20. InputStream is = context.getResourceAsStream(path);
  21. HWPFDocument doc = new HWPFDocument(is);
  22. Range range = doc.getRange();
  23. //替换变量
  24. range.replaceText("${xx}", "xxx");
  25. response.setHeader("Content-Disposition", "attachment;filename=" + this.getFileName(wordName) + "");
  26. OutputStream output = response.getOutputStream();
  27. doc.write(output);
  28. output.close();
  29. is.close();
  30. }
  31. /**
  32. * 把wordName以ISO-8859-1编码,同时加上“.doc”后缀进行返回。
  33. * @param wordName 要导出的word文件的名称
  34. * @return
  35. */
  36. private String getFileName(String wordName) {
  37. try {
  38. wordName = new String(wordName.getBytes("UTF-8"), "ISO-8859-1"); //防中文乱码
  39. } catch (UnsupportedEncodingException e) {
  40. e.printStackTrace();
  41. }
  42. return wordName + ".doc";
  43. }
  44. }

(注:本文是基于poi3.9所写)

Weblogic读不到Word文件的更多相关文章

  1. 怎样取消不能改动(仅仅读打开)的word文件的password

    作者:iamlaosong 朋友给我一个文档,是加了防改动password的,希望我能帮其取消.由于须要原文档的格式,取消方法例如以下(office2007环境): 1.打开文件.文件打开时,提演示样 ...

  2. 从一个word文件中读取所有的表格和标题(1)

    首先讲需求: 从word文件中读表格里的数据,然后插入数据库中.word文件中的表格是带有标题的,把标题读出来,进行匹配数据库. 需求分析: word2007底层是以xml文件存储的,所以分析xml的 ...

  3. Python处理word文件

    python对word文件进行读写和复制 import win32conimport win32com.clientimport os #读取word文件def readWoldFile(path): ...

  4. Java POI 读取word文件

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 1.读取word 2003及word 2007需要 ...

  5. 如何在浏览器网页中显示word文件内容

    如何在浏览器网页中显示word文件内容 把word文件读到byte[]中,再Response.OutputStream.Write(bytes)到客户端去 Page_Load事件中写: //FileS ...

  6. 基于java 合并.doc和docx格式的Word文件

    注:摘录自 https://www.cnblogs.com/shenzhouyh/articles/7243805.html 之前用过jacob 合并.doc,但是是有jacob有弊端: 服务器必须是 ...

  7. Java读取word文件,字体,颜色

    在Android读取Word文件时,在网上查看时可以用tm-extractors,但好像没有提到怎么读取Word文档中字体的颜色,字体,上下标等相关的属性.但由于需要,要把doc文档中的内容(字体,下 ...

  8. DSO Framer Control Object 操作word文件

    <1>DSO Framer Control Object 实现加载word文件的不可编辑 axFramerControl1.Open(OldPath); this.axFramerCont ...

  9. asp.net教程:GridView导出到Excel或Word文件

    asp.net教程:GridView导出到Excel或Word文件</ br> 在项目中我们经常会遇到要求将一些数据导出成Excel或者Word表格的情况,比如中国移动(我是中国移动用户) ...

随机推荐

  1. 自己动手实现java数据结构(六)二叉搜索树

    1.二叉搜索树介绍 前面我们已经介绍过了向量和链表.有序向量可以以二分查找的方式高效的查找特定元素,而缺点是插入删除的效率较低(需要整体移动内部元素):链表的优点在于插入,删除元素时效率较高,但由于不 ...

  2. Lucene 7.2.1 自定义TokenFilter

    1.自定义TokenFilter import org.apache.lucene.analysis.TokenFilter; import org.apache.lucene.analysis.To ...

  3. nginx禁止未绑定域名访问返回444

    来源于:http://blog.csdn.net/qq435792305/article/details/8298244

  4. 单例模式写MySQL model类,简单的增、删、改、查

    单例模式的用途,可用于数据库操作 <?php Class Db { static private $whe;//条件 static private $tab;//表名 static privat ...

  5. Django组件之Middleware

    一.中间件 在django的settings.py文件下,有一个变量为MIDDLEWARE,里面放的就是中间件. MIDDLEWARE = [ 'django.middleware.security. ...

  6. C# Code First 配置(二)

    上一篇文章地址 C# Code First 配置 此文章主要介绍配置映射到表中的详细字段.信息等,如下: System.ComponentModel.DataAnnotations 包含的特性: At ...

  7. FTP 150 Opening BINARY mode data connection for MLSD 读取目录列表失败

    这完全是因为防火墙的问题,把服务器的防火墙关闭之后,在连接,一切ok

  8. SQL 同一张表中相同字段的内容合并为一条记录(不同字段的那一列每个记录后面加逗号)

    一.创建表 create table stuUnion ( sid int identity primary key, cid int, id ) ) 二.添加数据 insert into stuUn ...

  9. Java高级类特性(二)

    一.static关键字 static关键字用来声明成员属于类,而不是属于类的对象.1). static (类)变量类变量可以被类的所有对象共享,以便与不共享的成员变量区分开来. static变量也称作 ...

  10. Tests of the Equality of Two Means

    Introduction In this lesson, we'll continue our investigation of hypothesis testing. In this case, w ...