a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 273|回复: 4

[JAVA] 2011年计算机等考二级JAVA学习精华整理(78)

[复制链接]
发表于 2012-7-31 22:04:26 | 显示全部楼层 |阅读模式
 3.7 jxl.jar 包简介  下载地址
  S# B: G$ }6 F* P* b" V5 R  http://www.andykhan.com/jexcelapi/ 当前的最高版本是2.6。# f6 b3 n; G2 W0 U# `
  作者的网站上对它的特征有如下描述:
) I) ?5 _, i  X7 R# _% U: M5 C  |+ u  ● 支持Excel 95-2000的所有版本
* h" A  ^1 \& `  ● 生成Excel 2000标准格式
; Z# J( e! r+ w: k; A, K5 d3 X# m  ● 支持字体、数字、日期操作
- E" e& `: m8 g  ● 能够修饰单元格属性0 h$ Y% _; K) @: z5 L" E
  ● 支持图像和图表1 q* ~% [1 D/ m7 v  V
  应该说以上功能已经能够大致满足我们的需要。最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。
% O( R7 ~6 P7 S  搭建环境
/ ^3 a0 {! B9 ~& ]# k  将下载后的文件解包,得到jxl.jar,放入classpath,安装就完成了。- r( x- a& S6 V0 z3 i
  基本操作, U0 m' j- f: N# F6 X
  一、创建文件
- @; j; @4 K+ d8 d, w  拟生成一个名为“测试数据.xls”的Excel文件,其中第一个工作表被命名为“第一页”,大致效果如下:8 h. j; [& M# T( e7 U% R
  代码(CreateXLS.java):
& Q" Q# G3 b( v$ |# ~# A4 ^  //生成Excel的类9 W+ H) e/ F5 k& R" c. _6 O
  import java.io.*;4 g$ _" U/ S$ p' Q
  import jxl.*;$ f" [" M9 [2 G8 N3 S' G( Y
  import jxl.write.*;
1 W6 i; f# r0 Z  public class CreateXLS {
, A# T. Q# I7 N5 U1 z, }: {5 z* e  public static void main(String args[]) {
: s5 K7 A+ N, {4 q( H  try {" _/ l# v% r% ?. B; U+ j
  // 打开文件5 T( A' l! w' z. h. [5 h
  WritableWorkbook book = Workbook.createWorkbook(new File("测试.xls"));
回复

使用道具 举报

 楼主| 发表于 2012-7-31 22:04:27 | 显示全部楼层

2011年计算机等考二级JAVA学习精华整理(78)

 // 生成名为“第一页”的工作表,参数0表示这是第一页  WritableSheet sheet = book.createSheet("第一页", 0);3 G5 N4 S% q0 U% X1 g& D  {2 {" Z3 @
  // 在Label对象的构造子中指名单元格位置是第一列第一行(0,0)+ [4 k7 }9 ]  L5 l
  // 以及单元格内容为test* u: B$ a4 @3 q; F7 i7 Z- k
  Label label = new Label(0, 0, "test");
' c0 n8 c/ ~# a9 H5 z- \! N  // 将定义好的单元格添加到工作表中$ z) U* j: U0 u
  sheet.addCell(label);
2 N" l3 _9 z. y3 [2 t  /*
+ @/ s/ ~/ k  u  * 生成一个保存数字的单元格 必须使用Number的完整包路径,否则有语法歧义 单元格位置是第二列,第一行,值为789.123& Q5 q! o5 \, d& w& G# ~3 D$ s
  */
/ W  S2 j0 t$ c  jxl.write.Number number = new jxl.write.Number(1, 0, 789.123);
" |) ^" q% E# X; z1 I4 A% I  sheet.addCell(number);9 y( V" V% }$ Y9 h1 M0 v. N
  // 写入数据并关闭文件4 Q& K9 j  n! O3 ]
  book.write();
7 R. L5 Z/ a4 }  book.close();+ y* i9 _3 x, _2 r/ F, g" p7 H7 K: j
  } catch (Exception e) {3 \  t7 L) y6 Z6 k# h# |& N
  System.out.println(e);
0 ~/ d- s# z6 w& a- a  }8 D0 T3 z6 M& |) m- K  Z
  }0 X; h9 w/ @# z0 @
  }
. D9 k; n" X1 R  f4 a1 }  编译执行后,会在当前位置产生一个Excel文件。* D& J. M' A. Q9 M- n8 H3 S, N/ C
  三、读取文件9 z2 `6 t- @8 g5 [
  以刚才我们创建的Excel文件为例,做一个简单的读取操作,程序代码如下:
; l; q4 m; N) \) r  //读取Excel的类  j% E; E: Q* j
  import java.io.*;* E/ S1 J2 D/ u" j$ s! J2 o+ w9 _
  import jxl.*;' G6 Q1 S( h* _& u; p' k
  public class ReadXLS {
) o1 o  N5 n" k. t0 f$ }% k6 e& {/ d  public static void main(String args[]) {
6 m! s$ D4 j  I1 \' b% l( p  try {
3 M2 G; U- n5 G& ?. N  Workbook book = Workbook.getWorkbook(new File("测试.xls"));8 d. l9 j: N1 j2 _
  // 获得第一个工作表对象
0 N/ B# A9 S1 q$ W/ x5 p0 s  Sheet sheet = book.getSheet(0);
. l; ?% Z" Y! }# \7 S+ M! k% [9 `  // 得到第一列第一行的单元格+ D4 d7 }: |+ }3 K
  Cell cell1 = sheet.getCell(0, 0);
* Y" j, U5 m( w$ @' x* W  String result = cell1.getContents();1 H7 U- t1 ?% s$ ]$ ^* J$ A( }* I
  System.out.println(result);8 m" [. {% y1 V! e8 Y% T4 e
  book.close();
  a) t( j+ k) S. G2 X0 \  P0 {! I  } catch (Exception e) {# H8 ]- c2 e) y( X4 j
  System.out.println(e);
1 r2 n3 {& k( X2 F" @1 k" L/ l  }# H; u/ y! [; W3 m) C4 f6 T
  }5 W7 n& q0 N# m' f0 x
  }
$ B* z8 m* k2 X, S6 T3 @  程序执行结果:test
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 22:04:28 | 显示全部楼层

2011年计算机等考二级JAVA学习精华整理(78)

  四、修改文件
' z9 m- Q0 O! X5 a/ j( n' ^0 H9 N  利用jExcelAPI可以修改已有的Excel文件,修改Excel文件的时候,除了打开文件的方式不同之外,其他操作和创建Excel是一样的。下面的例子是在我们已经生成的Excel文件中添加一个工作表:
7 H8 U. ^0 A" @( a3 |$ J  //修改Excel的类,添加一个工作表& c7 b; J# T. e7 l4 V# x6 _
  import java.io.*;
6 U& L( Q9 O1 I* f* J  import jxl.*;" {' d* }& A  F' h$ w2 z) Y# e1 K
  import jxl.write.*;4 [- {# [# Y/ K
  public class UpdateXLS {
4 n5 z$ {7 s3 Q# b+ u  public static void main(String args[]) {
1 R5 s+ f8 e9 n  try {/ D2 ?! a( T' ^) }6 h" B
  // Excel获得文件4 I( X0 h" e; L/ j/ z3 _
  Workbook wb = Workbook.getWorkbook(new File("测试.xls"));, u: h+ b/ A. p) @7 U: Q( U! {
  // 打开一个文件的副本,并且指定数据写回到原文件
' @6 s0 H! ?, x$ N2 z  h2 [! \  WritableWorkbook book = Workbook.createWorkbook(new File("测试.xls"),
* {5 t6 W; w. P6 E( B6 ]  r  wb);' l" z3 d+ D; v2 A; J- b
  // 添加一个工作表0 G* S$ o5 P- e3 x8 o, e" Y5 a, T7 l
  WritableSheet sheet = book.createSheet("第二页", 1);( Y" q  M* m9 n' x$ s. z+ A2 {
  sheet.addCell(new Label(0, 0, "第二页的测试数据"));6 Y# e! N) C6 k* w* K6 u7 j
  book.write();) B5 g+ O7 ~  W9 p# o
  book.close();0 h- C; r; f* b5 I) H/ N! d
  } catch (Exception e) {
# ?9 o3 X9 ?2 E: i1 K7 b4 P  System.out.println(e);8 A8 U8 r* N0 V/ @1 D
  }$ A# w+ f, I3 Z1 `/ v: w1 r
  }) n( N- p& M6 e2 V8 N
  }
7 \  }# j- n+ q% T. T# T9 T  高级操作8 v- T4 i# x0 p# i
  一、 数据格式化
4 o3 m0 h/ W# h$ v( X( N  v; e  v  在Excel中不涉及复杂的数据类型,能够比较好的处理字串、数字和日期已经能够满足一般的应用。' F4 m6 L/ D5 I& Q
  1、 字串格式化
# {/ `+ v: u1 }- a7 E. e  字符串的格式化涉及到的是字体、粗细、字号等元素,这些功能主要由WritableFont和WritableCellFormat类来负责。假设我们在生成一个含有字串的单元格时,使用如下语句,为方便叙述,我们为每一行命令加了编号:" t0 R; A- c* t4 E) H
  WritableFont font1=
4 n$ \- }7 s% j' {$ q$ h  new WritableFont(WritableFont.TIMES,16,WritableFont.BOLD); 或//设置字体格式为excel支持的格式 WritableFont font3=new WritableFont(WritableFont.createFont("楷体_GB2312"),12,WritableFont.NO_BOLD );① WritableCellFormat format1=new WritableCellFormat(font1); ② Label label=new Label(0,0,”data 4 test”,format1) ③ 其中①指定了字串格式:字体为TIMES,字号16,加粗显示。WritableFont有非常丰富的构造子,供不同情况下使用,jExcelAPI的java-doc中有详细列表,这里不再列出。 ②处代码使用了WritableCellFormat类,这个类非常重要,通过它可以指定单元格的各种属性,后面的单元格格式化中会有更多描述。 ③处使用了Label类的构造子,指定了字串被赋予那种格式。 在WritableCellFormat类中,还有一个很重要的方法是指定数据的对齐方式,比如针对我们上面的实例,可以指定:
$ {$ n4 ]& |" N! E  //把水平对齐方式指定为居中3 d3 E1 H/ Q3 C, b5 W, a
  format1.setAlignment(jxl.format.Alignment.CENTRE);, }# [- w6 Z1 L! o4 s
  //把垂直对齐方式指定为居中
' T! G0 I; r* {" X7 I; X  format1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
) w- n1 g, o7 D& x0 ^- c; i  //设置自动换行
3 `. E3 j4 H0 g) {$ d  format1.setWrap(true);
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 22:04:29 | 显示全部楼层

2011年计算机等考二级JAVA学习精华整理(78)

 二、单元格操作  Excel中很重要的一部分是对单元格的操作,比如行高、列宽、单元格合并等,所幸jExcelAPI提供了这些支持。这些操作相对比较简单,下面只介绍一下相关的API。% k  S7 e0 k% k# @0 T, @- ]
  1、 合并单元格9 `( ]. R/ N) y( \2 g
  WritableSheet.mergeCells(int m,int n,int p,int q);
3 k& N; M$ a* c; U+ ^$ {  作用是从(m,n)到(p,q)的单元格全部合并,比如:
3 M- K3 R, a$ Y9 h  WritableSheet sheet=book.createSheet(“第一页”,0);$ v: M2 p% |6 @" U: q6 L( O
  //合并第一列第一行到第六列第一行的所有单元格$ c$ z# o  g" a- x
  sheet.mergeCells(0,0,5,0);
  I$ P5 @# g% t% a) ]8 O& P0 L  合并既可以是横向的,也可以是纵向的。合并后的单元格不能再次进行合并,否则会触发异常。
+ j: ?4 P. M* Z- _9 [) E* D5 ]  2、 行高和列宽
, _& c$ m: Y9 F  WritableSheet.setRowView(int i,int height);
  o" b( G" A. n1 s  作用是指定第i+1行的高度,比如:3 z( _" E7 y% j. K
  //将第一行的高度设为200
6 b+ r6 r- m, E% f/ m  sheet.setRowView(0,200);1 r; |, X* m7 B; U
  WritableSheet.setColumnView(int i,int width);: M& y. [' z2 A4 D( z" O; A4 v# Q
  作用是指定第i+1列的宽度,比如:
* {: V# g5 e9 v/ h5 |  //将第一列的宽度设为30+ e4 i% K5 E2 I" b' g# A/ O
  sheet.setColumnView(0,30);
1 M2 j3 q2 d  [5 K  五、操作图片
7 _- B4 b8 o# I6 n  }  public static void write()throws Exception{
; {0 Y9 f4 w9 i  WritableWorkbook wwb=Workbook.createWorkbook(new File("c:/1.xls"));3 k5 I; C' f9 I* E* @# {: Y  {
  WritableSheet ws=wwb.createSheet("Test Sheet 1",0);' v, b1 f4 u3 y3 k% ]: J1 t# \
  File file=new File("C:\\jbproject\\PVS\\WebRoot\\weekhit\\1109496996281.png");% y( J' W8 {( v+ S- n
  WritableImage image=new WritableImage(1, 4, 6, 18,file);$ d* g' g: b7 ~9 R5 L
  ws.addImage(image);
; p0 p5 m) O6 o: g6 L* I  wwb.write();. p- Q$ O0 v" |  @1 f. h
  wwb.close();
: W: T2 ]( C0 Q1 L4 U  }0 ]: F6 ]- s* j- N
  很简单和插入单元格的方式一样,不过就是参数多了些,WritableImage这个类继承了Draw,上面只是他构造方法的一种,最后一个参数不用了说了,前面四个参数的类型都是double,依次是 x, y, width, height,注意,这里的宽和高可不是图片的宽和高,而是图片所要占的单位格的个数,因为继承的Draw所以他的类型必须是double,具体里面怎么实现的我还没细看:)因为着急赶活,先完成功能,其他的以后有时间慢慢研究。以后会继续写出在使用中的心得给大家。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 22:04:30 | 显示全部楼层

2011年计算机等考二级JAVA学习精华整理(78)

读:  读的时候是这样的一个思路,先用一个输入流(InputStream)得到Excel文件,然后用jxl中的Workbook得到工作薄,用Sheet从工作薄中得到工作表,用Cell得到工作表中得某个单元格.1 ~6 W7 r( t2 s  k7 n5 E' _  e7 |
  InputStream->Workbook->Sheet->Cell,就得到了excel文件中的单元格
" t! u6 P7 Z, W/ y7 L% _5 j  代码:4 w4 w9 H0 L& Y- B- y
  String path="c:\\excel.xls";//Excel文件URL
9 ?& P! u0 h7 _( x  InputStream is = new FileInputStream(path);//写入到FileInputStream
! Z* Q" [( |- v  jxl.Workbook wb = Workbook.getWorkbook(is); //得到工作薄
* l# ]- ~4 _. j- w" s3 e4 P  jxl.Sheet st = wb.getSheet(0);//得到工作薄中的第一个工作表4 `: J; i8 S( z
  Cell cell=st.getCell(0,0);//得到工作表的第一个单元格,即A1
. J0 _/ E' p, o$ r+ ^  String content=cell.getContents();//getContents()将Cell中的字符转为字符串* p6 |7 e3 U+ I& ]- g+ |
  wb.close();//关闭工作薄
5 w: \2 l5 O* }6 f  is.close();//关闭输入流
3 f' o5 u% T+ H, @  ~2 c! v  我们可以通过Sheet的getCell(x,y)方法得到任意一个单元格,x,y和excel中的坐标对应.
7 A* @! D  ^" O  例如A1对应(0,0),A2对应(0,1),D3对应(3,2).Excel中坐标从A,1开始,jxl中全部是从0开始.% n2 r! @, F  b& e9 `' B
  还可以通过Sheet的getRows(),getColumns()方法得到行数列数,并用于循环控制,输出一个sheet中的所有内容.0 C2 u' [: ]0 D" k& |
  写:
1 b' C& F; s/ j3 ]  往Excel中写入内容主要是用jxl.write包中的类.1 i7 v7 t8 W" c9 k
  思路是这样的:
" I  h' _' z! U0 m0 I; r  OutputStreamßWritableWorkbookßWritableSheetßLabel
% R/ N- G9 w2 W  这里面Label代表的是写入Sheet的Cell位置及内容., G4 x) w, Q: @4 q+ |
  代码:
3 ^6 q2 {, K' c+ i; a  OutputStream os=new FileOutputStream("c:\\test.xls");//输出的Excel文件URL
& O; |, e0 J+ a5 d, y/ U  WritableWorkbook wwb = Workbook.createWorkbook(os);//创建可写工作薄" P+ A3 x* `; T5 I& g5 \9 t4 D
  WritableSheet ws = wwb.createSheet("sheet1", 0);//创建可写工作表
$ ~( |1 @2 r' ?& C5 M4 Q  Label labelCF=new Label(0, 0, "hello");//创建写入位置和内容
8 I1 q7 j% h3 `, G$ J) O, u  ws.addCell(labelCF);//将Label写入sheet中( u6 N; e8 G  i8 j% W& ?
  Label的构造函数Label(int x, int y,String aString)xy意同读的时候的xy,aString是写入的内容.
# U8 L7 Z3 U2 I0 Q! @  WritableFont wf = new WritableFont(WritableFont.TIMES, 12, WritableFont.BOLD, false);//设置写入字体
  P* P- ^7 u  ^) d, z8 o  WritableCellFormat wcfF = new WritableCellFormat(wf);//设置CellFormat3 Y! W3 ~, n' g8 W
  Label labelCF=new Label(0, 0, "hello");//创建写入位置,内容和格式
- u. R& M3 B+ h  Label的另一构造函数Label(int c, int r, String cont, CellFormat st)可以对写入内容进行格式化,设置字体及其它的属性.1 ]0 }4 N+ G3 R
  现在可以写了9 @; h7 v/ y( x8 l. I, g/ M) U6 Q- a
  wwb.write();0 W- Y! d6 J$ Q2 j
  写完后关闭* G/ c; v# S6 }6 R7 Y: T% z
  wwb.close();7 ^8 u2 r1 r% U# ]
  输出流也关闭吧# t7 g. j8 i1 z0 ?: `& x7 ]
  os.close;! X# c3 }2 p$ W& x
  OK,只要把读和写结合起来,就可以在N个Excel中读取数据写入你希望的Excel新表中,还是比较方便的.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-3 10:42 , Processed in 0.233548 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表