POI生成Web版Word文件

简介:   POI生成Web版Word文件   1       通过URL的输入流实现 2       直接把Html文本写入到Word文件         所谓的使用POI生成Web版Word文件是指利用POI将Html代码插入到Word文件中使之呈现出Html代码对应的Web样式。

 

POI生成WebWord文件

 

1       通过URL的输入流实现

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

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

 

1       通过URL的输入流实现

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

  1. 根据对应资源的Http路径构建一个URL
  2. 获取URL对应的输入流。
  3. 构建一个默认的POIFSFileSystem
  4. 通过构建的POIFSFileSystemURL对应的输入流创建一个WordDocument
  5. 把构建的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文件不就完了。我当时是这么做的:

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

 
   @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>

 

 

  

 

 

目录
相关文章
|
7月前
|
数据可视化 Shell Linux
shell+crontab+gitlab实现ecs服务器文件的web展示
本文通过把ecs服务器上的文件定时上传至gitlab,实现文件的页面可视化和修改历史。技术点:shell、crontab、gitlab。
98 3
|
数据库
如何在web.config文件中配置连接Access数据库?
如何在web.config文件中配置连接Access数据库?
94 0
|
5月前
|
Web App开发 前端开发 安全
2024年新一代WebOffice内嵌网页组件,Web网页在线编辑Word/Excel/PPT
WebOffice控件面临兼容性、用户体验和维护难题。随着浏览器更新,依赖插件的技术不再适用,如Chrome不再支持NPAPI和PPAPI。产品普遍不支持多版本Office并存,定制能力弱,升级复杂。猿大师办公助手提供了解决方案,它兼容多种浏览器,包括最新版和国产浏览器,不依赖插件,支持文档对比,具有丰富的功能和接口,兼容多种Office版本,允许源码级定制,提供终身技术支持,并实现静默在线升级。适用于多种行业和操作系统。
324 12
|
4月前
|
数据可视化 Python
通过python建立一个web服务查看服务器上的文本、图片、视频等文件
通过python建立一个web服务查看服务器上的文本、图片、视频等文件
78 0
|
4月前
【Azure 应用服务】部署Azure Web App时,是否可以替换hostingstart.html文件呢?
【Azure 应用服务】部署Azure Web App时,是否可以替换hostingstart.html文件呢?
|
4月前
|
JSON 数据格式
【应用服务 App Service】在Azure Web App的部署文件中,是否可以限制某些文件无法被访问?(如json)
【应用服务 App Service】在Azure Web App的部署文件中,是否可以限制某些文件无法被访问?(如json)
|
4月前
|
安全 Shell PHP
pear文件利用 (远程文件下载、生成配置文件、写配置文件) 从一道题看——CTFshow私教 web40
pear文件利用 (远程文件下载、生成配置文件、写配置文件) 从一道题看——CTFshow私教 web40
209 0
|
7月前
|
前端开发 JavaScript Python
使用Python读取本地行情csv文件,做出web网页画出K线图实现案例
【5月更文挑战第4天】使用Python绘制K线图的步骤:1) 安装pandas, matplotlib和Flask;2) 用pandas读取CSV文件并处理数据;3) 创建Flask应用,渲染包含K线图数据的HTML;4) 编写HTML,使用ECharts库绘制K线图。
92 0
|
7月前
|
Java 应用服务中间件
解决tomcat启动报错:无法在web.xml或使用此应用程序部署的jar文件中解析绝对的url [http:java.sun.com/jsp/jstl/core]
解决tomcat启动报错:无法在web.xml或使用此应用程序部署的jar文件中解析绝对的url [http:java.sun.com/jsp/jstl/core]
1592 1
下一篇
DataWorks