利用模板导出文件(二)之jacob利用word模板导出word文件(Java2word)

先下载jacob.jar包。

解压后将jacob.dll放到windows/system32以下或\jre\bin以下。

将jacob.jar增加项目。

这样项目的环境基本上搭建完毕,接下来就是书写相关的代码:

/**
* 传入数据为HashMap对象,对象中的Key代表word模板中要替换的字段。Value代表用来替换的值。
* word模板中全部要替换的字段(即HashMap中的Key)以特殊字符开头和结尾。
* 如:$code$、$date$……。以免执行错误的替换。

* 全部要替换为图片的字段,Key中需包括image或者Value为图片的全路径
* (眼下仅仅推断文件后缀名为:.bmp、.jpg、.gif)。

* 要替换表格中的数据时,HashMap中的Key格式为“[email protected]”,当中:
* R代表从表格的第R行開始替换,N代表word模板中的第N张表格;
* Value为ArrayList对象,ArrayList中包括的对象统一为String[],一条String[]代表一行数据。
* ArrayList中第一条记录为特殊记录。记录的是表格中要替换的列号,
* 如:要替换第一列、第二列、第三列的数据。则第一条记录为String[3] {"1","2","3"}。
*/

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

/**
 * 利用word模板生成word文件
 * @typename:Java2word
 * @author: FishRoad
 * @since: 2015年8月24日 下午2:47:41
 *
 */
public class Java2word {

     private boolean saveOnExit;
     /**
      * word文档
      */
     Dispatch doc = null;

     /**
      * word执行程序对象s
      */
     private   ActiveXComponent word;
     /**
      * 全部word文档
      */
     private   Dispatch documents;

     /**
      * 构造函数
      */
     public Java2word() {
         if(word==null){
         word = new ActiveXComponent("Word.Application");
         word.setProperty("Visible",new Variant(false));
         }
         if(documents==null)
         documents = word.getProperty("Documents").toDispatch();
         saveOnExit = false;
     }

     /**
      * 设置參数:退出时是否保存
      * @param saveOnExit boolean true-退出时保存文件,false-退出时不保存文件
      */
     public void setSaveOnExit(boolean saveOnExit) {
         this.saveOnExit = saveOnExit;
     }
     /**
      * 得到參数:退出时是否保存
      * @return boolean true-退出时保存文件,false-退出时不保存文件
      */
     public boolean getSaveOnExit() {
         return saveOnExit;
     }

     /**
      * 打开文件
      * @param inputDoc String 要打开的文件,全路径
      * @return Dispatch 打开的文件
      */
     public Dispatch open(String inputDoc) {
         return Dispatch.call(documents,"Open",inputDoc).toDispatch();
     }

     /**
      * 选定内容
      * @return Dispatch 选定的范围或插入点
      */
     public Dispatch select() {
         return word.getProperty("Selection").toDispatch();
     }

     /**
      * 把选定内容或插入点向上移动
      * @param selection Dispatch 要移动的内容
      * @param count int 移动的距离
      */
     public void moveUp(Dispatch selection,int count) {
         for(int i = 0;i < count;i ++)
             Dispatch.call(selection,"MoveUp");
     }

     /**
      * 把选定内容或插入点向下移动
      * @param selection Dispatch 要移动的内容
      * @param count int 移动的距离
      */
     public void moveDown(Dispatch selection,int count) {
         for(int i = 0;i < count;i ++)
             Dispatch.call(selection,"MoveDown");
     }

     /**
      * 把选定内容或插入点向左移动
      * @param selection Dispatch 要移动的内容
      * @param count int 移动的距离
      */
     public void moveLeft(Dispatch selection,int count) {
         for(int i = 0;i < count;i ++) {
             Dispatch.call(selection,"MoveLeft");
         }
     }

     /**
      * 把选定内容或插入点向右移动
      * @param selection Dispatch 要移动的内容
      * @param count int 移动的距离
      */
     public void moveRight(Dispatch selection,int count) {
         for(int i = 0;i < count;i ++)
             Dispatch.call(selection,"MoveRight");
     }

     /**
      * 把插入点移动到文件首位置
      * @param selection Dispatch 插入点
      */
     public void moveStart(Dispatch selection) {
         Dispatch.call(selection,"HomeKey",new Variant(6));
     }

