Jacob工具类使用文件互转服务 word转html html转excel word转pdf excel转pdf ppt转pdf
前提条件 必须安装MSoffice
1.jdk使用jdk1.8
2.jacob.dll放在..\jdk1.8\jre\bin目录下
3.eclipse的jre版本要和jdk一致,window->preferences->java->compiler勾选jdk 1.8
4.window->preferences->java->InstalledJREs->Add 配置成jdk1.8.0_22版本 然后勾选上 点击ok、
5.在项目目录下新建lib目录,将jacob.jar文件拷贝到该目录下,点build path->configbuild path ->libraries
1)Add JARs->选择lib目录下的jacob.jar点击Ok
2)移除项目原来的JRE System Library ,AddLibrary->JRE System Library 选择之前添加的jdk1.6.0_22 ,点击finish
点击ok,libraries配置完毕
备注:3.出现Can'tco-create object问题,可能是之前调用dll后,没有释放资源,需要加入如下代码
先导入importcom.jacob.com.ComThread;//在jacob1.9版本里有这个类,1.6和1.7版本经测试无法导入此类
ComThread.InitSTA();// 初始化COM线程
// 以下操作word代码
MSWordManager ms=new MSWordManager(false);
//生成一个MSwordManager对象,并且设置显示Word程序
ms.openDocument("D:\\12.doc");
//创建一个新的.doc文件
ms.putTxtToCell(1, 1, 2, "!!!!");
//插入文本
ms.save("D:\\12.doc");
//保存.doc文件
ms.close();
ms.closeDocument();
// 以上操作word代码
ComThread.Release();// 操作完成后,释放COM线程
4.以下代码可以避免上述Can't co-create object问题
,在finally中释放资源
ActiveXComponentapp = new ActiveXComponent("Word.Application"); // 启动word
StringinFile = "D:\\123.doc"; // 要替换的word文件
try{
app.setProperty("Visible",new Variant(false)); // 设置word不可见
Dispatchdocs = app.getProperty("Documents").toDispatch();
Dispatchdoc = Dispatch.invoke(
docs,
"Open",
Dispatch.Method,
newObject[] { inFile, new Variant(false),
newVariant(false) }, new int[1]).toDispatch();
//打开word文件,注意这里第三个参数要设为false,这个参数表示是否以只读方式打开,
//因为我们要保存原文件,所以以可写方式打开。
Dispatchselection = app.getProperty("Selection").toDispatch();// 获得对Selection组件
Dispatch.call(selection,"HomeKey", new Variant(6));// 移到开头
Dispatchfind = Dispatch.call(selection, "Find").toDispatch();// 获得Find组件
Dispatch.put(find,"Text", "name"); // 查找字符串"name"
Dispatch.call(find,"Execute"); // 执行查询
Dispatch.put(selection,"Text", "111"); // 替换为"111"
Dispatchfind1 = Dispatch.call(selection, "Find").toDispatch();// 获得Find组件
Dispatch.call(selection,"HomeKey", new Variant(6));// 移到开头
Dispatch.put(find1,"Text", "8位随机生成密码"); // 查找字符串
Dispatch.call(find1,"Execute"); // 执行查询
Dispatch.put(selection,"Text", "222");
StringnewFileName = "D:\\temp.doc";
Dispatch.call(doc,"SaveAs", newFileName); // 另存文件
Dispatch.call(doc,"Close", new Variant(false));
System.out.println("isover");
}catch (Exception e) {
e.printStackTrace();
}finally {
app.invoke("Quit",new Variant[] {});
app.safeRelease();
}
5.workspace中的代码要求D盘根目录下有123.doc文件才能运行,否则会一致搜索不到相关词汇
工具类:
package com.guige.base.util;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComFailException;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import java.util.Date;
/**
* TODO
*
* @author songaw
* @date 2018/5/17 9:54
*/
public class JacobUtil {
//word转PDF
private static final String wdFormatPDF="17";
//html转xls
private static final String htmlFormatExcel="51";
//PPT 转pdf
private static final String pptFormatPDF="32";
//excel转PDF
private static final String xlTypePDF="0";
/**
* html转excel
* @param srcFilePath
* @param targetFilePath
* @return
*/
public static boolean htmlToExcel(String srcFilePath, String targetFilePath) {
ActiveXComponent app = null;
Dispatch excel = null;
try {
app = new ActiveXComponent("Excel.Application");
System.out.println("*****正在转换...*****");
// 设置Excel应用程序不可见
app.setProperty("Visible", false);
// Workbooks表示Excel程序的所有文档窗口,(
app.setProperty("AutomationSecurity", new Variant(3)); // 禁用宏
Dispatch excels = app.getProperty("Workbooks").toDispatch();
//打开要转换的Excel文件
excel = Dispatch.call(excels, "Open", srcFilePath, false,
true).toDispatch();
//设置兼容性检查为false
Dispatch.put(excel, "CheckCompatibility", false);
app.setProperty("DisplayAlerts",false);
Dispatch.invoke(excel, "SaveAs", Dispatch.Method, new Object[]{targetFilePath, new Variant(htmlFormatExcel)}, new int[1]);
app.setProperty("DisplayAlerts",true);
System.out.println("*****转换成功...*****");
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if (excel != null) {
Dispatch.call(excel, "Close", false);
}
if (app != null) {
app.invoke("Quit", new Variant[] {});
//app.invoke("Quit", 0);
}
ComThread.Release();
}
}
/**
* word转pdf
* @param srcFilePath
* @param targetFilePath
* @return
*/
public static boolean docToPdf(String srcFilePath, String targetFilePath) {
ActiveXComponent app = null;
Dispatch doc = null;
try {
ComThread.InitSTA();
app = new ActiveXComponent("Word.Application");
System.out.println("*****正在转换...*****");
app.setProperty("Visible", false);
Dispatch docs = app.getProperty("Documents").toDispatch();
doc = Dispatch.invoke(docs, "Open", Dispatch.Method,
new Object[] { srcFilePath,
new Variant(false),
new Variant(true),//是否只读
new Variant(false),
new Variant("pwd") },
new int[1]).toDispatch();
//Dispatch.put(doc, "CheckCompatibility", false); //兼容性检查,为特定值false不正确
Dispatch.put(doc, "RemovePersonalInformation", false);
app.setProperty("DisplayAlerts",false);
Dispatch.call(doc, "ExportAsFixedFormat", targetFilePath, wdFormatPDF); // word保存为pdf格式宏,值为17
app.setProperty("DisplayAlerts",true);
System.out.println("*****转换成功...*****");
return true; // set flag true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if (doc != null) {
Dispatch.call(doc, "Close", false);
}
if (app != null) {
app.invoke("Quit", 0);
}
ComThread.Release();
}
}
public static boolean pptToPdf(String srcFilePath, String pdfFilePath) {
ActiveXComponent app = null;
Dispatch ppt = null;
try {
ComThread.InitSTA();
app = new ActiveXComponent("PowerPoint.Application");
System.out.println("*****正在转换...*****");
Dispatch ppts = app.getProperty("Presentations").toDispatch();
// 因POWER.EXE的发布规则为同步,所以设置为同步发布
ppt = Dispatch.call(ppts, "Open", srcFilePath, true,// ReadOnly
true,// Untitled指定文件是否有标题
false// WithWindow指定文件是否可见
).toDispatch();
//Dispatch.put(ppt, "CheckCompatibility", false); //兼容性检查,为特定值false不正确
app.setProperty("DisplayAlerts",false);
Dispatch.call(ppt, "SaveAs", pdfFilePath, pptFormatPDF); //ppSaveAsPDF为特定值32
app.setProperty("DisplayAlerts",true);
System.out.println("*****转换成功...*****");
return true; // set flag true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if (ppt != null) {
Dispatch.call(ppt, "Close");
}
if (app != null) {
app.invoke("Quit");
}
ComThread.Release();
}
}
public static boolean excelToPDF(String srcFilePath, String pdfFilePath) {
ActiveXComponent app = null;
Dispatch excel = null;
try {
ComThread.InitSTA(true);
app = new ActiveXComponent("Excel.Application");
System.out.println("*****正在转换...*****");
long date = new Date().getTime();
app.setProperty("Visible", false);
app.setProperty("AutomationSecurity", new Variant(3)); // 禁用宏
Dispatch excels = app.getProperty("Workbooks").toDispatch();
excel = Dispatch
.invoke(excels, "Open", Dispatch.Method,
new Object[] { srcFilePath, new Variant(false), new Variant(false) }, new int[9])
.toDispatch();
// 转换格式
Dispatch.put(excel, "CheckCompatibility", false);
app.setProperty("DisplayAlerts",false);
Dispatch.invoke(excel, "ExportAsFixedFormat", Dispatch.Method, new Object[] { new Variant(0), // PDF格式=0
pdfFilePath, new Variant(xlTypePDF) // 0=标准 (生成的PDF图片不会变模糊) 1=最小文件
// (生成的PDF图片糊的一塌糊涂)
}, new int[1]);
app.setProperty("DisplayAlerts",true);
System.out.println("*****转换成功...*****");
// 这里放弃使用SaveAs
/*
* Dispatch.invoke(excel,"SaveAs",Dispatch.Method,new Object[]{
* outFile, new Variant(57), new Variant(false), new Variant(57),
* new Variant(57), new Variant(false), new Variant(true), new
* Variant(57), new Variant(true), new Variant(true), new
* Variant(true) },new int[1]);
*/
return true;
} catch (Exception e) {
e.printStackTrace();
// TODO: handle exception
return false;
}finally {
if (excel != null) {
Dispatch.call(excel, "Close", false);
}
if (app != null) {
app.invoke("Quit", new Variant[] {});
//app.invoke("Quit", 0);
}
ComThread.Release();
}
}
}