java 调用jacob和java2word导出word,并实现将带有格式的html文本和图片插入word

来源:互联网 发布:牛顿环实验数据 编辑:程序博客网 时间:2024/04/30 03:20

文章实现内容介绍及环境配置、开发过程

实现内容

1--网站前台:本文jsp页面类似于报名表一类,客户要求报名表中大本文输入的地方可以copy整篇文章放入且带有段落格式,该地方使用CKEdtiro网页编辑器实现。

2--OA办公后台:客户使用的平台,可以看到网站用户填报的报名表,并有导出word功能。可以见报名表导出到word。word中包含html文本,图片附件。

环境配置

1--我的计算机为win10,64位,jdk1.6.10,myeclipse10,项目为jboss

2--需要的jar包jar1.jar (该jar包为jacob和java2word整理合并后jar包,为什么要合并后文叙述),具体的jacob.jar 、java2word.jar、ckeditor-java-core-3.5.3.jar

3--需要运行的安装文件Java2Word1.1+Install.exe(用于java2word方法实现的支持),下载ckeditor4.6插件包

4--下载jacob-1.18-M2.zip,里面包含jacob.jar、jacob-1.18-M2-x64.dll、jacob-1.18-M2-x86.dll文件

5--下载java2word压缩包,包含Java2Word.jar、Java2Word1.1+Install.exe

6--将jacob-1.18-M2-x64.dll放入项目jdk-bin目录、C盘windows-system32、C盘windows-sysWOW64下,运行Java2Word1.1+Install.exe一直下一步就行

7--将jacob.jar和java2word.jar、放入项目lib包下,将ckeditor-java-core-3.5.3.jar(网站项目包)放入项目lib包下,将ckeditor4.6文件夹放在项目根目录

开发过程

网站前台-ckeditor网页编辑器的简单使用:

jsp页面头部增加引入

<%@page import="com.ckeditor.CKEditorConfig"%>
<%@page import="com.ckeditor.EventHandler"%>
<%@ taglib uri="http://ckeditor.com" prefix="ckeditor" %>

<script type="text/javascript" src="<%=contextPath%>/ckeditor4.6/ckeditor.js"></script>

<%
   CKEditorConfig settings = new CKEditorConfig();
   settings.addConfigValue("toolbar","[[ 'Source', '-', 'Bold', 'Italic' ]]");
  %>

html部分

<td class="tdcell_word3" colspan="4">
    <p style="color:red;">填报说明:产品研发背景2.创新技术介绍3.主要参数、结构特点、精度水平4.市场性及产业化前景</p>
    <textarea name="sbzp_ysshuoming" id="sbzp_ysshuoming" cols="100" rows="10">
     1.产品研发背景2.创新技术介绍3.主要参数、结构特点、精度水平4.市场性及产业化前景
    </textarea>
    <span class="notnull">*</span>
    <br><span id="sbzp_ysshuomingmes" style="display:none" class="mes"></span>
 </td>

js部分

<script type="text/javascript">
     var editor = null;
     window.onload = function(){
      
      editor = CKEDITOR.replace('sbzp_ysshuoming'); //参数‘content’是textarea元素的name属性值,而非id属性值
      /*
      CKEDITOR.instances["sbzp_ysshuoming"].on("instanceReady", function () { 
       
       this.document.on("blur", AutoSave1); 
       
       //this.document.on("focus", AutoSave); 
      });
      */
      var oEditor = CKEDITOR.instances.sbzp_ysshuoming;
      oEditor.on("blur", AutoSave1);
      oEditor.on("focus", AutoSave);
     }
     
     
     function AutoSave1() {//相应的操作过程,可以按下面写,也可以按一般javascript过程写。
      var oEditor = CKEDITOR.instances.sbzp_ysshuoming;
      var conentText = oEditor.getData();
      
      if(conentText == null || conentText == ""){
       oEditor.setData("<p>1.产品研发背景2.创新技术介绍3.主要参数、结构特点、精度水平4.市场性及产业化前景</p>");
      }
      
     }
     
     
     function AutoSave() {  
      var oEditor = CKEDITOR.instances.sbzp_ysshuoming;
      var conentText = oEditor.getData();
      if(conentText.indexOf("<p>1.产品研发背景2.创新技术介绍3.主要参数、结构特点、精度水平4.市场性及产业化前景</p>")>=0){
       oEditor.setData("");
      }
      
     }
     
    </script>

