前两天帮同学实现在线预览word文档中的内容,而且需要提供可以下载的链接!在网上找了好久,都没有什么可行的方法,只得用最笨的方法来实现了。希望得到各位大神的指教。下面我就具体谈谈自己的实现过程,总结一下学习中的收获。

我相信很多程序员都遇到过,有些word文档希望直接在浏览器中打开进行预览,但是浏览器往往不是很配合,直接就提示下载,不像pdf文档,浏览器可以直接进行预览。Word文档甚至始终都会通过本地的Office软件打开。那么,问题来了,如何可以在线浏览word文档呢?

其实,我在最初的时候也没有接触过这方面的东西,一般用的比较多的是生成pdf文档,而浏览器一般都支持pdf的浏览,因此,直接通过后台传来的数据,再利用java和一些相关的jar包就可以生产一个pdf文档,在浏览器中可以直接显示。尽管可以这样,但是我们需要的是解决实际问题啊?在浏览器中打开word文档。

在网上查了一些资料,也都没有查出个所以然。看了好几个博客和论坛,也都是大同小异,测试了好几个,基本都是浏览器提示直接下载,或者打开,这里的打开也都是利用本地的Office软件打开的,所以这并不是自己想要的结果。于是,自己动手,既然浏览器不支持显示word文档,我何不将word文档按照原来word的样式和内容转为html呢?而在浏览器中,html是再熟悉不过了。基本思路就是这样,首先是利用上传的word文档转为html文件,然后生成的链接显示在jsp页面上,如果点击显示该word文档,那么实际上浏览器读取的是刚生成的html文件。

下面将自己的实现过程总结如下,欢迎各位朋友提供更好的解决办法。转载本文请在文章明显位置标明文章的原始出处,个人博客:http://itred.cnblogs.com  邮箱: it_red@sina.com

  1. Word文档转为html

    这里采用第三方组件jacob来实现的,本demo所用的版本为jacob-1.18-M2;下载链接为:http://sourceforge.jp/projects/sfnet_jacob-project/releases/

    先在这里说一下,用这个组件还是比较麻烦的,首先要根据自己的电脑实际情况将压缩包里面的动态链接库放到多个目录下,而这个动态链接库为:

      

    将其复制的位置分别是:

      C:\Windows\System32

      

    机器所安装的java目录下的jdk下的bin中

    在myeclipse中指定jre

     

  然后就是编码阶段:

    导入相关的jar包,新建一个WordReader类,源码如下:  