     /**
      * 从选定内容或插入点開始查找文本
      * @param selection Dispatch 选定内容
      * @param toFindText String 要查找的文本
      * @return boolean true-查找到并选中该文本。false-未查找到文本
      */
     public boolean find(Dispatch selection,String toFindText) {
         //从selection所在位置開始查询
         Dispatch find = word.call(selection,"Find").toDispatch();
         //设置要查找的内容
         Dispatch.put(find,"Text",toFindText);
         //向前查找
         Dispatch.put(find,"Forward","True");
         //设置格式
         Dispatch.put(find,"Format","True");
         //大写和小写匹配
         Dispatch.put(find,"MatchCase","True");
         //全字匹配
         Dispatch.put(find,"MatchWholeWord","True");
         //查找并选中
         return Dispatch.call(find,"Execute").getBoolean();
     }

     /**
      * 把选定内容替换为设定文本
      * @param selection Dispatch 选定内容
      * @param newText String 替换为文本
      */
     public void replace(Dispatch selection,String newText) {
         //设置替换文本
         Dispatch.put(selection,"Text",newText);
     }

     /**
      * 全局替换
      * @param selection Dispatch 选定内容或起始插入点
      * @param oldText String 要替换的文本
      * @param newText String 替换为文本
      */
     public void replaceAll(Dispatch selection,String oldText,Object replaceObj) {
         //移动到文件开头
         moveStart(selection);

         if(oldText.startsWith("table") || replaceObj instanceof ArrayList)
             replaceTable(selection,oldText,(ArrayList) replaceObj);
         else {
             String newText = (String) replaceObj;
             if(newText==null)
                 newText="";
             if(oldText.indexOf("image") != -1&!newText.trim().equals("") || newText.lastIndexOf(".bmp") != -1 || newText.lastIndexOf(".jpg") != -1 || newText.lastIndexOf(".gif") != -1){
                 while(find(selection,oldText)) {
                     replaceImage(selection,newText);
                     Dispatch.call(selection,"MoveRight");
                 }
             }else{
                 while(find(selection,oldText)) {
                     replace(selection,newText);
                     Dispatch.call(selection,"MoveRight");
                 }
             }
         }
     }

     /**
      * 替换图片
      * @param selection Dispatch 图片的插入点
      * @param imagePath String 图片文件(全路径)
      */
     public void replaceImage(Dispatch selection,String imagePath) {
         Dispatch.call(Dispatch.get(selection,"InLineShapes").toDispatch(),"AddPicture",imagePath);
     }

     /**
      * 替换表格
      * @param selection Dispatch 插入点
      * @param tableName String 表格名称。
      * 形如[email protected]、[email protected][email protected]。R代表从表格中的第N行開始填充,N代表word文件里的第N张表
      * @param fields HashMap 表格中要替换的字段与数据的相应表
      */
     public void replaceTable(Dispatch selection,String tableName,ArrayList dataList) {
         if(dataList.size() <= 1) {
             System.out.println("Empty table!");
             return;
         }

         //要填充的列
         String[] cols = (String[]) dataList.get(0);

         //表格序号
         String tbIndex = tableName.substring(tableName.lastIndexOf("@") + 1);
         //从第几行開始填充
         int fromRow = Integer.parseInt(tableName.substring(tableName.lastIndexOf("$") + 1,tableName.lastIndexOf("@")));
         //全部表格
         Dispatch tables = Dispatch.get(doc,"Tables").toDispatch();
         //要填充的表格
         Dispatch table = Dispatch.call(tables,"Item",new Variant(tbIndex)).toDispatch();
         //表格的全部行
         Dispatch rows = Dispatch.get(table,"Rows").toDispatch();
         //填充表格
         for(int i = 1;i < dataList.size();i ++) {
             //某一行数据
             String[] datas = (String[]) dataList.get(i);

             //在表格中加入一行
             if(Dispatch.get(rows,"Count").getInt() < fromRow + i - 1)
                 Dispatch.call(rows,"Add");
             //填充该行的相关列
             for(int j = 0;j < datas.length;j ++) {
                 //得到单元格
                 Dispatch cell = Dispatch.call(table,"Cell",Integer.toString(fromRow + i - 1),cols[j]).toDispatch();
                 //选中单元格
                 Dispatch.call(cell,"Select");
                 //设置格式
                 Dispatch font = Dispatch.get(selection,"Font").toDispatch();
                 Dispatch.put(font,"Bold","0");
                 Dispatch.put(font,"Italic","0");
                 //输入数据
                 Dispatch.put(selection,"Text",datas[j]);
             }
         }
     }