这段js我是直接放在jsp页面中的,注意一定要放在文本域td之后,AutoSave和AutoSave1位编辑器输入框失去、获得焦点事件

表单提交时关于ckedtior的校验

//验证 参评产品优势说明 大文本框 是否输入
 var oEditor = CKEDITOR.instances.sbzp_ysshuoming;

var contentEdtior = oEditor.getData();

if(contentEdtior == "" || contentEdtior == null || contentEdtior.indexOf("<p>1.产品研发背景2.创新技术介绍3.主要参数、结构特点、精度水平4.市场性及产业化前景</p>")>=0){
  //显示提醒选择消息
  $("#sbzp_ysshuomingmes").show().text("请输入“参评产品优势说明”!");
  oEditor.focus();
  return false;
 }else{
  oEditor.setData(oEditor.getData());
  for ( instance in CKEDITOR.instances ){
   CKEDITOR.instances[instance].updateElement();
  }
 }
 var len = contentEdtior.length*2;
 if(len>3000){
  oEditor.focus();
  $("#sbzp_ysshuomingmes").show().text("参评产品优势说明”必须小于3000个字!");
  return false;
 }

ckeditor效果图

---------------------------------------我是分割线----------------------------------------------

后台对报名表导出到word的处理

1--将要导出的word只作为一个ftl模板

新建一个word,按照要导出的格式制作模板,客户填写或输入的内容用标识符表示

例如

做好之后,另存为xml,然后修改标签,就是你要替换的标识符,尽量用${qy_name}这样的格式,标签修改之后保存直接修改文件后缀名为.ftl

模板就做好了

2--替换标签

从数据库根据id取出对应报名表所有数据,按照 ftl 模板中标签顺序依次将对应的信息封装到一个hashMap中,需要替换图片或带格式文本的地方暂不处理(其实就是原来的标签是什么,还put进去什么)

使用freemark中Template.process(dataMap, out);方法生成一个word ,该word中除了图片和带格式文本其他的标签就可以替换掉了

3--将html文本从数据库取出使用并拼接上html文件的头部和尾部作为一个html通过poi的读取流写入一个word文档并保存。

4--由于上一步保存的word中含有html标签,直接导出报错,writer error类写入错误,因为该文件相当于html版的伪word,所以加一步操作,调用jacob打开该文件复制其中带格式的文本,粘贴到一个新的word中保存。

5--这时就可以调用java2word将新word中的文本插入要替换的标签处,并将标签替换为空。

6--最后一步,调用java2word将图片插入图片标签对应位置。一个标签处可以插入多个图片。

至此,导出word功能经测试亦可以完美使用,并带有用户上传的图片,及大文中用户上传的文章格式是什么样,word中就是什么样。

7--到这儿,该功能本应该结束了。出现一个让我很郁闷的问题。之前有个功能使用jacob将合同导出到word加盖印章并转为pdf。该功能中单独调用了jacob包,测试后发现jacob与java2word中的jacob方法不同但包名文件名,都相同,这两个jar包会冲突。

该问题困扰了我一周时间。经过不停反编译jacob和java2word源码对比后发现,java2word中重写了jacob中方法,大部分方法名相同参数类型不同。再试了n中方法无用之后,无奈把java2word中所有类反编译到jacob中,与原jacob中方法合并。才导致我只用了一个jar包(jacob1.jar)解决该冲突。并实现了最终效果。

在博客中记录这次处理该问题步骤及方法以便以后可以节省时间。希望对广大码友们有所帮助。


详细代码,上传后请到csdn下载链接进行下载。

整合后jar下载地址:

http://download.csdn.net/detail/qq_27877761/9715366

本文上述所有涉及到jar和源码下载地址(含整合后jar):
http://download.csdn.net/detail/qq_27877761/9715430

 

本文写的可能有遗漏或未说清楚的地方,如有疑问联系qq-731352908,欢迎一起讨论。加qq时注明,对csdn问题有疑问。




0 0