浅谈Java中利用JCOM实现仿Excel编程

2016-02-19 20:06 32 1 收藏

今天天气好晴朗处处好风光,好天气好开始,图老师又来和大家分享啦。下面给大家推荐浅谈Java中利用JCOM实现仿Excel编程,希望大家看完后也有个好心情,快快行动吧!

【 tulaoshi.com - 编程语言 】

在Java中使用JCOM和JXL注重要点:
  
  (1)在你的lib下要有jdom-1.0.jar,jxl-2.5.5.jar,jcom-2.2.4.jar,jcom.dll。
  
  (2)要把jcom.dll同时放到你JDK的bin目录下或者放到系统盘的windows下(推荐放到JDK的BIN下)
  
  把上面的JAR包都放好后开始写应用中的工具类(申明一下在JCOM中得到的都是IDispatch对象,以下还会抛出一个JComException的异常)
  
  (1)首先应该判定一个传进来的路径是Word 或是 Excel 还是其他的东东。
  
  if(path.endsWith(".doc")){
  ......
  }
  注:假如是excel后缀是".xls";
  
  (2)然后你要有两个对象:
  
  ReleaseManager rm = new ReleaseManager();
  IDispatch xlsApp=null;
  注:ReleaseManager相当于一个容器,与你机器上的所有JCOM组建交互,根据你传的参数他会去寻找你机器上的所有JCOM能操作的组建;
  
  IDispatch 可以理解为一个对象,所有的东东都是对象;
  
  (3)你要让他知道你要和EXCEL交互你得这样做
  
  xlsApp = new IDispatch(rm, "Excel.Application");
  (4)接着要得到一个Workbooks(工作薄)
  
  IDispatch excel = (IDispatch) xlsApp.get("Workbooks");
  (5)设置当前对象是否可见
  
  xlsApp.put("Visible", new java.lang.Boolean(false));
  (6)得到工作薄以后要打开
  
  IDispatch workbook = (IDispatch) excel.method("open", new Object[] { FilePath(EXCEL存放的路径) });
  (7)判定文件是否存在假如存在则删除
  
  File f = new File(outPath);
  if (f.exists())
  f.delete();
  (8)将工作薄另存为
  
  workbook.method("saveAs", new Object[] { outPath, new Integer(9) });
  (9)获得一个工作薄(workbook)下的所有工作表(Sheets)
  
  IDispatch sheets = (IDispatch) workbook.get("Sheets");
  注:得到的是一个数组;
  
  (10)获得工作表(Sheets)的总数
  
  int sheetsCount = Integer.parseInt(sheets.get("Count").toString());
  (11)得到每个工作表(Sheets)的名称
  
  for(int sheetInx=1;sheetInx = sheetsCount;sheetInx++) {
  IDispatch sheet = (IDispatch) sheets.get("item", new Object[] { new Integer(sheetInx) });
  String sheetName = sheet.get("name").toString();
  }
  注重:excel都是从1开始遍历 而不是从0开始 所以for里面有多种写法看自己怎么顺手怎么写;
  
  遍历工作表除了传索引还能传工作表名称:IDispatch sheet = ((IDispatch) sheets.get("item", new Object[] { sheetName }));
  
  (12)获得正在活动的工作表(sheet)
  
  IDispatch asheet = (IDispatch) xlsApp.get("ActiveSheet");
  注:xlsApp是从ReleaseManager里面获得EXCEL对象的一个IDispatch对象
  
  假如是获得sheets要先获得工作薄(Workbook)然后用工作薄(Workbook)获得他下的所有工作表(sheets)
  
  (13)获得工作表里面的所有行总数(6万多行吧)
  
  IDispatch row = (IDispatch)cursheet.get("Rows");
  int rows = Integer.parseInt(row.get("Count").toString());
  (14)获得工作表里面的所有列总数(256列)
  
  IDispatch col = (IDispatch)sheet.get("Columns");
  int cols = Integer.parseInt(col.get("Count").toString());
  (15)获得工作表里面可视的所有行总数
  
  IDispatch row = (IDispatch) ((IDispatch)cursheet.get("UsedRange")).get("Rows");
  
   int rows = Integer.parseInt(row.get("Count").toString());
  (16)获得工作表里面可视的所有列总数
  
  IDispatch col = (IDispatch) ((IDispatch)cursheet.get("UsedRange")).get("Columns");
  int cols = Integer.parseInt(col.get("Count").toString());
  (17)获得行列以后要获得里面的内容(这里用的rows 和 cols就是上面所得的)
  
  String cellVal="";
  String cellTxt="";
  String hasFormula= "";
  String cellFormula="";
  for(int i=0;irows;i++){
  for(int j=0;jcols;j++){
  IDispatch cells = (IDispatch) cursheet.get("Cells", new Object[] { new Integer(i+1),new Integer(j+1) });
  cellVal = cells.get("value").toString();
  cellTxt = cells.get("text").toString();
  hasFormula = cells.get("HasFormula").toString();
  cellFormula = cells.get("FormulaR1C1").toString();
  }
  }
  注:这个遍历的时候也是从1开始;
  
  cells.get("value")获得的是浮点数格式 假如你输入的是1,得到的会是1.0;
  
  cells.get("text")获得的是本身,你输入什么获得的就是什么;
  
  cells.get("HasFormula")判定是否是公式,假如单元格里是公式则返回真(true),假如不是公式则返回假(false);
  
  cells.get("FormulaR1C1")获得公式,获得单元格里公式的内容;
  
  (18)保护工作表
  
  asheet.method("Protect", new Object[] {
   password, new java.lang.Boolean(true), new java.lang.Boolean(true)
  });
  注:Protect后有N多参数 第1--3个分别是 password,DrawingObjects,Contects。
  
  (19)解工作表保护
  
  asheet.method("Unprotect", new Object[] { password });
  (20)在finally里面写关闭
  
  if (xlsApp != null) {
  ((IDispatch) xlsApp.get("ActiveWorkbook")).put("Saved", new java.lang.Boolean(true)); //保存工作薄
  xlsApp.method("quit", null); //quit 是关闭的是整个EXCEL
  xlsApp = null;
  }
  rm.release();
  rm = null;
  (21)关闭根据情况也写在finally 里面
  
  workbook.method("close", null);
  xlsApp.method("quit", null);
  xlsApp=null;
  rm.release();
  rm = null;
  注:workbook.method("close", null);关闭的是Workbook里的工作表;
  
  xlsApp.method("quit", null);关闭的是整个工作薄
  
  注重:
  
  关闭的时候一定要加上
  
  //rm 就是ReleaseManager的实例
  rm.release();
  rm = null;
  假如你打开EXCEL不加上面两句的话在进程里面还运行着EXCEL.EXE
  //----------------------------------------------------------------

  如有不对请多多指教!!谢谢

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

