POI生成Web版Word文件
POI生成Web版Word文件
1 通过URL的输入流实现
2 直接把Html文本写入到Word文件
所谓的使用POI生成Web版Word文件是指利用POI将Html代码插入到Word文件中使之呈现出Html代码对应的Web样式。下面将介绍两种方法来实现这一功能。
1 通过URL的输入流实现
通过URL实现的方式主要分为以下几步:
- 根据对应资源的Http路径构建一个URL。
- 获取URL对应的输入流。
- 构建一个默认的POIFSFileSystem。
- 通过构建的POIFSFileSystem和URL对应的输入流创建一个WordDocument。
- 把构建的POIFSFileSystem写入到对应的输出流。
经过上述五步,我们就可以把一个Http路径对应的内容写入到一个Word输出流中了。下面是一个把百度主页写入到一个本地Word文件中的示例:
- /**
- * Html到Word
- * @throws Exception
- */
- @org.junit.Test
- public void htmlToWord() throws Exception {
- URL url = new URL("http://www.baidu.com");
- InputStream is = url.openStream();
- OutputStream os = new FileOutputStream("d:\\baidu.doc");
- this.inputStreamToWord(is, os);
- }
- /**
- * 把is写入到对应的word输出流os中
- * 不考虑异常的捕获,直接抛出
- * @param is
- * @param os
- * @throws IOException
- */
- private void inputStreamToWord(InputStream is, OutputStream os) throws IOException {
- POIFSFileSystem fs = new POIFSFileSystem();
- //对应于org.apache.poi.hdf.extractor.WordDocument
- fs.createDocument(is, "WordDocument");
- fs.writeFilesystem(os);
- os.close();
- is.close();
- }
使用这种方式有一个不好的地方是你不一定有访问对应URL的权限,这个时候我们写入到Word文件的内容可能就是错误的。打个简单的比方,某一个URL需要进行登录了之后才能访问,这个时候你直接使用URL去对它进行访问可能会被系统引导到登录页面,如果这个时候把其对应的输入流写入到目标Word文件中,那么我们得到的Word文件的内容将是系统的登录页面,而不是目标URL原本应该对应的资源。有朋友可能会说了,这好办,我们可以使用对应用户信息来进行一次登录,之后再获取对应URL对应的资源。这样也可以实现。这里我要介绍第二种方式。
2 直接把Html文本写入到Word文件
曾经遇到这么一个需求,在某一个文件的查看页面,有一个导出为Word文件的功能。相信这是一个比较常见的需求。我当时的一个想法是既然文件的内容都已经在页面上了,那么我直接拿着文件的内容写入到Word文件不就完了。我当时是这么做的:
- 获取查看页面的body内容和引用的css文件路径传入到后台。
- 把对应css文件的内容读取出来。
- 利用body内容和css文件的内容组成一个标准格式的Html文本。
- 根据组合后的Html文本生成对应的ByteArrayInputStream。
- 构建一个默认的POIFSFileSystem,并利用它和生成的ByteArrayInputStream创建一个WordDocument。
- 把构建的POIFSFileSystem写入到对应的输出流。
经过上面这几步之后我们就可以把Html格式的文本写入到Word文件中,同时使生成的Word文件呈现出对应的Web样式。需要注意的是原本Html文件中引用到的css文件的内容需要放到生成的Word文件中,生成后的Word文件才会呈现出对应的Web样式。下面是一个针对于该方式的一个简单例子:
- @org.junit.Test
- public void htmlToWord2() throws Exception {
- InputStream bodyIs = new FileInputStream("d:\\1.html");
- InputStream cssIs = new FileInputStream("d:\\1.css");
- String body = this.getContent(bodyIs);
- String css = this.getContent(cssIs);
- //拼一个标准的HTML格式文档
- String content = "<html><head><style>" + css + "</style></head><body>" + body + "</body></html>";
- InputStream is = new ByteArrayInputStream(content.getBytes("GBK"));
- OutputStream os = new FileOutputStream("d:\\1.doc");
- this.inputStreamToWord(is, os);
- }
- /**
- * 把is写入到对应的word输出流os中
- * 不考虑异常的捕获,直接抛出
- * @param is
- * @param os
- * @throws IOException
- */
- private void inputStreamToWord(InputStream is, OutputStream os) throws IOException {
- POIFSFileSystem fs = new POIFSFileSystem();
- //对应于org.apache.poi.hdf.extractor.WordDocument
- fs.createDocument(is, "WordDocument");
- fs.writeFilesystem(os);
- os.close();
- is.close();
- }
- /**
- * 把输入流里面的内容以UTF-8编码当文本取出。
- * 不考虑异常,直接抛出
- * @param ises
- * @return
- * @throws IOException
- */
- private String getContent(InputStream... ises) throws IOException {
- if (ises != null) {
- StringBuilder result = new StringBuilder();
- BufferedReader br;
- String line;
- for (InputStream is : ises) {
- br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
- while ((line=br.readLine()) != null) {
- result.append(line);
- }
- }
- return result.toString();
- }
- returnnull;
- }
其中,文件1.html对应的内容如下:
- <table cellpadding="5" style="border-collapse: collapse;">
- <tr>
- <td>中文</td>
- <td>中文</td>
- <td>中文</td>
- <td>中文</td>
- </tr>
- <tr>
- <td>中文</td>
- <td>中文</td>
- <td>中文</td>
- <td>中文</td>
- </tr>
- </table>
文件1.css对应的内容如下:
- table {
- border: 1px solid blue;
- width: 800px;
- height: 500px;
- text-align: center;
- }
- td {
- width: 200px;
- border: 1px solid blue;
- }
最后生成的Word文件效果如下:
附注:
上述例子是在Maven项目中做的,主要引用的依赖项有:
- <dependency>
- <groupId>org.apache.poi</groupId>
- <artifactId>poi-scratchpad</artifactId>
- <version>3.9</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.11</version>
- </dependency>
转载于:https://www.cnblogs.com/telwanggs/p/4933054.html
POI生成Web版Word文件相关推荐
- POI根据模板导出word文件,以及word转PDF,PDF转图片再插入PDF中(防止PDF被修改)
POI操作word和PDF POI根据模板导出word文件 word转PDF PDF转图片再插入PDF中(防止PDF被修改) POI根据模板导出word文件 一.制作word模版,${xxxx}是一会 ...
- Java基础系列19:使用JXL或者POI生成和解析Excel文件
一 简介 如题所示,当我们需要在Java中解析Excel文件时,可以考虑使用JXL或POI的API来解析. 二者的区别如下: jxl现在基本上没被维护了,最近一次更新时间还是几年前.相反,poi属于A ...
- Python通过word模板生成新的word文件
功能自定义好的word文档,生成新的word文件 模块地址:https://docxtpl.readthedocs.io/en/latest/ 使用模块 docxtpl 安装方式 在线安装 pip i ...
- 使用NPOI按照word模板文件生成新的word文件
/// <summary>/// 按照word模板文件 生成新word文件/// </summary>/// <param name="tempFile&quo ...
- npoi word生成HTML,使用NPOI按照word模板文件生成新的word文件
/// /// 按照word模板文件 生成新word文件 /// /// 模板文件路径 /// 生成文件路径 /// 议案登记 public void CreateFileByTemplate(str ...
- Java POI合并多个word文件
对于多个docx文件,可以使用POI合并生成一个组合的docx文件,这个方法分享给大家.不过对于docx文件中存在有图片的文档,此种方法没有做处理,需要的朋友可以自己扩展一下. import java ...
- Java中用Apache POI生成excel和word文档
概述: 最近在做项目的过程中遇到了excel的数据导出和word的图文表报告的导出功能,最后决定用Apache POI来完成该项功能.本文就项目实现过程中的一些思路与代码与大家共享,同时,也作为自己的 ...
- php实现生成并下载word文件到本地
要给最常用出租屋管理系统增加个合同功能,mark下知识点.要生成合同就需要使用phpword. 安装phpword包 通过composer安装phpword包.因为是使用thinkphp架构,安装挺方 ...
- poi生成的微软word打不开,但是wps可以打开,请大神帮忙解答下,灰常感谢
最新文章
- 信息记录拉取失败_天猫入驻为什么失败?猫店侠做详细解读
- 低通采样和带通采样定理
- 妇女在IT安全工作人员当中的比例只有10%
- dockerfile构建nginx服务
- 【学习笔记】产品成本计划(Product Cost Planning)01
- 清北学霸的书单居然那么有讲究?看看你比学霸少看了哪些书......
- 【英语学习】【Daily English】U04 Neighborhood L03 Oh, my bad
- 数据采集技术的难点在于哪里
- Raspberry Pi 构建一个飞机观察器
- freebsd下fcgi程序例子
- SQL查询语句大全集锦
- gitlab 503 错误的解决方案
- MYSQL 只能回环口链接_loopback回环口详解
- 即食水产消费品公司“不等食品”获千万元级A轮融资,险峰长青领投
- 西南石油大学计算机考研人数,8所高校报考人数汇总,21考研这是要妥妥突破400万人的节奏?...
- How Tomcat Works, A Guide to Developing Your Own Java Servlet Container
- 《机器学习-吴恩达》课程笔记week1-2
- 佳明520自制中文地图
- 【解决方案】智慧数据中心机房三维可视化运维系统
- 我的硬盘居然被win10安装工具_云骑士新版硬盘安装win10系统
热门文章
- (11)System Verilog对象复制
- FPGA设计经验总结
- 操作对象_有进取心的机器人学习对象操作的基本原理
- julia有 pytorch包吗_GitHub发布年度机器学习榜:TensorFlow最火,PyTorch失踪,Julia第四...
- python dictionary_Python 字典(Dictionary)
- STM32网络之中断
- 谷歌浏览器 转方向_转专业 | 希望你们能在岔路口选对自己的路
- 如何让程序一直运行_VBA程序正式运行前,要该如何进行调试呢?
- PHP生产一个验证码图片,PHP使用GD库生成验证码图片,实现图片验证
- c语言程序设计19,C语言程序设计19.pdf