     /**
      * 保存文件
      * @param outputPath String 输出文件(包括路径)
      */
     public void save(String outputPath) {
         Dispatch.call(Dispatch.call(word,"WordBasic").getDispatch(),"FileSaveAs",outputPath);
     }

     /**
      * 关闭文件
      * @param document Dispatch 要关闭的文件
      */
     public void close(Dispatch doc) {
         Dispatch.call(doc,"Close",new Variant(saveOnExit));
         word.invoke("Quit",new Variant[]{});
         word = null;
     }

     /**
      * 依据模板、数据生成word文件
      * @param inputPath String 模板文件(包括路径)
      * @param outPath String 输出文件(包括路径)
      * @param data HashMap 数据包(包括要填充的字段、相应的数据)
      */
     public void toWord(String inputPath,String outPath,HashMap data) {
         String oldText;
         Object newValue;
         try {
             if(doc==null)
             doc = open(inputPath);

             Dispatch selection = select();

             Iterator keys = data.keySet().iterator();
             while(keys.hasNext()) {
                 oldText = (String) keys.next();
                 newValue = data.get(oldText);

                 replaceAll(selection,oldText,newValue);
             }

             save(outPath);
         } catch(Exception e) {
             System.out.println("操作word文件失败!");
             e.printStackTrace();
         } finally {
             if(doc != null)
                 close(doc);
         }
     }

     public synchronized static void word(String inputPath,String outPath,HashMap data){
         Java2word j2w = new Java2word();
         j2w.toWord(inputPath,outPath,data);
     }

     @SuppressWarnings({ "rawtypes", "unchecked" })
	public static void main(String[] args) {
    	 //替换word中相关的字段
         HashMap data = new HashMap();
         data.put("$reportDept$","2007-8-1");
         data.put("$findDate$","2007-8-2");
         data.put("$finder$","kdl");
         data.put("$lineName$","5号线");
         data.put("$voltageRate$","11月13日");
         data.put("$towerNumberBound$","2004年11月10日");
         data.put("$image1$","C:\\Users\\Administrator\\Pictures\\1.jpg");
         data.put("$name$", "FishRoad");
         data.put("$age$", "24");
         //替换word中表格的数据
         /**
          * 要替换表格中的数据时,HashMap中的Key格式为“[email protected]”,当中:
          * R代表从表格的第R行開始替换,N代表word模板中的第N张表格;
          * Value为ArrayList对象,ArrayList中包括的对象统一为String[]。
          * 一条String[]代表一行数据,ArrayList中第一条记录为特殊记录。记录的是表格中要替换的列号。
          * 如:要替换第一列、第二列、第三列的数据,则第一条记录为String[3] {"1","2","3"}
          */
         ArrayList table1 = new ArrayList(3);
         String[] fieldName1 = {"1","2","3"};
         table1.add(fieldName1);
         String[] field11 = {"1","751002","华夏证券"};
         table1.add(field11);
         String[] field21 = {"2","751004","国泰君安"};
         table1.add(field21);
         String[] field31 = {"3","751005","海通证券"};
         table1.add(field31);
         data.put("[email protected]",table1);

         Java2word j2w = new Java2word();
         long time1 = System.currentTimeMillis();
         j2w.toWord("E:/template.doc","E:/result.doc",data);
         System.out.println("time cost : " + (System.currentTimeMillis() - time1));
     }
}

以上是相关的代码。接下来就要配置word模板,例如以下:

导出的结果例如以下图:

时间: 2024-10-13 19:05:34

利用模板导出文件(二)之jacob利用word模板导出word文件(Java2word)的相关文章

使用Spire.Doc组件利用模板导出Word文档

以前一直是用Office的组件实现Word文档导出,但是让客户在服务器安装Office,涉及到版权:而且Office安装,包括权限配置也是比较麻烦. 现在流行使用第三方组件来实现对Office的操作,有NPOI,Spire等第三方组件.开始考虑的是NPOI,毕竟它在操作Excel方面还是很强大的:但是不知道是它本身没有,还是我没找到,无法实现利用Word模板的标签插入内容,纯靠代码去生成Word文档,排版是个大问题.最终找到了Spire.Doc组件,轻松实现! Spire的官网地址:https:

