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

Java中使用JCOM操作Office對象

2013-11-23 17:56:18  來源: Javascript 

  通過使用COM技術我們用微軟Office應用程序能夠建立很多應用程序擴展但是Java開發人員卻無法享受它帶來的便利除非他們擁有方便的Java訪問COM的途徑(JavatoCOM橋)使用JCom的時候你可以在Java中控制幾乎所有的COM對象而且它還帶有一些用於Excel的強大的輔助類
  
  在你每次編寫用HTML表格樣式或Java表格對象顯示數據的應用程序的時候通常都需要帶有導出到Excel功能那麼頭疼的問題就出現了怎麼樣實現這種功能呢?在HTML中顯示的可以在Office 中處理嗎?沒有這麼好!你還必須支持Office
  
  你只能去找一個符合當前需求的工具了但是接著收到更多的要求了這能在Word中做到嗎?Powerpoint能做到嗎?能不能用調制解調器撥號到遠程服務器上並發布數據?Java無法實現這些功能是什麼意思啊?Java可以實現任何功能
  
  感謝作為Java和COM橋梁的框架組件它使你在遇到這些情況的時候都可以回答YesJavaCOM橋梁使你能夠根據自己的需要操作Windows組件以前這是VBC++和NET開發人員的領地你通過實現一個與DCOM後端(back end)對話的Java前端(front end)可以遠離端對端(endtoend)的COM系統在本文的末尾你可以使用其中一個JavatoCOM橋它可以被命名為JCom
  
  Excel基礎知識
  
  開始之前你需要首先從Sourceforge網站下載API它包含了JCom所使用的Java類的所有源代碼C++代碼和JCom用於配置Java和COM的編譯好的DLL把這個DLL放到你的Java主目錄的/bin/目錄下面否則會出現問題同時為了不出現問題還要正確地設置JAVA_HOME環境變量JCom的大多數文檔目前都是用日語寫的但是翻譯工作正在進行中因此以後會有些改進的
  
  下載和安裝過程完成以後用列表中的代碼試一試這段代碼會建立到Excel的JCom接口並把Hello World寫入第一個單元格中你可以看到如圖所示的結果盡管JCom是一個通用的COM類庫但是還是帶有很多用於Excel的輔助類這是因為Excel可能是最常用的自動化COM應用程序這些輔助類可以為我們節省很多時間它們使JCOM成為一個更好的類庫了
  
  列表開始使用JCOM和Excel
  
  import jpneso_netgano_jijcomexcel*;
  import jpneso_netgano_jijcom*;
  
  public class testSimple
  {
  public static void main(String[] args) throws Exception {
  ReleaseManager rm = new ReleaseManager();
  try {
  Systemoutprintln(EXCEL is Starting);
  ExcelApplication excel = new ExcelApplication(rm);
  excelVisible(true);
  ExcelWorkbooks xlBooks = excelWorkbooks();
  ExcelWorkbook xlBook = xlBooksAdd();
  ExcelWorksheets xlSheets = xlBookWorksheets();
  ExcelWorksheet xlSheet = xlSheetsItem();
  ExcelRange xlRange = xlSheetCells();
  xlRangeItem()Value(Hello World! );
  }
  catch(Exception e) { eprintStackTrace(); }
  finally { rmrelease(); }
  }
  }
   
  圖Java中使用Excel的第一個COM自動化
  
  如果曾經使用VB或VBA來自動化Excel那麼你應該很熟悉列表中的代碼了ExcelApplication類暴露了Workbooks()屬性它列舉出Excel中當前打開的工作薄(workbook)並允許你向運行的Excel副本增加或刪除工作薄使用Add()方法增加工作薄這個方法會返回一個工作薄的引用
  
  在Excel中工作薄用於保存輸入的數據工作薄是XLS文件的基礎一個工作薄由多個工作表(worksheet在圖中有三個工作表分別叫做SheetSheet和Sheet工作表通過Item屬性來枚舉你可以使用這個屬性訪問特定的工作表在圖Sheet 是第一個工作表因此你可以使用xlSheetsItem()來獲取對它的引用
  
  有了工作表之後你就可以使用range(范圍)來操作它上面的數據Range是一個單元格或多個單元格例如單元格A可以使用range ()來引用接著可以使用Value屬性把數據載入單元格中
  
  更有意義的例子
  
  假設你希望把Excel作為數據庫中某些數據的表現層在Java中你希望通過JDBC獲取數據並把數據顯示在Excel前端這種假設是很好的因為復雜業務邏輯中的用例(use case)已經用Excel前端顯示了更不用說工作流中的其它的數據項的顯示和交互操作了現在你不需要了解業務邏輯或分析就可以使用原始的電子表格並使用Java中的自動化來填充它們之間的裂痕
  
  我將給出一個演示這種操作的簡單示例本文下載中所包含的內容是建立比較銷售行為的一個簡單的MySQL數據庫的它有三個表
  
  · Sales是銷售的細節信息包括銷售項數量銷售價格是誰銷售的以及銷售地區
  
  · People包含銷售人員的姓名和傭金
  
  · Districts包含了銷售地區的名稱和稅率
  
  生成報表的時候你需要使用下面的業務邏輯來算出真正的數值
  
  · 毛銷售額等於銷售項乘以銷售價格加上地稅金額
  
  · 純銷售額等於毛銷售額減去銷售人員提取的稅前傭金
  
  這都是一些在Java中可以實現的簡單直接的計算過程但是我在本文中使用它們的目的是演示如何把這些數據寫入Excel電子表格並讓Excel自動計算對於更復雜的情況(使用了更復雜的Excel公式)原理也是一樣的
  
  此外下載的內容中還包含了如圖所示的電子表格它是作為模板供你填充適當的數據的電子表格
   
  圖用於前端填充數據的Excel模板
  
  使用JCOM的時候查詢數據庫中所有銷售數據需要使用下面的SQL
  
  SELECT salesid salesdescription salesquantity salesprice districtsdistrictnamedistrictssalestaxpeoplenamemission
  FROM salesdistrictspeople
  WHERE (salesdistrict = districtsid) AND (salessalesperson = peopleid)
  
  接著使用自動化(automation)把每條記錄都寫入Excel電子表格的適當的列中下載的內容中包含了完整的代碼(列表所示)在下面的部分我將為你解釋代碼中使用JCOM的自動化部分
  
  列表從數據庫中獲取數據並載入Excel中的代碼
  
  // 首先建立Excel的引用
  ExcelApplication excel = new ExcelApplication(rm);
  // 使它可視
  excelVisible(true);
  // 接著打開我們將使用的模板工作薄
  ExcelWorkbooks xlBooks = excelWorkbooks();
  ExcelWorkbook xlBook = xlBooksOpen(c:\\salesxls);
  // 接著獲取我們將修改的范圍的引用
  ExcelWorksheets xlSheets = xlBookWorksheets();
  ExcelWorksheet xlSheet = xlSheetsItem();
  ExcelRange xlRange = xlSheetCells();
  
  …
  // 此處放置數據庫鏈接和查詢建立代碼
  …
  
  if (stmtexecute(strSql))
  {
  rs = stmtgetResultSet();
  }
  int nColCount = rsgetMetaData()getColumnCount();
  int nRow=;
  int nCol=;
  // 在記錄集中循環
  while(rsnext())
  {
  // 記錄集中的每行都是電子表格中的一行
  nRow++;
  for(int i=;i<=nColCount;i++)
  {
  // 匹配DB列和電子表格列
  nCol = getExcelColumn(i);
  // 查找於行和列對應的單元格,並把它設置為適當的記錄集字段
  xlRange.Item(nRow,nCol).Value(rs.getObject(i).toString());
  }
  // 填入公式
  xlRange.Item(nRow,7).Value("=RC[-2]*RC[-1]");
  xlRange.Item(nRow,9).Value("=RC[-2]*RC[-1]/100");
  xlRange.Item(nRow,10).Value("=RC[-3]+RC[-1]");
  xlRange.Item(nRow,11).Value("=RC[-4]*((100-RC[2])/100)");
  }
  
  在列表2的第一部分中,其目標是獲取希望修改的單元格的控制權。Tw.WiNgwIt.cOM這會花費了一定的開銷。
  
  · 首先你必須獲取表現Excel本身的對象,有了JCOM輔助類的幫助以後,這一步操作相當直接。
  
  ExcelApplication excel = new ExcelApplication(rm);
  
  · 下一步,你希望獲取對工作薄集合的訪問權。你希望打開自己的模板工作薄(本示例中這個模板在C:\sales.xls中),在工作薄集合中打開它。
  
  ExcelWorkbooks xlBooks = excel.Workbooks();
  
  · 下一步,你希望打開自己的工作薄並獲取該工作薄集合的引用。
  
  ExcelWorkbook xlBook = xlBooks.Open("c:\\sales.xls");
  ExcelWorksheets xlSheets = xlBook.Worksheets();
  
  · 最後,你希望獲取集合中的第一個工作表,並把工作范圍定義為整個工作表。
  
  ExcelWorksheet xlSheet = xlSheets.Item(1);
  ExcelRange xlRange = xlSheet.Cells();
  
  完成這些工作以後,你的xlRange對象將允許你在單元中放入值和公式了。通過在前面的記錄集(從提交給數據庫的SQL命令中返回的)中循環,使用xlRange.Item(nRow,nCol).Value("whatever")語法,逐行逐列地把記錄集中的值插入到電子表格中(語法中的whatever來自於記錄集)。通過使用rs.getObject(i).toString可以得到當前行中I列的值
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25388.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.