来源:http://www.tulaoshi.com/n/20160219/1622763.html

延伸阅读
Stripes是一个以让程序员的web开发简单而高效为准则来设计的基于动作的开源Java web框架。本文将介绍Stripes与其它如Struts之类基于动作的框架的区别和其提供的一些存在于Ruby on Rails之中的简单性。 Stripes是一个以让程序员的web开发简单而高效为准则来设计的基于动作的开源Java web框架。传统的Java web开发着眼于借去耦(Decoupl...
标签: Java JAVA基础
通过使用COM技术,我们用微软Office应用程序能够建立很多应用程序扩展,但是Java开发人员却无法享受它带来的便利--除非他们拥有方便的Java访问COM的途径(Java-to-COM桥)。使用JCom的时候,你可以在Java中控制几乎所有的COM对象,而且它还带有一些用于Excel的强大的辅助类。 在你每次编写用HTML表格样式或Java表格对象显...
  什么是UDP协议 UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据包。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。 为什么要使用UDP 在选择使用协议的时候,选择UDP必须要谨慎。在...
标签: Java JAVA基础
使用 Java 编程语言实现线程 Java编程语言使多线程如此简单有效,以致于某些程序员说它实际上是自然的。尽管在 Java 中使用线程比在其他语言中要容易得多,仍然有恍└拍钚枰莆铡R亲〉囊患匾氖虑槭?main() 函数也是一个线程,并可用来做有用的工作。程序员只有在需要多个线程时才需要创建新的线程。 Thre...
标签: PHP
出自:http://www.cncsk.com/Document/WebDev/PHP/200512291759.htm 这篇文章介绍在PHP的面向对象编程(OOP)。我将演示如何用面向对象的概念编出较少的代码但更好的程序。祝大家好运。 面向对象编程的概念对每一个作者来说都有不同的看法,我提醒一下一个面向对象语言应有的东西: - 数据抽象和信息隐藏 ...

经验教程

264

收藏

86
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部