POI生成WebWord文件

1       通过URL的输入流实现

2       直接把Html文本写入到Word文件

所谓的使用POI生成Web版Word文件是指利用POI将Html代码插入到Word文件中使之呈现出Html代码对应的Web样式。下面将介绍两种方法来实现这一功能。

1       通过URL的输入流实现

通过URL实现的方式主要分为以下几步:

  1. 根据对应资源的Http路径构建一个URL。
  2. 获取URL对应的输入流。
  3. 构建一个默认的POIFSFileSystem。
  4. 通过构建的POIFSFileSystem和URL对应的输入流创建一个WordDocument。
  5. 把构建的POIFSFileSystem写入到对应的输出流。

经过上述五步,我们就可以把一个Http路径对应的内容写入到一个Word输出流中了。下面是一个把百度主页写入到一个本地Word文件中的示例:

  1. /**
  2. * Html到Word
  3. * @throws Exception
  4. */
  5. @org.junit.Test
  6. public void htmlToWord() throws Exception {
  7. URL url = new URL("http://www.baidu.com");
  8. InputStream is = url.openStream();
  9. OutputStream os = new FileOutputStream("d:\\baidu.doc");
  10. this.inputStreamToWord(is, os);
  11. }
  12. /**
  13. * 把is写入到对应的word输出流os中
  14. * 不考虑异常的捕获,直接抛出
  15. * @param is
  16. * @param os
  17. * @throws IOException
  18. */
  19. private void inputStreamToWord(InputStream is, OutputStream os) throws IOException {
  20. POIFSFileSystem fs = new POIFSFileSystem();
  21. //对应于org.apache.poi.hdf.extractor.WordDocument
  22. fs.createDocument(is, "WordDocument");
  23. fs.writeFilesystem(os);
  24. os.close();
  25. is.close();
  26. }

使用这种方式有一个不好的地方是你不一定有访问对应URL的权限,这个时候我们写入到Word文件的内容可能就是错误的。打个简单的比方,某一个URL需要进行登录了之后才能访问,这个时候你直接使用URL去对它进行访问可能会被系统引导到登录页面,如果这个时候把其对应的输入流写入到目标Word文件中,那么我们得到的Word文件的内容将是系统的登录页面,而不是目标URL原本应该对应的资源。有朋友可能会说了,这好办,我们可以使用对应用户信息来进行一次登录,之后再获取对应URL对应的资源。这样也可以实现。这里我要介绍第二种方式。

2       直接把Html文本写入到Word文件

曾经遇到这么一个需求,在某一个文件的查看页面,有一个导出为Word文件的功能。相信这是一个比较常见的需求。我当时的一个想法是既然文件的内容都已经在页面上了,那么我直接拿着文件的内容写入到Word文件不就完了。我当时是这么做的:

  1. 获取查看页面的body内容和引用的css文件路径传入到后台。
  2. 把对应css文件的内容读取出来。
  3. 利用body内容和css文件的内容组成一个标准格式的Html文本。
  4. 根据组合后的Html文本生成对应的ByteArrayInputStream。
  5. 构建一个默认的POIFSFileSystem,并利用它和生成的ByteArrayInputStream创建一个WordDocument。
  6. 把构建的POIFSFileSystem写入到对应的输出流。

经过上面这几步之后我们就可以把Html格式的文本写入到Word文件中,同时使生成的Word文件呈现出对应的Web样式。需要注意的是原本Html文件中引用到的css文件的内容需要放到生成的Word文件中,生成后的Word文件才会呈现出对应的Web样式。下面是一个针对于该方式的一个简单例子:

  1. @org.junit.Test
  2. public void htmlToWord2() throws Exception {
  3. InputStream bodyIs = new FileInputStream("d:\\1.html");
  4. InputStream cssIs = new FileInputStream("d:\\1.css");
  5. String body = this.getContent(bodyIs);
  6. String css = this.getContent(cssIs);
  7. //拼一个标准的HTML格式文档
  8. String content = "<html><head><style>" + css + "</style></head><body>" + body + "</body></html>";
  9. InputStream is = new ByteArrayInputStream(content.getBytes("GBK"));
  10. OutputStream os = new FileOutputStream("d:\\1.doc");
  11. this.inputStreamToWord(is, os);
  12. }
  13. /**
  14. * 把is写入到对应的word输出流os中
  15. * 不考虑异常的捕获,直接抛出
  16. * @param is
  17. * @param os
  18. * @throws IOException
  19. */
  20. private void inputStreamToWord(InputStream is, OutputStream os) throws IOException {
  21. POIFSFileSystem fs = new POIFSFileSystem();
  22. //对应于org.apache.poi.hdf.extractor.WordDocument
  23. fs.createDocument(is, "WordDocument");
  24. fs.writeFilesystem(os);
  25. os.close();
  26. is.close();
  27. }
  28. /**
  29. * 把输入流里面的内容以UTF-8编码当文本取出。
  30. * 不考虑异常,直接抛出
  31. * @param ises
  32. * @return
  33. * @throws IOException
  34. */
  35. private String getContent(InputStream... ises) throws IOException {
  36. if (ises != null) {
  37. StringBuilder result = new StringBuilder();
  38. BufferedReader br;
  39. String line;
  40. for (InputStream is : ises) {
  41. br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
  42. while ((line=br.readLine()) != null) {
  43. result.append(line);
  44. }
  45. }
  46. return result.toString();
  47. }
  48. returnnull;
  49. }

其中,文件1.html对应的内容如下:

  1. <table cellpadding="5" style="border-collapse: collapse;">
  2. <tr>
  3. <td>中文</td>
  4. <td>中文</td>
  5. <td>中文</td>
  6. <td>中文</td>
  7. </tr>
  8. <tr>
  9. <td>中文</td>
  10. <td>中文</td>
  11. <td>中文</td>
  12. <td>中文</td>
  13. </tr>
  14. </table>

