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>
POI生成Web版Word文件的更多相关文章
- PHP生成 excl、word文件
PHP生成 excl.word文件 $time = time(); $filename = date("Y年m月d日h点m分s秒", $time).'问卷数据'; $rows ...
- Eclipse+Axis自动生成Web Service WSDL文件
JDK版本:1.5.0_22 Eclipse版本:Helios Service Release 2(3.6.2) 首先创建一个web工程,创建过程如下: 如果选择Apache Tomcat v5.5, ...
- 使用NPOI按照word模板文件生成新的word文件
/// <summary> /// 按照word模板文件 生成新word文件 /// </summary> /// <param name="tempFile& ...
- poi生成word2007及以上文件
一.简介 对于poi来说,poi可以完成对word.excel.ppt的处理.word目前有两种文件格式,一种是doc后缀.另一种是docx后缀的.2007之前的版本都是doc后缀的,这种格式poi使 ...
- java生成excel,word文件
第一部分: 在网站开发中,用户可能需要打印word或者excel表,这种需求是非常多的. java语言生成excel表格和python的方式有点像,使用Apache POI的组件,一通全通.开发过程通 ...
- php根据word模板生成新的word文件
原文地址:http://www.niu12.com/article/16 php使用phpword将word内容变量替换 a.安装phpword composer require phpoffice/ ...
- Java中用Apache POI生成excel和word文档
概述: 近期在做项目的过程中遇到了excel的数据导出和word的图文表报告的导出功能.最后决定用Apache POI来完毕该项功能.本文就项目实现过程中的一些思路与代码与大家共享.同一时候.也作为自 ...
- 【Java】使用Apache POI生成和解析Excel文件
概述 Excel是我们平时工作中比较常用的用于存储二维表数据的,JAVA也可以直接对Excel进行操作,分别有jxl和poi,2种方式. HSSF is the POI Project's pure ...
- POI把html写入word doc文件
直接把Html文本写入到Word文件 获取查看页面的body内容和引用的css文件路径传入到后台. 把对应css文件的内容读取出来. 利用body内容和css文件的内容组成一个标准格式的Html文本. ...
随机推荐
- PHP常用的正则表达式(有些需要调整)
平时做网站经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用: "^\d+$" //非负整数(正整数 + 0) 顺平注: 验证输入id数值,不能为0 $reg1='/ ...
- MVC 【Razor 视图引擎】案例分析
using MvcApplication1.Models; using System; using System.Collections.Generic; using System.Linq; usi ...
- Java 图形化界面设计(GUI)实战练习(代码)
关于Java图形化界面设计,基础知识网上可搜,下面简单介绍一下重点概念,然后就由浅入深代码实例. 程序是为了方便用户使用的,Java引入图形化界面编程. 1.JFrame 是容器类 2.AWT 是抽象 ...
- 《Head First设计模式》批注系列(一)——观察者设计模式
最近在读<Head First设计模式>一书,此系列会引用源书内容,但文章内容会更加直接,以及加入一些自己的理解. 观察者模式(有时又被称为模型-视图(View)模式.源-收听者(List ...
- linux学习笔记-软件包的相关知识
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一.软件包种类 1.源码包 源码包即提供源代码的发行包 2.二进制包 二进制包即提供二进制文件的发行包 安装方法查找二进制包官网 ...
- ajax小知识
1.ajax发送get请求时,需要注意如下情况: var uri="http://127.0.0.1:8071/springmvcdemo/bigdataapi/publishdata&qu ...
- OkHttp3源码详解(一) Request类
每一次网络请求都是一个Request,Request是对url,method,header,body的封装,也是对Http协议中请求行,请求头,实体内容的封装 public final class R ...
- Expo大作战(四十一)【完】--expo sdk 之 Assets,BarCodeScanner,AppLoading
Expo大作战系列完结! 简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与 ...
- redis介绍 (8) window 下redis的集群(cluster命令)
前言: 前段时间我在centos上搭建过一次redis集群,那是借助ruby搭建,这次我介绍一种纯redis集群命令的方式去搭建[最后我会简单介绍ruby搭建]. redis集群搭建(三主三备): 准 ...
- 一文学redis操作(记录向)
相关内容: 虽然有参考文档,而且记忆太多也是耗脑,但学习的时候还是想要有个系统划分开知识点的文档,即使不要求去细致记忆,但划分开知识块后脑子里的印象才会更清晰,所以就有了这个博文. 主要是将各种命令进 ...