熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

通過jacob對excel,word進行打印等操作

2013-11-23 18:43:35  來源: Java核心技術 

  因為項目有個需求要求能夠在某個預定時間對特定報表進行自動打印報表的形式主要是excel如果是c++或者c#什麼的簡直是小菜一碟可惜偏偏是java實現並且這又不同於常見的頁面手工打印可以通過javascript調用打印機來實現於是乎開始摸索如何實現該功能

  首先想到的是java自帶的打印類在javaxprint包下根據jdk說明照著搬來了個程序小試牛刀

  view plaincopy to clipboardprint?

  /**

  * @author xjj

  * 說明:打印類

  * email:

  * @date Oct

  */

  public class AutoPrint {

  public static void main(String[] args) {

  FileInputStream psStream;

  try {

  psStream = new FileInputStream(fileps);

  } catch (FileNotFoundException ffne) {

  }

  if (psStream == null) {

  return;

  }

  DocFlavor psInFormat = DocFlavorINPUT_STREAMPOSTSCRIPT;

  Doc myDoc = new SimpleDoc(psStream psInFormat null);

  PrintRequestAttributeSet aset =

  new HashPrintRequestAttributeSet();

  asetadd(new Copies());

  asetadd(MediaSizeA);

  asetadd(SidesDUPLEX);

  PrintService[] services =

  PrintServiceLookuplookupPrintServices(psInFormat aset);

  if(serviceslength<){

  throw new RuntimeException(找不到打印機);

  }

  if (serviceslength > ) {

  DocPrintJob job = services[]createPrintJob();

  try {

  jobprint(myDoc aset);

  } catch (PrintException pe) {}

  }

  }

  /**

  * @author xjj

  * 說明:打印類

  * email:

  * @date Oct

  */

  public class AutoPrint {

  public static void main(String[] args) {

  FileInputStream psStream;

  try {

  psStream = new FileInputStream(fileps);

  } catch (FileNotFoundException ffne) {

  }

  if (psStream == null) {

  return;

  }

  DocFlavor psInFormat = DocFlavorINPUT_STREAMPOSTSCRIPT;

  Doc myDoc = new SimpleDoc(psStream psInFormat null);

  PrintRequestAttributeSet aset =

  new HashPrintRequestAttributeSet();

  asetadd(new Copies());

  asetadd(MediaSizeA);

  asetadd(SidesDUPLEX);

  PrintService[] services =

  PrintServiceLookuplookupPrintServices(psInFormat aset);

  if(serviceslength<){

  throw new RuntimeException(找不到打印機);

  }

  if (serviceslength > ) {

  DocPrintJob job = services[]createPrintJob();

  try {

  jobprint(myDoc aset);

  } catch (PrintException pe) {}

  }

  }

  通過測試始終無法找到打印機運行時報定義的:找不到打印機聽說局域網內的打印機無法鏈接打印機只能連在本機上而測試的打印機剛好在局域網內而不在本機上然後查看了下文檔忽然發現java自帶的打印只對plain文本gifjpegpdf等支持而對excleword等是不支持的看來要學會放棄goodbye java print

  有道是車道山前必有路這不關鍵時刻jacob出現了根據官方網站的介紹 jacob即Java COM Bridge

  充當java和windows平台的橋梁作用通過com組件的方式如果大家不了解com組件可以google一下(順便鄙視下百度)通過它是我們在java中可以很方便的操作office包括wordexcel等

  閒話少說馬上開始jacob之旅首先當然是從官網上下載我們必要的資源

  進入官網大家會看到這樣一段話The JACOB project is moving to Verion is now available at Sourceforge If you are a sourceforge developer and are interested in contributing to the project please contact the project administrators 也就是jacob已經在大名鼎鼎的上安營扎寨了不過不解的是最新版本已經出來了這裡介紹的最新版本為什麼還是鄙視一下下載的時候除了jacobzip我建議最好把jacob_srczip也下載下來src下有源碼demo等等非常有用

  解壓:jacobzip將jacobjar加入classpath如果是intel平台將jacobxdll加入系統盤的system比如我的路徑是C:\WINDOWS\system 如果是AMD平台則加入jacobxdll

  ok 准備就緒開始寫代碼了本人參照自帶的demo實現了簡單的打開excel並打印的功能代碼如下

  view plaincopy to clipboardprint?

  /**

  * 功能:實現打印工作

  * @param path

  * @date Oct

  * @time :: AM

  */

  public static void print(String path){

  ComThreadInitSTA();

  ActiveXComponent xl = new ActiveXComponent(ExcelApplication);

  try {

  // Systemoutprintln(version= + xlgetProperty(Version));

  //不打開文檔

  Dispatchput(xl Visible new Variant(true));

  Dispatch workbooks = xlgetProperty(Workbooks)toDispatch();

  //打開文檔

  Dispatch excel=Dispatchcall(workbooksOpenpath)toDispatch();

  //開始打印

  Dispatchget(excelPrintOut);

  } catch (Exception e) {

  eprintStackTrace();

  } finally {

  //始終釋放資源

  ComThreadRelease();

  }

  }

  /**

  * 功能:實現打印工作

  * @param path

  * @date Oct

  * @time :: AM

  */

  public static void print(String path){

  ComThreadInitSTA();

  ActiveXComponent xl = new ActiveXComponent(ExcelApplication);

  try {

  // Systemoutprintln(version= + xlgetProperty(Version));

  //不打開文檔

  Dispatchput(xl Visible new Variant(true));

  Dispatch workbooks = xlgetProperty(Workbooks)toDispatch();

  //打開文檔

  Dispatch excel=Dispatchcall(workbooksOpenpath)toDispatch();

  //開始打印

  Dispatchget(excelPrintOut);

  } catch (Exception e) {

  eprintStackTrace();

  } finally {

  //始終釋放資源

  ComThreadRelease();

  }

  }

  然後運行就會打開路徑下的文件然後鏈接打印機打印而這正是我想要的然後就開始其他操作的摸索了在此基礎上通過定時任務生成excel利用jacob進行打印就功成名就了

  說個題外話參照demo打開的命令調用是Open關閉的命令調用是Close我想當然認為打印當然是Print莫屬了然而jacob真是不按常理出牌啊既然搞個PrintOut真nnd最後還是暴力破解出來的相關文檔也沒有(不知道是不是本人沒有找到)

  根據我所掌握的情況有兩點需要說明(通過驗證)

  jacob只適合windows平台如果是linux平台你最終會南轅北轍

  在xp下只需要在系統中加入jacobxdll即可但是如果在(估計已經絕技了)或者 server下需要額外的msvcrdll支持可以從通過下載vcredist_xexe進行安裝獲得下載地址

  x?familyid=BFDAEAADCF&displaylang=en

  最後說一下我說碰到的幾個異常情況

   原因沒有dll文件

  Java代碼

  Exception in thread main javalangUnsatisfiedLinkError: no jacob in javalibrarypath

  at javalangClassLoaderloadLibrary(ClassLoaderjava:)

  at javalangRuntimeloadLibrary(Runtimejava:)

  at javalangSystemloadLibrary(Systemjava:)

  at ComThread(ComThreadjava:)

  at combesterhwutilPrintExcelprint(PrintExceljava:)

  at combesterhwutilPrintExcelmain(PrintExceljava:)

   原因C++庫不正確

  Java代碼

  Exception in thread main javalangUnsatisfiedLinkError: C:\apps\\jacobdll: This application has fa

  iled to start because the application configuration is incorrect Reinstalling the application may fix this pr

  oblem

   原因文件路徑不正確(因為調用的第一個命令是Open所以這裡Invoke of:Open 以此類推)

  Java代碼

  ComFailException: Invoke of: Open

  Source: Microsoft Office Excel

   原因機子上沒有裝office

  Java代碼

  cant get Object cldid from progid

  好了搞了一個上午也算高點名堂出來了至少找到了一條解決問題的明路一點體會共勉!


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25631.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.