环境准备:
1.首先将JACOB的DLL(如jacob-1.17-x64.dll,要跟jar包版本一致)拷贝至 C:\Windows\System32 中
2.在计算机管理的服务中将服务DCom Server Process Launcher(DcomLaunch)打开。
3.将jacob.jar拷贝到项目的/libs目录下,jdk/bin目录下,jdk/jre/bin目录下,以及jre/bin目录下。
4.需要安装Microsoft office 2003以上版本
代码:
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
public class PrintByJacobUtil {
/** Excel
* @param path 打印文件路径,形如 E:\\temp\\tempfile\\1494607000581.xls
*/
public static void printExcel(String filepath){
if(filepath.isEmpty()){
return;
}
//初始化COM线程
ComThread.InitSTA();
//新建Excel对象
ActiveXComponent xl=new ActiveXComponent("Excel.Application");
try {
System.out.println("Version=" + xl.getProperty("Version"));
//设置是否显示打开Excel
Dispatch.put(xl, "Visible", new Variant(false));
//打开具体的工作簿
Dispatch workbooks = xl.getProperty("Workbooks").toDispatch();
Dispatch excel=Dispatch.call(workbooks,"Open",filepath).toDispatch();
//设置打印属性并打印
Dispatch.callN(excel,"PrintOut",new Object[]{Variant.VT_MISSING, Variant.VT_MISSING, new Integer(1),//new Integer(1),设置打印的份数
new Boolean(false),/*PRINT_NAME*/Variant.VT_MISSING, new Boolean(true),Variant.VT_MISSING, ""});
//关闭文档
Dispatch.call(excel, "Close", new Variant(false));
} catch (Exception e) {
e.printStackTrace();
} finally{
xl.invoke("Quit",new Variant[0]);//关闭进程
//始终释放资源
ComThread.Release();
}
}
/** Word
* @param path 打印文件路径,形如 E:\\temp\\tempfile\\1494607000581.doc
*/
public static void printWord(String filepath) {
if(filepath.isEmpty()){
return;
}
System.out.println("开始打印word");
//初始化COM线程
ComThread.InitSTA();
//使用Jacob创建 ActiveX部件对象:
ActiveXComponent word=new ActiveXComponent("Word.Application");
//打开Word文档
Dispatch doc=null;
Dispatch.put(word, "Visible", new Variant(false));// 这里Visible是控制文档打开后是可见还是不可见,若是静默打印,那么第三个参数就设为false
// word.setProperty("ActivePrinter", new Variant("pdfFactory Pro")); //设置打印机,第二个参数即为打印机的name
Dispatch docs=word.getProperty("Documents").toDispatch();
doc=Dispatch.call(docs, "Open", filepath).toDispatch();
try {
Dispatch.call(doc, "PrintOut");//打印
} catch (Exception e) {
e.printStackTrace();
System.out.println("word打印失败");
}finally{
try {
if(doc!=null){
//关闭文档
Dispatch.call(doc, "Close",new Variant(0));
}
} catch (Exception e2) {
e2.printStackTrace();
}
word.invoke("Quit", new Variant[] {});//关闭进程
//释放资源
ComThread.Release();
}
}
}
其他问题:
上面的某步中,我们使用“open”打开了一个现有的word文档,如果改用“add”,那么我们就可以新建一个文档了
Dispatch document = Dispatch.call(documents, "Add").toDispatch(); // 使用Add命令创建一个新文档
Dispatch wordContent = Dispatch.get(document, "Content").toDispatch(); // 取得word文件的内容
Dispatch.call(wordContent, "InsertAfter", "这里是一个段落的内容");//插入一个段