2019-07-09_Java通过JACOB操作WPS记录

Java通过JACOB操作WPS记录

1概述

JACOB-JavaCOMBridge标准的操作word、excel工具包。用户本地系统中安装Word的应用程序可选(office、wps有其一即可)。

1.****1****下载****JACOB

image.png

1.2环境准备

本机是64位,拷贝机器版本部署对应的jacob-1.19-x64.dll到C:\Program Files\Java\jdk1.8.0_60\bin。

将jacob.jar放到响应的工程目录即可。

2 wps实战

2.1.Word2PDF

2.1.1 Word2Pdf

package com.tech.ability.myjacob;

import com.jacob.activeX.ActiveXComponent;

import com.jacob.com.ComThread;

import com.jacob.com.Dispatch;

import com.jacob.com.Variant;

import java.io.File;

/**

*/

public class MyWord2PDF {

private static final int wdFormatPDF = 17; // PDF 格式

public void wordToPDF(String sfileName, String toFileName) {

    System.out.println("启动 Word...");

    long start = System.currentTimeMillis();

    ActiveXComponent app = null;

    Dispatch doc = null;

    try {

// app = new ActiveXComponent("Word.Application"); // 基于microsoft office

        app = new ActiveXComponent("KWPS.Application");  // 基于kwps的方式

        app.setProperty("Visible", new Variant(false));

        Dispatch docs = app.getProperty("Documents").toDispatch();

        doc = Dispatch.call(docs, "Open", sfileName).toDispatch();

        System.out.println("打开文档..." + sfileName);

        System.out.println("转换文档到 PDF..." + toFileName);

        File tofile = new File(toFileName);

        if (tofile.exists()) { // 目标pdf存在,则删除,前提未使用

            tofile.delete();

        }

        Dispatch.call(doc, "SaveAs", toFileName, // FileName

                wdFormatPDF);

        long end = System.currentTimeMillis();

        System.out.println("转换完成..用时:" + (end - start) + "ms.");

    } catch (Exception e) {

        System.out.println("========Error:文档转换失败:" + e.getMessage());

    } finally {

        Dispatch.call(doc, "Close", false);

        System.out.println("关闭文档");

        if (app != null)

            app.invoke("Quit", new Variant[]{});

    }

    // 如果没有这句话,winword.exe进程将不会关闭

    ComThread.Release();

}

}

2.1.2 测试

package com.tech.ability.myjacob;

/**

  • @author kikop

  • @version 1.0

  • @project Name: TechnicalAbilityToolBox

  • @file Name: MyWord2PDFTest

  • @desc 功能描述

  • @date 2019/7/8

  • @time 23:04

  • @by IDE: IntelliJ IDEA

*/

public class MyWord2PDFTest {

/**

 *

 * @param args

 */

public static void main(String[] args) {

    MyWord2PDF d = new MyWord2PDF();

    d.wordToPDF("D:/Java通过jacob操作wps记录.doc", "D:/Java通过jacob操作wps记录.pdf");

}

}

2.1.3 结果查看

image.png

2.2 合并多个Word为一个Word

2.2.1 mergeMultipleWord2Single

/**

 * 合并多个word为一个Word

 *

 * @param srcdocs

 * @param destDoc

 * @return

 */

public boolean mergeMultipleWord2Single(java.util.List srcdocs, String destDoc) {

    //1.校验

    if (srcdocs.size() == 0 || srcdocs == null) {

        return false;

    }

    System.out.println("启动 Word...");

    long start = System.currentTimeMillis();

    //2.判断

    ActiveXComponent app = null;

    Object doc = null;

    try {

// app = new ActiveXComponent("Word.Application"); // 基于microsoft office

        app = new ActiveXComponent("KWPS.Application");  // 基于kwps的方式,具体和调用ActiveX控件有关

        // 2.1.设置word不可见

        app.setProperty("Visible", new Variant(false));

        //获得Documents对象

        Object docs = app.getProperty("Documents").toDispatch();

        // 2.2.打开第一个文件

        doc = Dispatch.invoke(

                (Dispatch) docs, // 参数1:调用目标

                "Open",  // 参数2

                Dispatch.Method,  //参数3

                new Object[]{(String) srcdocs.get(0), new Variant(false), new Variant(true)},  // 参数4

                new int[3]  //参数5

        ).toDispatch();

        // 2.3.追加后续文件

        for (int i = 1; i < srcdocs.size(); i++) {

            Dispatch.invoke(

                    app.getProperty("Selection").toDispatch(),  //参数1

                    "insertFile",

                    Dispatch.Method,

                    new Object[]{(String) srcdocs.get(i), "", new Variant(false), new Variant(false), new Variant(false)}, // 参数4

                    new int[3]  // 参数5

            );

        }

        //2.4.如果目的word存在,则删除

        File tofile = new File(destDoc);

        if (tofile.exists()) {  // 目标pdf存在,则删除,前提未使用

            tofile.delete();

        }

        // 2.5.保存为新的word

        Dispatch.invoke((Dispatch) doc, "SaveAs", Dispatch.Method, new Object[]{destDoc, new Variant(1)}, new int[3]);

        Variant f = new Variant(false);

        Dispatch.call((Dispatch) doc, "Close", f);  // 把close属性赋值个f

        long end = System.currentTimeMillis();

        System.out.println("转换完成..用时:" + (end - start) + "ms.");

    } catch (Exception e) {

        System.out.println("========合并Word文件失败:" + e.getMessage());

        //throw new RuntimeException("========合并Word文件失败:" + e);

        return false;

    } finally {

        System.out.println("关闭文档");

        if (app != null) {

            app.invoke("Quit", new Variant[]{});

        }

    }

    // 如果没有这句话,winword.exe进程将不会关闭

    ComThread.Release();

    return true;

}

2.2.2 测试

/**

 * word转pdf

 */

public static void mergeMultipleWord2SingleTest() {

    MyWord2PDF d = new MyWord2PDF();

    String descDoc = "D:/Java通过jacob操作wps记录_new.doc";

    String descPdf = "D:/Java通过jacob操作wps记录_new.pdf";

    List srcDocs = new ArrayList<>();

    srcDocs.add("D:/Java通过jacob操作wps记录1.doc");

    srcDocs.add("D:/Java通过jacob操作wps记录2.doc");

    boolean mergeResult = d.mergeMultipleWord2Single(srcDocs, descDoc);

    if (mergeResult) {

        System.out.println("合并成功!");

        d.wordToPDF(descDoc, descPdf);

    } else {

        System.out.println("合并失败!");

    }

}

2.2.3 结果查看

image.png

2.3合并后的Word生成PDF

参见2.1.1

3常见错误及解决

3.1.错误一

错误:

文档转换失败:Can't get object clsid from progid

解决:

主要是创建ActiveXComponent的姿势不对,调整如下:

//app = new ActiveXComponent("Word.Application"); // 基于microsoft office app = new ActiveXComponent("KWPS.Application"); // 基于kwps的方式

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355

推荐阅读更多精彩内容