C# 利用WORD模板和标签(bookmark) 批量生成WORD

前言: 由于对C#操作WORD不熟悉,也就留下这么一篇水文,别吐糟...=_=||| 利用Microsoft.Office.Interop.Word (2003版也就11版)——因为部分客户端还是用Office2003,所以保险起见应该引入低一点的版本 我的需求很简单,从DataTable里面循环取数据批量生成Word文档,解决方案是利用Word模板.dot插入书签并保存为程序使用的模板, 用C#打开word模板修改书签的值并批量生成Word. 遇到的问题: 我的思路是打开模板,然后循环修改书签

利用POI 技术动态替换word模板内容

项目中需要实现一个功能,动态替换给定模板里面的内容,生成word文档提供下载功能. 中间解决了问题有: 1.页眉的文档logo图片解决,刚开始的时候,HWPFDocument 对象无法读取图片对象(已测试) 2.文档的水印也无法读取 3.下载的乱码问题(火狐浏览器) 4.将文档中的阿拉伯数字的金额改为中文繁体显示 具体代码如下: /** * 拍卖结算之后,进行成交确认书的下载操作方法 * * @param id * @param response */ @RequestMapping(value

利用Aspose.Words.dll导出Word代替NPOI

许久没来写博客了,已至于登录博客园的密码都忘却了. 时间过的真快,最近再做一个招聘管理系统,其中用到了导出Word文档的功能,尝试了各种方法,遇到了各种问题.不过最后还是解决了导出Word的问题. 一.针对导出Word文档的功能,采用的几个方案: 1.预置好Word文档模板,采用加载替换文档内容标签的方式实现.    采用这种方案可以借助两个第三方组件来实现,分别如下: (1).借助Microsoft.Office.Interop.Word组件实现.  (2).借助NPOI实现.  (3).借助

SQL Server调优系列玩转篇二(如何利用汇聚联合提示(Hint)引导语句运行)

原文:SQL Server调优系列玩转篇二(如何利用汇聚联合提示(Hint)引导语句运行) 前言 上一篇我们分析了查询Hint的用法,作为调优系列的最后一个玩转模块的第一篇.有兴趣的可以点击查看:SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行) 本篇继续玩转模块的内容,同样,还是希望扎实掌握前面一系列的内容,才进入本模块的内容分析. 闲言少叙,进入本篇的内容. 技术准备 数据库版本为SQL Server2012,利用微软的以前的案例库(Northwind)进行分析,

利用PHP生成二维码

导读:在二维码广泛应用化的今天,在web站点中自动生成对应的二维码是最基础的需求.文章介绍了使用PHP自动生成二维码的三种方式. get方法实现方式一: $urlToEncode="163.com"; generateQRfromGoogle($urlToEncode); function generateQRfromGoogle($chl,$widhtHeight ='150',$EC_level='L',$margin='0')  { $url = urlencode($url);

【转】Android平台下利用zxing实现二维码开发

http://www.cnblogs.com/dolphin0520/p/3355728.html 现在走在大街小巷都能看到二维码,而且最近由于项目需要,所以研究了下二维码开发的东西,开源的二维码扫描库主要有zxing和zbar,zbar在iPos平台上应用比较成熟,而在Android平台上主流还是用zxing库,因此这里主要讲述如何利用zxing进行二维码开发. 1.如何将zxing的Android源码导入工程. 在导入zxing的android源码之前,先去官方下载zxing的源码:http

asp.net(C#)利用QRCode生成二维码(续)-在二维码图片中心加Logo或图像 .

<%@ WebHandler Language="C#" Class="GetQRCode" %> using System; using System.Web; using ThoughtWorks.QRCode.Codec; using ThoughtWorks.QRCode.Codec.Data; using ThoughtWorks.QRCode.Codec.Util; using System.IO; using System.Text; us

利用VBA导出文件的例子

下面是利用VBA导出文件的例子,可以导出Excel内容等其他可以使用VBA的地方. Sub export_file() Dim fs, ft As Object Dim txtname As String txtname = "export_file" Set fs = CreateObject("scripting.filesystemobject") Set ft = fs.createtextfile(ThisWorkbook.Path & "