当前位置:  编程技术>java/j2ee

Java中使用JCOM操作Office对象

    来源: 互联网  发布时间:2014-10-16

    本文导语:    通过使用COM技术,我们用微软Office应用程序能够建立很多应用程序扩展,但是Java开发人员却无法享受它带来的便利--除非他们拥有方便的Java访问COM的途径(Java-to-COM桥)。使用JCom的时候,你可以在Java中控制几乎所有的COM...

  通过使用COM技术,我们用微软Office应用程序能够建立很多应用程序扩展,但是Java开发人员却无法享受它带来的便利--除非他们拥有方便的Java访问COM的途径(Java-to-COM桥)。使用JCom的时候,你可以在Java中控制几乎所有的COM对象,而且它还带有一些用于Excel的强大的辅助类。

  在你每次编写用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;i1)
  {
  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中实现了,而这仅仅是个开始。在你的工具包中有了JCOM之后,就不受任何限制了。


    
 
 

您可能感兴趣的文章:

  • .net/c#/asp.net iis7站长之家
  • 写一个方法,向它传递一个对象,循环打印出对象层次结构中的所有类?thinking in java里面的一个习题不知道如何做请教高手?
  • 各位高手知道在JAVA中如何用一个名称创建一个对象实例,并调用其方法,注意:在编写代码时并不知要创建的对象的类名,也并不知方法名
  • java里基本数据类型是什么?对象么?
  • Java中所有东西都是对象吗?
  • 能在JavaScript中访问Jsp页面的Java对象?
  • Java能调用OLE对象吗?怎样利用Java生成Excel报表?
  • 关于java中类和对象的问题.
  • Java 对象哈希映射库 JOhm
  • 通用并发 Java 对象池 Vibur Object Pool
  • Java对象数据库 ObjectDB
  • java applet和servlet之间是否可以传递对象?
  • Java对象转换库 EZMorph
  • 请问java.sql包中 preparedStatement 对象的setString(int parameterIndex,java.lang.String x)方法怎么用?
  • java.util类对象的DATE方法为何不能用? <%=new java.util.date()%>,在页面中是这样写的,服务器用的是Resin.
  • java如何调用word文档对象??
  • 如何检测一个java.sql.ResultSet对象是否eof?
  • Java对象的SQL接口 JoSQL
  • 如何在JAVA方法中返回多个对象,谁能解决给200分。
  • Java对象序列化框架 Kryo
  • 在java中怎么知道一个对象占用内存的字节数?
  • java操作excel2007文档介绍及代码例子
  • java执行操作系统命令的问题:如何判断多个操作系统?
  • java初学者问:java操作平台是什么?用什么工具?
  • 我是java新手,请问java中与平台相关的操作是怎样实现的
  • Java的XML操作类库 JDOM
  • Java操作系统 JNode
  • Java 操作 Excel 的类库 jExcelApi
  • JAVA与数据库操作问题
  • 请问又没有java控制.exe或操作注册表的方法?
  • Java的Excel操作包 OpenXLS
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 使用java jdk中的LinkedHashMap实现简单的LRU算法
  • MySocketServer.java 使用或覆盖一个不鼓励使用的API???
  • java将类序列化并存储到mysql(使用hibernate)
  • JAVA中不赞成使用(Deprecated)的方法是否可以使用
  • 各位使用过JAVA的朋友们!JAVA好用吗?它有向VC那样的集成开发环境吗?
  • java 可以使用 可是javac不可以使用。老兄帮帮忙
  • 哪位知道如何用JAVA进行图形文件的缩放? 是使用JAVA2D 或是有第三方的软件?
  • java堆栈类使用实例(java中stack的使用方法)
  • env查看环境变量,JAVA_HOME明明在里面,但使用nutch时还是提示JAVA_HOME not set?
  • 如何使用linux下的java编译器????
  • 如何使用java这个命令?
  • 为什么使用cat输出的文本文件是中文的,使用java从文件读取出来时显示的是乱码?
  • linux 远程上使用java
  • UNIX下使用java运行class的问题
  • java:sun公司的联机帮助如何使用?
  • 请教如何使用Java编写的Applet程序关闭浏览器??
  • 怎么使用 JAVA 的包呀???
  • 针对使用java进行硬件编程
  • 使用editplus编写java如何编译成字节码文件,如何解释
  • 谁能告诉我哪里能找到java包内部类及方法使用介绍
  • 使用java时间的调查,谢谢大家
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3