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. 动手实现react Modal组件

    Modal组件 长话不多说,接下来让我们来动手实现一个react Modal组件. 我们先来看一下实际效果 Modal的布局 首先,让我们先思考下一个Modal组件的布局是怎么样的. 我们先拿一个基本 ...

  2. IntelliJ IDEA 2018.3 for Mac 注册码激活

    一.前往 jetbrains 官网下载 IDEA Ultimate版本,地址: https://www.jetbrains.com/idea/download/#section=mac 二.安装 ID ...

  3. 大话DI依赖注入+IOC控制反转(一) 之 定义

    转发时请注明原创作者及地址,否则追究责任.原创:alunchen 依赖注入与控制反转      依赖注入与控制反转是老生常谈的问题.一般面试也会面试到这种问题.网上很多很多这方面的资料,搜索出来一大堆 ...

  4. Asp.net Core 打包发布 (Linux+Nginx)

    如果你觉得如下这些文章对你有帮助,请点击链接支持作者原创 http://www.cnblogs.com/savorboard/ .Net Core SDK 命令介绍   前言 本篇主要介绍 asp.n ...

  5. 【esayui】扩展验证方法,控件验证

    基础验证 //页面调用方法$.extend($.fn.validatebox.defaults.rules, { 验证电话 IsPhoneRex: {validator: function (valu ...

  6. 【Spring】20、使用TransactionSynchronizationManager在spring事务提交之后进行一些操作。

    本文内容 如何在spring事务提交之后进行一些操作,这些操作必须得在该事务成功提交后才执行,回滚则不执行. 要点 如何在spring事务提交之后操作 如何在spring事务回滚之后操作 实现方案 使 ...

  7. iomanip的作用 C++

    c++程序里面经常见到下面的头文件 #include <iomanip> 这里面iomanip的作用比较多: 主要是对cin,cout之类的一些操纵运算子,比如setfill,setw,s ...

  8. Python3 系列之 编程规范篇

    编码规范 编码 如无特殊情况, 文件一律使用 UTF-8 编码 如无特殊情况, 文件头部必须加入 #--coding:utf-8-- 标识 缩进 统一使用 4 个空格进行缩进 引号 自然语言 使用双引 ...

  9. lnmp首次安装重置mysql密码

    第一种方法:一键修改LNMP环境下MYSQL数据库密码脚本 一键脚本肯定是非常方便.具体执行以下命令: wget http://soft.vpser.net/lnmp/ext/reset_mysql_ ...

  10. Internet Download Manager IDM 破解器

    IDM 全名Internet Download Manager  是一款国外的多线程下载神器(简称IDM),Internet Download Manager 支持多媒体下载.自动捕获链接.自动识别文 ...