亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

Java中使用JCOM操作Office對象

2024-09-05 00:18:33
字體:
來源:轉載
供稿:網友

  Java開發人員使用COM技術可以構建許多應用程序的擴展,但是Java開發人員不能享受它帶來的便利,當使用JCOM時,可以控制Java中幾乎所有COM對象,今天錯新技術頻道為你帶來Java中使用JCOM操作Office對象。

  在你每次編寫用HTML表格樣式或Java表格對象顯示數據的應用程序的時候,通常都需要帶有"導出到Excel"功能。那么頭疼的問題就出現了。怎么樣實現這種功能呢?在HTML中顯示的可以在Office 2003中處理嗎?沒有這么好!你還必須支持Office 97!

  你只能去找一個符合當前需求的工具了,但是接著收到更多的要求了。"這能在Word中做到嗎?Powerpoint能做到嗎?能不能用調制解調器撥號到遠程服務器上并發布數據?Java無法實現這些功能是什么意思啊?Java可以實現任何功能。"

  感謝作為Java和COM橋梁的框架組件,它使你在遇到這些情況的時候都可以回答"Yes"。Java-COM橋梁使你能夠根據自己的需要操作Windows組件--以前這是VB、C++和.NET開發人員的領地。你通過實現一個與DCOM后端(back end)對話的Java前端(front end),可以遠離端對端(end-to-end)的COM系統。在本文的末尾,你可以使用其中一個Java-to-COM橋:它可以被命名為JCom。

  Excel基礎知識

  開始之前,你需要首先從Sourceforge網站下載API。它包含了JCom所使用的Java類的所有源代碼、C++代碼和JCom用于配置Java和COM的編譯好的DLL。把這個DLL放到你的Java主目錄的/bin/目錄下面,否則會出現問題。同時,為了不出現問題,還要正確地設置JAVA_HOME環境變量。JCom的大多數文檔目前都是用日語寫的,但是翻譯工作正在進行中,因此以后會有些改進的。

  下載和安裝過程完成以后,用列表1中的代碼試一試。這段代碼會建立到Excel的JCom接口,并把"Hello World"寫入第一個單元格中。你可以看到如圖1所示的結果。盡管JCom是一個通用的COM類庫,但是還是帶有很多用于Excel的輔助類,這是因為Excel可能是最常用的自動化COM應用程序。這些輔助類可以為我們節省很多時間,它們使JCOM成為一個更好的類庫了。

  列表1:開始使用JCOM和Excel

  import jp.ne.so_net.ga2.no_ji.jcom.excel8.*;

  import jp.ne.so_net.ga2.no_ji.jcom.*;

  public class testSimple

  {

  public static void main(String[] args) throws Exception {

  ReleaseManager rm = new ReleaseManager();

  try {

  System.out.println("EXCEL is Starting...");

  ExcelApplication excel = new ExcelApplication(rm);

  excel.Visible(true);

  ExcelWorkbooks xlBooks = excel.Workbooks();

  ExcelWorkbook xlBook = xlBooks.Add();

  ExcelWorksheets xlSheets = xlBook.Worksheets();

  ExcelWorksheet xlSheet = xlSheets.Item(1);

  ExcelRange xlRange = xlSheet.Cells();

  xlRange.Item(1,1).Value("Hello, World!" );

  }

  catch(Exception e) { e.printStackTrace(); }

  finally { rm.release(); }

  }

  }

  圖1:Java中使用Excel的第一個COM自動化

  如果曾經使用VB或VBA來自動化Excel,那么你應該很熟悉列表1中的代碼了。ExcelApplication類暴露了Workbooks()屬性,它列舉出Excel中當前打開的工作薄(workbook),并允許你向運行的Excel副本增加或刪除工作薄。使用.Add()方法增加工作薄,這個方法會返回一個工作薄的引用。

  在Excel中工作薄用于保存輸入的數據。工作薄是XLS文件的基礎。一個工作薄由多個工作表(worksheet,在圖1中有三個工作表,分別叫做Sheet1、Sheet2和Sheet3)。工作表通過Item屬性來枚舉。你可以使用這個屬性訪問特定的工作表。在圖1中,Sheet 1是第一個工作表,因此你可以使用xlSheets.Item(1)來獲取對它的引用。

  有了工作表之后,你就可以使用range(范圍)來操作它上面的數據。Range是一個單元格或多個單元格。例如,單元格A1可以使用range (1,1)來引用,接著可以使用Value屬性把數據載入單元格中。

  更有意義的例子

  假設你希望把Excel作為數據庫中某些數據的表現層。在Java中你希望通過JDBC獲取數據,并把數據顯示在Excel前端。這種假設是很好的,因為復雜業務邏輯中的用例(use case)已經用Excel前端顯示了,更不用說工作流中的其它的數據項的顯示和交互操作了。現在你不需要了解業務邏輯或分析,就可以使用原始的電子表格,并使用Java中的自動化來"填充它們之間的裂痕"。

  我將給出一個演示這種操作的簡單示例:本文下載中所包含的內容是建立比較銷售行為的一個簡單的MySQL數據庫的。它有三個表:

  · Sales是銷售的細節信息,包括銷售項、數量、銷售價格、是誰銷售的以及銷售地區。

  · People包含銷售人員的姓名和傭金。

  · Districts包含了銷售地區的名稱和稅率。

  生成報表的時候,你需要使用下面的業務邏輯來算出真正的數值:

  · 毛銷售額等于銷售項乘以銷售價格加上地稅金額。

  · 純銷售額等于毛銷售額減去銷售人員提取的稅前傭金。

  這都是一些在Java中可以實現的簡單直接的計算過程,但是我在本文中使用它們的目的是演示如何把這些數據寫入Excel電子表格并讓Excel自動計算。對于更復雜的情況(使用了更復雜的Excel公式),原理也是一樣的。

  此外,下載的內容中還包含了如圖2所示的電子表格。它是作為"模板"供你填充適當的數據的電子表格。

  圖2:用于前端填充數據的Excel模板

  使用JCOM的時候,查詢數據庫中所有銷售數據需要使用下面的SQL:

  SELECT sales.id, sales.description, sales.quantity, sales.price, districts.districtname,districts.salestax,people.name,people.commission

  FROM 'sales','districts','people'

  WHERE (sales.district = districts.id) AND (sales.salesperson = people.id)

  接著使用自動化(automation)把每條記錄都寫入Excel電子表格的適當的列中。下載的內容中包含了完整的代碼(列表2所示)。在下面的部分,我將為你解釋代碼中使用JCOM的自動化部分。

  列表2:從數據庫中獲取數據并載入Excel中的代碼

  // 首先建立Excel的引用

  ExcelApplication excel = new ExcelApplication(rm);

  // 使它可視

  excel.Visible(true);

  // 接著打開我們將使用的模板工作薄

  ExcelWorkbooks xlBooks = excel.Workbooks();

  ExcelWorkbook xlBook = xlBooks.Open("c:/sales.xls");

  // 接著獲取我們將修改的范圍的引用

  ExcelWorksheets xlSheets = xlBook.Worksheets();

  ExcelWorksheet xlSheet = xlSheets.Item(1);

  ExcelRange xlRange = xlSheet.Cells();

  …

  // 此處放置數據庫鏈接和查詢建立代碼

  …

  if (stmt.execute(strSql))

  {

  rs = stmt.getResultSet();

  }

  int nColCount = rs.getMetaData().getColumnCount();

  int nRow=1;

  int nCol=0;

  // 在記錄集中循環

  while(rs.next())

  {

  // 記錄集中的每行都是電子表格中的一行

  nRow++;

  for(int i=1;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的第一部分中,其目標是獲取希望修改的單元格的控制權。這會花費了一定的開銷。

  · 首先你必須獲取表現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列的值。通過使用rs.movenext(),當前行一直向后移動,直到記錄集的末尾。

  你在列表2中可能會注意到一個奇怪的函數調用:

  nCol = getExcelColumn(i);

  這是一個簡單的輔助函數,它把記錄集中的列編號與Excel中存放數據的位置進行匹配。例如,如果你再次查看上面的SQL語句,傭金費率將返回到第8列。在電子表格中,存放它的列是第13列。這個函數用于處理兩者之間的轉換。更復雜的應用程序可以使用Excel中的命名(named)范圍來匹配列,但是這超出了本文的范圍。

  最后,應用程序把公式輸入適當的單元中。它是使用Excel的R1C1符號來實現的,因此相應的字符串是用于描述公式的。在Excel中,假設你希望把第1行中A列的值與B列的值相加,然后放到C列中,那么你就需要在C列中輸入公式"=A1+B1"。如果在第二行你也希望這樣操作,那么可以復制和粘貼這個公式,它會自動地更新為"=A2+B2"。

  從示例程序中得到這些值需要一些字符串操作,但是如果使用"R1C1"相關的轉換就非常直接了。在本文的例子中,你在C1中輸入公式的時候,不需要給出"=A1+B1"引用,而是給出"=RC[-2]+RC[-1]"引用,它的意思是把向前兩列的值與向前一列的值相加。

  當你移動了其它行的時候,這個公式的值不會發生改變,因此它使我們生成程序所需要的值非常簡單了。這也是我用于計算總銷售額、銷售稅金、毛銷售額和純銷售額的方法,如下所示:

  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)");

  運行這段代碼將得到圖3所示的電子表格。

  圖3:公式:Excel顯示了數據庫查詢的輸出信息

  請注意,這是一種比較好的工程學經驗,即不要在應用程序中包含公式,因為公式可能隨時改變,而你肯定不希望在改變公式的時候就去改變自己的代碼。這種辦法使每個新數據行成為包含公式的已有數據行的副本。模板電子表格(sales.xls)包含了假數據,并在第二列中包含了公式(第一列包含了列標題)。因此,當你填充每行的時候,在你填入數據庫值的之前線復制這一行的內容。通過這種辦法,公式通過復制進入了新數據行,并且你不需要在Java代碼中包含任何業務邏輯。

  我們看一看salesReport2.java文件(也在下載內容中)中的內容,你可以發現,我們并沒有使用前面所說的公式,而是在While循環頂部使用了下面的代碼:

  if(nRow>1)

  {

  String strDest="A"+(nRow+1);

  ExcelRange xlRange2Copy = xlSheet.Range("A2:M2");

  xlRange2Copy.Copy(xlSheet.Range(strDest));

  }

  除了第一行之外(第一行不需要處理,這樣的信息已經包含在sales.xls中了),這段代碼將處理A2到M2之間的單元,并把它們復制到nRow+1標識的數據行中(nRow是當前行的編號)。加上1的原因是計算了列標題(列標題在第一行)。

  超越Excel

  請記住JCOM是用于COM的而不僅僅是用于Excel的。你可以使用這種工具在Java中控制幾乎所有的COM對象。Excel是最常見的被控制對象,因為有很多很好的輔助類可以讓它更簡單,但是所有的COM組件都是可以使用的。因此控制其它的應用程序(例如Word和Powerpoint)也是直接的。

  下面是使用Word的一個例子:

  IDispatch wdApp = new IDispatch(rm, "Word.Application");

  wdApp.put("Visible", new Boolean(true));

  由于沒有用于Word的直接的輔助類,每個部分都必須通過使用IDispatch對象來實現(用于Excel的下層輔助類也是這樣實現的)。上面的代碼將載入微軟Word副本,并通過wdApp對象使它可以自動化操作。接著你可以使用類似"put"(設置屬性)或"method"(調用方法)等方法來使用Word。例如,上面的代碼把Visible屬性設置為true,使得該Word應用程序可視。

  如果你必須使用Windows,那么有很多COM組件可以擴展你的視野,遠不止Java目前提供的。通過串行和并行端口的硬件控制也可以在Java中實現,這僅僅是個開始。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情在线观看视频| 欧美激情网站在线观看| 国产成人精品最新| 成人午夜在线视频一区| 国产亚洲xxx| 日韩电影在线观看永久视频免费网站| 91免费高清视频| 中文字幕日韩欧美在线| 亚洲国产精彩中文乱码av在线播放| 成人精品一区二区三区电影黑人| 91免费精品视频| 中文字幕欧美精品日韩中文字幕| 日韩av网站在线| 久久久999国产精品| 国产精品亚洲视频在线观看| 欧美日韩国产综合新一区| 欧美国产第一页| 91sao在线观看国产| 日韩美女在线观看一区| 日韩欧美一区二区三区| 国产精品jizz在线观看麻豆| 日韩精品福利网站| 欧美性高潮床叫视频| 欧美人在线视频| 精品久久久久久国产| 国产欧美日韩综合精品| 日韩在线观看高清| 久久久久久久久中文字幕| 一区二区三区四区在线观看视频| 亚洲精品在线91| 久久久在线免费观看| 中文字幕日韩高清| yw.139尤物在线精品视频| 在线成人免费网站| 高清一区二区三区四区五区| 国产日韩欧美夫妻视频在线观看| 91九色国产社区在线观看| 日韩av在线免费观看| 狠狠躁夜夜躁人人躁婷婷91| 91精品视频一区| 欧美国产日韩精品| 国产精品专区一| 狠狠久久五月精品中文字幕| 国产精品久久久久久久久久久新郎| 日韩精品视频在线观看网址| 伊人成人开心激情综合网| 亚洲精品日韩丝袜精品| 成人国产精品色哟哟| 日本一区二三区好的精华液| 欧美亚洲成人xxx| 亚洲国产精品免费| 91精品视频专区| 欧美性xxxxx极品娇小| 国产精品一区二区三区免费视频| 亚洲黄页网在线观看| 68精品久久久久久欧美| 精品日韩中文字幕| 97avcom| 欧美成年人视频网站| 日韩视频免费中文字幕| 久久这里只有精品99| 一区二区av在线| 久久99热精品这里久久精品| 日韩在线精品视频| 欧美重口另类videos人妖| 亚洲欧洲美洲在线综合| 欧美日产国产成人免费图片| 国产69精品99久久久久久宅男| 国产精品美女999| 久久久成人精品视频| 国产suv精品一区二区| 久久综合伊人77777蜜臀| 亚洲欧美日韩天堂一区二区| 亚洲精品一二区| 国产精品女主播| 日韩电影第一页| 国产精品永久免费视频| 播播国产欧美激情| 亚洲伊人一本大道中文字幕| 欧美超级乱淫片喷水| 在线国产精品播放| 亚洲自拍偷拍色图| 亚洲女人天堂色在线7777| 亚洲视频精品在线| 欧亚精品在线观看| 视频在线观看一区二区| 亚洲精品久久久一区二区三区| 亚洲毛片在线观看.| 成人激情视频小说免费下载| 亚洲国产成人精品女人久久久| 欧美中文字幕视频在线观看| 性色av一区二区三区| 亚洲美女喷白浆| 中文字幕亚洲一区二区三区五十路| 国产亚洲精品日韩| 欧美国产日韩一区二区| 国产一区二区色| 精品国产电影一区| 91伊人影院在线播放| 免费99精品国产自在在线| 欧美精品在线网站| 日韩欧美国产视频| 97国产精品久久| 欧美性做爰毛片| 日韩中文在线中文网三级| 国产欧美最新羞羞视频在线观看| 青青草原成人在线视频| 热久久这里只有精品| 亚洲自拍偷拍色片视频| 亚洲视频在线观看| 久久精品99久久久久久久久| 国产91精品黑色丝袜高跟鞋| 亚洲精品99久久久久中文字幕| 精品国产乱码久久久久酒店| 亚洲欧美自拍一区| 国产精品免费久久久久久| 精品国产网站地址| 亲爱的老师9免费观看全集电视剧| 一区二区三区四区在线观看视频| 色哟哟网站入口亚洲精品| 日韩电视剧免费观看网站| 日韩成人在线播放| 欧美大片免费观看在线观看网站推荐| 韩剧1988在线观看免费完整版| www.精品av.com| 国产午夜精品视频| 尤物九九久久国产精品的分类| 国产精品免费一区| 日韩欧美一区二区三区| 草民午夜欧美限制a级福利片| 亚洲图片制服诱惑| 综合网中文字幕| 国产精品爱啪在线线免费观看| 国产精品美女www| 国产成人久久久| 久久九九亚洲综合| 欧美一级在线亚洲天堂| 奇米四色中文综合久久| 成人精品在线视频| 黄色成人在线免费| 亚洲第一色在线| 777午夜精品福利在线观看| 欧美一级视频一区二区| 91精品久久久久| 日韩电影中文字幕在线观看| 91国产中文字幕| 欧美乱人伦中文字幕在线| 欧美中文字幕在线观看| 成人在线免费观看视视频| 欧美老少配视频| 国产精品视频资源| 欧美大尺度电影在线观看| 国内精品模特av私拍在线观看| 日韩高清免费在线| 全色精品综合影院| 国产精品自在线| 在线播放日韩欧美| 亚洲自拍av在线| 日韩免费在线观看视频| 国产91精品在线播放| 国产午夜一区二区| 青青青国产精品一区二区| 国产精品一区二区久久| 久热99视频在线观看|