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文件中的示例:

Java代码  
  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样式。下面是一个针对于该方式的一个简单例子:

Java代码  
  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对应的内容如下:

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对应的内容如下:

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项目中做的,主要引用的依赖项有:

Xml代码  
  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>

转载于:https://www.cnblogs.com/telwanggs/p/4933054.html

POI生成Web版Word文件相关推荐

  1. POI根据模板导出word文件,以及word转PDF,PDF转图片再插入PDF中(防止PDF被修改)

    POI操作word和PDF POI根据模板导出word文件 word转PDF PDF转图片再插入PDF中(防止PDF被修改) POI根据模板导出word文件 一.制作word模版,${xxxx}是一会 ...

  2. Java基础系列19:使用JXL或者POI生成和解析Excel文件

    一 简介 如题所示,当我们需要在Java中解析Excel文件时,可以考虑使用JXL或POI的API来解析. 二者的区别如下: jxl现在基本上没被维护了,最近一次更新时间还是几年前.相反,poi属于A ...

  3. Python通过word模板生成新的word文件

    功能自定义好的word文档,生成新的word文件 模块地址:https://docxtpl.readthedocs.io/en/latest/ 使用模块 docxtpl 安装方式 在线安装 pip i ...

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

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

  5. npoi word生成HTML,使用NPOI按照word模板文件生成新的word文件

    /// /// 按照word模板文件 生成新word文件 /// /// 模板文件路径 /// 生成文件路径 /// 议案登记 public void CreateFileByTemplate(str ...

  6. Java POI合并多个word文件

    对于多个docx文件,可以使用POI合并生成一个组合的docx文件,这个方法分享给大家.不过对于docx文件中存在有图片的文档,此种方法没有做处理,需要的朋友可以自己扩展一下. import java ...

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

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

  8. php实现生成并下载word文件到本地

    要给最常用出租屋管理系统增加个合同功能,mark下知识点.要生成合同就需要使用phpword. 安装phpword包 通过composer安装phpword包.因为是使用thinkphp架构,安装挺方 ...

  9. poi生成的微软word打不开,但是wps可以打开,请大神帮忙解答下,灰常感谢

最新文章

  1. 信息记录拉取失败_天猫入驻为什么失败?猫店侠做详细解读
  2. 低通采样和带通采样定理
  3. 妇女在IT安全工作人员当中的比例只有10%
  4. dockerfile构建nginx服务
  5. 【学习笔记】产品成本计划(Product Cost Planning)01
  6. 清北学霸的书单居然那么有讲究?看看你比学霸少看了哪些书......
  7. 【英语学习】【Daily English】U04 Neighborhood L03 Oh, my bad
  8. 数据采集技术的难点在于哪里
  9. Raspberry Pi 构建一个飞机观察器
  10. freebsd下fcgi程序例子
  11. SQL查询语句大全集锦
  12. gitlab 503 错误的解决方案
  13. MYSQL 只能回环口链接_loopback回环口详解
  14. 即食水产消费品公司“不等食品”获千万元级A轮融资,险峰长青领投
  15. 西南石油大学计算机考研人数,8所高校报考人数汇总,21考研这是要妥妥突破400万人的节奏?...
  16. How Tomcat Works, A Guide to Developing Your Own Java Servlet Container
  17. 《机器学习-吴恩达》课程笔记week1-2
  18. 佳明520自制中文地图
  19. 【解决方案】智慧数据中心机房三维可视化运维系统
  20. 我的硬盘居然被win10安装工具_云骑士新版硬盘安装win10系统

热门文章

  1. (11)System Verilog对象复制
  2. FPGA设计经验总结
  3. 操作对象_有进取心的机器人学习对象操作的基本原理
  4. julia有 pytorch包吗_GitHub发布年度机器学习榜:TensorFlow最火,PyTorch失踪,Julia第四...
  5. python dictionary_Python 字典(Dictionary)
  6. STM32网络之中断
  7. 谷歌浏览器 转方向_转专业 | 希望你们能在岔路口选对自己的路
  8. 如何让程序一直运行_VBA程序正式运行前,要该如何进行调试呢?
  9. PHP生产一个验证码图片,PHP使用GD库生成验证码图片,实现图片验证
  10. c语言程序设计19,C语言程序设计19.pdf