文件1.css对应的内容如下:

  1. table {
  2. border: 1px solid blue;
  3. width: 800px;
  4. height: 500px;
  5. text-align: center;
  6. }
  7. td {
  8. width: 200px;
  9. border: 1px solid blue;
  10. }

最后生成的Word文件效果如下:

附注

上述例子是在Maven项目中做的,主要引用的依赖项有:

  1. <dependency>
  2. <groupId>org.apache.poi</groupId>
  3. <artifactId>poi-scratchpad</artifactId>
  4. <version>3.9</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>junit</groupId>
  8. <artifactId>junit</artifactId>
  9. <version>4.11</version>
  10. </dependency>

POI生成Web版Word文件的更多相关文章

  1. PHP生成 excl、word文件

    PHP生成 excl.word文件 $time = time();   $filename = date("Y年m月d日h点m分s秒", $time).'问卷数据';  $rows ...

  2. Eclipse+Axis自动生成Web Service WSDL文件

    JDK版本:1.5.0_22 Eclipse版本:Helios Service Release 2(3.6.2) 首先创建一个web工程,创建过程如下: 如果选择Apache Tomcat v5.5, ...

  3. 使用NPOI按照word模板文件生成新的word文件

    /// <summary> /// 按照word模板文件 生成新word文件 /// </summary> /// <param name="tempFile& ...

  4. poi生成word2007及以上文件

    一.简介 对于poi来说,poi可以完成对word.excel.ppt的处理.word目前有两种文件格式,一种是doc后缀.另一种是docx后缀的.2007之前的版本都是doc后缀的,这种格式poi使 ...

  5. java生成excel,word文件

    第一部分: 在网站开发中,用户可能需要打印word或者excel表,这种需求是非常多的. java语言生成excel表格和python的方式有点像,使用Apache POI的组件,一通全通.开发过程通 ...

  6. php根据word模板生成新的word文件

    原文地址:http://www.niu12.com/article/16 php使用phpword将word内容变量替换 a.安装phpword composer require phpoffice/ ...

  7. Java中用Apache POI生成excel和word文档

    概述: 近期在做项目的过程中遇到了excel的数据导出和word的图文表报告的导出功能.最后决定用Apache POI来完毕该项功能.本文就项目实现过程中的一些思路与代码与大家共享.同一时候.也作为自 ...

  8. 【Java】使用Apache POI生成和解析Excel文件

    概述 Excel是我们平时工作中比较常用的用于存储二维表数据的,JAVA也可以直接对Excel进行操作,分别有jxl和poi,2种方式. HSSF is the POI Project's pure ...

  9. POI把html写入word doc文件

    直接把Html文本写入到Word文件 获取查看页面的body内容和引用的css文件路径传入到后台. 把对应css文件的内容读取出来. 利用body内容和css文件的内容组成一个标准格式的Html文本. ...

随机推荐

  1. 自己动手实现java数据结构(一) 向量

    1.向量介绍 计算机程序主要运行在内存中,而内存在逻辑上可以被看做是连续的地址.为了充分利用这一特性,在主流的编程语言中都存在一种底层的被称为数组(Array)的数据结构与之对应.在使用数组时需要事先 ...

  2. Canvas画空心正五角星-扩展DEMO为五星红旗

    马上就要国庆了,在这个举国欢庆的日子里面,让我来画一个五角星表表我的爱国之情,啊?那你不是要画一个五星红旗?是的,你猜对了,其实我的最初想法只是画一个空心的正五角星,为了满足你,我拼一拼.在这个过程中 ...

  3. 朴素贝叶斯分类器及Python实现

    贝叶斯定理 贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进行修正的定理,在概率论中具有重要地位. 先验概率分布(边缘概率)是指基于主观判断而非样本分布的概率分布,后验概率(条件概率)是根据 ...

  4. vi/vim使用

    移动光标上:k nk:向上移动n行 9999k或gg可以移到第一行 G移到最后一行下:j nj:向下移动n行左:h nh:向左移动n列右:l nl:向右移动n列 w:光标以单词向前移动 nw:光标向前 ...

  5. asp.net session mode 几种状态 (转)

    开发asp.net应用时,修改web.config中的SessionState节点. stateserver模式: <sessionState mode="StateServer&qu ...

  6. HTML之marquee(文字滚动)详解

    语法: <marquee></marquee> 以下是一个最简单的例子: 代码如下: <marquee><font size=+3 color=red> ...

  7. 【Spring】25、Spring代理。 BeanNameAutoProxyCreator 与 ProxyFactoryBean

    一般我们可以使用ProxyBeanFactory,并配置proxyInterfaces,target和interceptorNames实现,但如果需要代理的bean很多,无疑会对spring配置文件的 ...

  8. 【Java基础】3、Java 位运算(移位、位与、或、异或、非)

    public class Test { public static void main(String[] args) { // 1.左移( << ) // 0000 0000 0000 0 ...

  9. 【开发工具之eclipse】7、eclipse代码自动提示,eclipse设置代码自动提示

    首先打开Eclipse开发软件,然后在工具栏的[Window],点击后找到弹出列表中的[Preferences]选项,然后点击这个选项   现在弹出的窗口就是JAVA开发人员常见的设置窗口了,我们依次 ...

  10. Nginx学习笔记(三)--- Nginx实现反向代理和配置负载均衡

    1.反向代理 2.Nginx反向代理流程图 3.安装多个tomcat 3.1把tomcat的压缩包传到Linux上 3.2 解压tomcat 3.3 给压缩好的tomcat改个名字用来区分一下 3.4 ...