package com.mh.test;import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;public class WordReader {public static void extractDoc(String inputFIle, String outputFile) {boolean flag = false;// 打开Word应用程序ActiveXComponent app = new ActiveXComponent("Word.Application");try {// 设置word不可见app.setProperty("Visible", new Variant(false));// 打开word文件Dispatch doc1 = app.getProperty("Documents").toDispatch();Dispatch doc2 = Dispatch.invoke(doc1, "Open", Dispatch.Method, new Object[] {inputFIle, new Variant(false), new Variant(true)},new int[1]).toDispatch();// 作为html格式保存到临时文件::参数 new Variant(8)其中8表示word转html;7表示word转txt;44表示Excel转html。。。Dispatch.invoke(doc2, "SaveAs", Dispatch.Method, new Object[] {outputFile, new Variant(8)}, new int[1]);// 关闭wordVariant f = new Variant(false);Dispatch.call(doc2, "Close", f);flag = true;} catch (Exception e) {e.printStackTrace();} finally {app.invoke("Quit", new Variant[] {});}if (flag == true) {System.out.println("Transformed Successfully");} else {System.out.println("Transform Failed");}}
}

    新建测试类,包含main方法:

package com.mh.test;public class TT {/*** @param args*/public static void main(String[] args) {WordReader.extractDoc("e:/f.docx","e:/ee.html");}
}

  这里是将word转为html就算完成了,因此知道了,如果需要将word转为html就可以直接调用WordReader中的方法就可以实现。这里就不多说了。

  2. 且说文件的上传,下载

    这里是利用Struts2实现的上传功能,index页面中的源码:

<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>文件上传</title>
</script></head><body><s:form action="upload" method="post" enctype="multipart/form-data"><s:file name="upload" label="上传的文件" id="ufile"></s:file><s:submit value="上传"></s:submit></s:form><div id="retShow"></div></body>
</html>

    Struts.xml中的相关配置:       

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd">
<struts><package name="default" extends="struts-default"><action name="upload" class="com.mh.action.UploadAction"><result name="success">/success.jsp</result></action><action name="*viewAction" class="com.mh.action.ViewAction" method="{1}"></action></package><constant name="struts.multipart.saveDir" value="/tmp"></constant>
</struts>

    UploadAction的源码:

package com.mh.action;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;import org.apache.struts2.ServletActionContext;
import org.apache.struts2.util.ServletContextAware;import com.mh.test.WordReader;
import com.opensymphony.xwork2.ActionSupport;public class UploadAction extends ActionSupport implements ServletContextAware {private List<File> upload;private List<String> uploadFileName;private ServletContext context;HttpServletRequest request = ServletActionContext.getRequest();public HttpServletRequest getRequest() {return request;}public void setRequest(HttpServletRequest request) {this.request = request;}public String execute() throws Exception {String path = "";if (upload != null) {for (int i = 0; i < upload.size(); i++) {System.out.println(upload.get(i).getPath() + "-----------------------------"+ getUploadFileName().get(i));InputStream is = new FileInputStream(upload.get(i));path = context.getRealPath(getUploadFileName().get(i));System.out.println(context.getRealPath(getUploadFileName().get(i)) + "==============");String str = getUploadFileName().get(i);String view = getUploadFileName().get(i).replace(".docx", ".html");request.setAttribute("str", str);request.setAttribute("view", view);OutputStream os = new FileOutputStream(context.getRealPath(getUploadFileName().get(i)));byte buffer[] = new byte[1024];int count = 0;while ((count = is.read(buffer)) > 0) {os.write(buffer, 0, count);}os.close();is.close();}}System.out.println(path.replace("\\", "/")+"&&&&&&&&&&&&");System.out.println(path.replace("\\", "/").replace(".docx", ".html")+"%%%%%%%%%%%%%");WordReader.extractDoc(path.replace("\\", "/"), path.replace("\\", "/").replace(".docx", ".html"));return SUCCESS;}public List<File> getUpload() {return upload;}public void setUpload(List<File> upload) {this.upload = upload;}public List<String> getUploadFileName() {return uploadFileName;}public void setUploadFileName(List<String> uploadFileName) {this.uploadFileName = uploadFileName;}public void setServletContext(ServletContext context) {this.context = context;}
}

  ViewAction源码:

package com.mh.action;import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;import com.mh.test.WordReader;
import com.opensymphony.xwork2.ActionSupport;public class ViewAction extends ActionSupport {private static final long serialVersionUID = 1814430419057331187L;HttpServletRequest request = ServletActionContext.getRequest();public void UView() {String ufile = request.getParameter("upf");System.out.println(ufile + "++++++++++++++++");System.out.println(ufile.replace("\\", "/") + "****************");WordReader.extractDoc(ufile.replace("\\", "/"), ufile.replace("\\", "/").replace(".docx", ".html"));}
}

在这里同时将上面实现的转换的功能加到模块中,只要上传就进行转换。在这里,我并没有设置上传后的文件路径,直接按默认的上传到ROOT目录下,下载的时候就按照最原始的方式,直接打开word文档的链接,浏览器就自动进行下载了,而在线预览实际上就是打开该文档生成的html文档的链接。十分方便,但是,这样做有一个弊端,需要随时注意文件的数量,如果文件过多会影响程序的运行和计算机的硬件水平,同时,如果该项目需要进行重新部署,以前上传的数据就没有了,这也是需要考虑的,本demo只是进行抛砖引玉的作用,更多地完善,拒绝伸手主义。始终坚信,动手时最好的学习方式,愿与君共勉!

实现效果如下:

  下载word文档:

    

  预览效果:

    

    

  控制台输出:

    

-------------------------注意----------------------------

在文章前就说过,要想用好这个第三方的组件,就必须了解自己的计算机,然后根据实际情况配置好环境;在程序的实现过程中,就遇到一些常见错误:

(1) Open错误:说明没有找到指定路径下的word文档,要么就是路径中的斜杠写反了,本人犯错最多的地方;解决办法:配置并确认好路径后再进行运行;

(2)SaveAs错误:路径问题;解决办法同上。

(3)注意tomcat和jdk。

------------------------------------------------------------------- 

 探索,让人无悔;失败,令人思索;剩下的便是心平气和,专心致志,既不瞻前顾后,也不无目的地四面出击。

http操作word文档相关推荐

  1. python操作word文档(python-docx)

    python操作word文档(python-docx) 1. 效果图 1.1 python-docx文档标题段落(等级.加粗.斜体.居中)效果图 1.2 python-docx字体(加粗.斜体.居中. ...

  2. ASP.NET操作Word文档(转)

    ASP.NET操作Word文档(转) 操作WORD配置说明 引入:Word的对象库文件"MSWORD.OLB"(word 2000为MSWORD9.OLB) 1.运行Dcomcnf ...

  3. Python 操作Word文档插入图片和表格实例演示

    Python 操作Word文档插入图片和表格实例演示 效果图 实现过程 ① python-docx 库安装 ② word 文档插入图片演示 ③ word 文档插入表格演示 [ 文章推荐 ] Pytho ...

  4. C#操作word文档(二)

    1.C#操作Word完全功略 导入COM库:Microsoft word 11.0 Object Library. 引用里面就增加了: 创建新Word               object oMi ...

  5. python操作word文档中的图片_Python操作word文档插入图片和表格的实例演示

    前言P6Q免费资源网 图片是Word的一种特殊内容,这篇文章主要介绍了关于Python操作word文档,向里面插入图片和表格的相关内容,下面话不多说了,来一起看看详细的代码P6Q免费资源网 实例代码: ...

  6. Java操作Word文档

    Java 生成 Word 的几种方案 参考 ​ 主要有这么一些工具可以使用 Jacob.Apache POI.Java2word.iText,还有一种方法是使用XML作为模板. ​ 使用 XML 的思 ...

  7. Spire操作word文档

    Spire操作word文档 1.基本文档方面 // 测试用例PersonalCreditRecord credit = getPersonalCreditRecord();//Create word ...

  8. java使用jacob操作word文档

    ava使用jacob操作word文档 java调用com组件操作word使用总结(jacob) 简单描述 在此处输入简单摘要 特别声明:使用java-com技术可以完成任何VBA可以完成的office ...

  9. python打开word并插入图片_Python操作word文档插入图片和表格的实例演示

    前言 图片是Word的一种特殊内容,这篇文章主要介绍了关于Python操作word文档,向里面插入图片和表格的相关内容,下面话不多说了,来一起看看详细的代码 实例代码: # -*- coding: U ...

  10. poi操作word文档总结

    POI分段落生成纯Word动态模板并导入数据 导出数据,可以用word另存为xml格式的ftl文件,变量用${变量名}表示,然后在类中通过 freemarker去替换变量. 但是怎么导入word数据. ...

最新文章

  1. Leetcode 526.优美的排列 二进制状压DP
  2. Android Handler研究(1)
  3. 一个假设:如果两个量互为分类对象和分类载体则他们不可对易
  4. 《研磨设计模式》chap25 访问者模式Visitor(1)模式介绍
  5. C#_获取 SQL服务器列表
  6. iOS7(+) 图像资源Images Assets使用
  7. 2021年广州如何申请失业补助金最全攻略
  8. nemesis什么车_狂野飙车9TrionNemesis介绍 S级车Trion复仇女神属性详解
  9. Jzzhu and Chocolate(CF-449A)
  10. Android笔记 fragment的Tab样式demo
  11. Apache Commons DbUtils 入门
  12. 线段树(多维+双成段更新) UVA 11992 Fast Matrix Operations
  13. mysql导出约束文件_MySQL导出所有Index 和 约束
  14. 如何使用python提高办公效率-提升Python程序运行效率的6个方法
  15. redis 备份与恢复
  16. C++/MFC 串口通讯——光源控制器控制
  17. 计算机文件夹无法排序,文件夹下文件不能手动调整顺序?-开启Windows 7文件/文件夹手动排序功能...
  18. 格式化代码_格式化代码是什么意思​
  19. 前端 学完HTML+CSS 自己动手写出QQ官网导航栏
  20. uva 10859 放置街灯树形dp

热门文章

  1. 【实验作业】微处理器原理与应用 CPUHomework2.1【二进制 原码 反码 补码 数制转换 典型例题】
  2. 概率论--概率及性质
  3. ⑤ESP8266 开发学习笔记_By_GYC 【ESP8266 IDF框架 使用C++编程】
  4. 上交船舶海洋与建筑工程学院考研经验
  5. python编程工时计算公式_工作日、工作小时的一种非常简单的计算方式
  6. 软件测试工程师需要什么软件_为什么每个软件工程师都应该撰写文章
  7. Atlassian Crowd实现JIRA、Confluence、Bamboo和Fisheye and Crucible单点登录
  8. 发网易emil 报错javax.mail.AuthenticationFailedException: 550
  9. 【置顶帖】关于博主/关于博客/博客大事记
  10. android调用系统相机实现拍照功能