環境准備:
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", "這里是一個段落的內容");//插入一個段