JXL 工具包
读文件(jxl包) | 写文件(Jxl.write包) | 说明 |
Workbook | WritableWorkbook | 操作Excel文档的工作薄 |
Sheet | WritableSheet | 操作Excel文档的工作表 |
Cell | WritableCell | 操作Excel文档的单元格 |
Image | WritableImage | 操作Excel文档的图像 |
Hyperlink | WritableHtperlink | 操作Excel文档的超链接 |
Jxl的API中我们主要用的就3个包(jxl, jxl.write,jxl.format) ,jxl能支持对 Excel 文档的读,写,删除,修改的操作,对java更好的支持,而且不依赖于windows操作系统,我们都知道excel 文档分为工作薄,工作表,以及单元格组成,下面我们来理解一下jxl 中的各个
类及对excel文档的操作。
单元格(此处指文本单元格,图像及链接和单元格做为一个层次)分为好多种,所以在API的设计中将Cell作为一个接口而存在.
对应的jxl中的结构为:
读文件(包jxl) | 写文件(包jxl.write) | 说明 |
Cell | WritableCell | 单元格 |
BooleanCell | Boolean | 布尔值单元格 |
DateCell | DateTime | 时间单元格 |
ErrorCell |
| 形式错误的单元格 |
LabelCell | Label | 文本单元格 |
NumberCell | Number | 数字单元格 |
FormualCedll | Formual | 公式单元格 |
| Blank | 空格单元格 |
BooleanFormualCell |
| 布尔公式单元格 |
DateFormualCell |
| 时间公式单元格 |
ErrorFormualCell |
| 错误公式单元格 |
StringFormualCell |
| 文本公式单元格 |
NumberFormualCell |
| 数字公式单元格 |
|
|
|
|
|
|
虽然数据是电子表格的核心,但是同时其也需要一些辅助类 比如文件格式设置,工作表设置与显示效果.单元格设置与显示效果等.按照其层次,则依次有以下接口或类.
读文件(包jxl) | 写文件(包jxl.write) | 说明 |
WorkbookSettings | WorkbookSettings(包jxl) | 设置workbook 属性的bean |
SheetSettings | SheetSettings(包jxl) | 设置具体sheet的属性的bean(比如表头表底等) |
HeaderFooter | HeaderFooter(包jxl) | 表示表头表底类 |
HeaderFooter.Contents | HeaderFooter.Contents(包jxl) | 具体表头表底设置 |
CellFeatures | WritableCellFeautres | 表格内容相关设置(验证) |
CellReferenceHelper |
| 得到引用单元格相关属性 |
CellType |
| 表格相关类型 |
CellView | CellView(包jxl) | 表格视图相关设置 |
CellFormat | WritableCellFormat | 表格显示样式设置 |
| BoldStyle | 边框枚举 |
| DateFormat | 时间格式 |
| DateFormats | 时间格式枚举 |
| NumbreFormat | 数据格式 |
| NumbreFormats | 数字模式枚举 |
| WritableFont | 字体设置 |
| WriteableFont.Fontname | 静态字体内部类 |
下面还有一个jxl.format包,里面主要是有关一些字体的设置及样式的设置的一些接口和类。
以上是我们了解的jxl的API 及里面的常用类的一个说明 下面我们具体的来讲以下怎么用jxl包来操作excel文档,毕竟只说不做有点不太好吧。
读取Excel文档中的数据
上面说了,读取文档中的数据主要用到Workbook,sheet,cell 3个类,下面有一段代码:
publicvoid readExcel(File file){ try { Workbook book = Workbook.getWorkbook(file);//获取Workbook的实例 Sheet sheet = book.getSheet(0);//获取sheet的实例 int columns = sheet.getColumns();//获取工作表的列数 int rows = sheet.getRows();//获取工作表的行数 Cell cell = null; String word = null; for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { cell = sheet.getCell(j,i);//获取某行某列单元格 word = cell.getContents();//获取单元格中的内容 if (cell.getType() == CellType.LABEL) {//判断单元格中的数据类型 LabelCell lc= (LabelCell)cell; word = lc.getString();//获取数据的字符串形式 System.out.println(word);//输出 } } } book.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (BiffException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } |
1. Workbook类
Workbook,工作簿类,它是一个抽象类,所以不能通过new来获取实例, 只能通过 Workbook的静态方法getWorkbook()来获取他的实例,他的实例是new它的子类WorkbookParser来实现的,WorkbookParser在jxl.read.biff中。它继承了java.lang包中的Object类,其中有几个方法是经常用的:
a.staticWritableWorkbook CreateWorkbook(File file); 它可以通过文件名来获取一个可写的 WritableWorkbook 实例。
b.abstractSheet getSheet(int index); 它可以通过下标来获取该文档的工作表,下表从0开始,它的子类WorkbookParser 复写了一个方法。
c.staticWorkbook getWorkbook(File file);这是一个工厂方法,通过他返回的是一个Workbook的子类WorkbookParser的一个实例,这是多态的一种表现。
2. Sheet接口
Sheet接口 工作表类,它是通过WorkbookParser的getSheet()方法来获取它的子类 SheetImpl 的实例,SheetImpl也在jxl.read.biff中。其中就几个常用的方法。
a. Cell getCell(int column,introw);它通过列标,行标来获取本工作表的某个单元格。
b. int getColumns(); 获取此工作表的列数。
c. int getRows(); 获取此工作表的行数。
3. Cell接口单元格类,可以通过他获取单元格中的数据类型。
a. CellType getType();获取这个单元格的数据类型,然后和LabelCell进行类型比较,强转成LabelCell,通过getString() 方法获取其中类容。
写入Excel文档数据
下面先看以下代码:
publicvoid writeExcel(File file){ WritableWorkbook book = null; WritableSheet stu_sheet = null; try { book = Workbook.createWorkbook(file); stu_sheet = book.createSheet("学生",0); Label label = null; label = new Label(0,0,"编号"); stu_sheet.addCell(label); label = new Label(1,0,"姓名"); stu_sheet.addCell(label); label = new Label(2,0,"性别"); stu_sheet.addCell(label); label = new Label(3,0,"年龄"); stu_sheet.addCell(label); book.write(); book.close(); } catch (RowsExceededException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (WriteException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } |
要往xls文件里面写入数据的时候需要注意的是第一要新建一个xls文件
OutputStream os=newFileOutputStream("c:\\excel2.xls");
再建完这个文件的时候再建立工作文件
jxl.write.WritableWorkbook wwb =Workbook.createWorkbook(new File(os));
如果这个文件已经存在,那么我们可以在这个文件里面加入一个sheet为了和以前的数据进行分开;
jxl.write.WritableSheet ws =wwb.createSheet("Test Sheet 1", 0);
在createSheet方法里前面的参数是sheet名,后面是要操作的sheet号写入文件要用到下面几个类。
1. WirtableWorkbook
a.void close ();关闭;
b.WritableSheet getSheet (int index);返回第index个可写工作表;
c. WritableSheet moveSheet (int fromIndex, int toIndex);把fromIndex的工作表移动到toIndex处.
d.void removeSheet (int index);删除这个工作表;
e.void write ();代表已写完;
2. WirtableSheet
- void addCell(WritableCell cell); 添加单元格到本表。
- WritableCell getWritableCell(int column, int row); 获取本表的某个可写的单元格。
- void removeRow(int row);删除某行
- void removeColumn(int col);删除某列
3. Label
- void setString(java.lang.String s)设置Label中的内容。
修改Excel文档数据
Jxl在修改excel文件时使用的方法比较怪,也可以说jxl不支持修改excel文件。它的处理方式是每次打开旧excel文件,然后创建一个该excel文件的可写的副本,所有的修改都是在这个副本上做的。下面是一个例子。
publicvoid updateExcel(File file){ WritableWorkbook book = null; Workbook book1 = null; try { book1 = Workbook.getWorkbook(file); book = Workbook.createWorkbook(file,book1); WritableSheet sheet = book.getSheet(0); WritableCell cell = sheet.getWritableCell(0,0); if (cell.getType() == CellType.LABEL) { Label label = (Label) cell; label.setString("学号"); System.out.println("修改成功"); } book.write(); book.close(); }catch (IndexOutOfBoundsException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (WriteException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (BiffException e) { // TODO Auto-generated catch block e.printStackTrace(); } } |
删除Excel文档数据
publicvoid deleteExcel(File file){ WritableWorkbook book =null; try { book = Workbook.createWorkbook(file); WritableSheet sheet = book.createSheet("学生",0); sheet.removeRow(0); book.write(); book.close(); System.out.println("删除成功!"); } catch (IndexOutOfBoundsException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (WriteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } |
填充数据
(1)添加的字体样式
jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES, 18,WritableFont.BOLD, true);
WritableFont()方法里参数说明:
这个方法算是一个容器,可以放进去好多属性
第一个: TIMES是字体大小,他写的是18
第二个: BOLD是判断是否为斜体,选择true时为斜体
第三个: ARIAL
第四个: UnderlineStyle.NO_UNDERLINE 下划线
第五个: jxl.format.Colour.RED 字体颜色是红色的
jxl.write.WritableCellFormat wcfF = newjxl.write.WritableCellFormat(wf);
jxl.write.Label labelC = newjxl.write.Label(0, 0, "This is a Label cell",wcfF);
ws.addCell(labelC);
在Label()方法里面有三个参数
第一个是代表列数,
第二是代表行数,
第三个代表要写入的内容
第四个是可选项,是输入这个label里面的样式
然后通过写sheet的方法addCell()把内容写进sheet里面。
(2)添加带有formatting的Number对象
jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");
(3)添加Number对象
(3.1)显示number对象数据的格式
jxl.write.NumberFormat nf = newjxl.write.NumberFormat("#.##");
jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf);
jxl.write.Number labelNF = newjxl.write.Number(1, 1, 3.1415926, wcfN);
ws.addCell(labelNF);
Number()方法参数说明:
前两上表示输入的位置
第三个表示输入的内容
(4)添加Boolean对象
jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false);
ws.addCell(labelB);
(5)添加DateTime对象
jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 3, newjava.util.Date());
ws.addCell(labelDT);
DateTime()方法的参数说明
前两个表示输入的位置
第三个表示输入的当前时间
(6)添加带有formatting的DateFormat对象
这个显示当前时间的所有信息,包括年月日小时分秒
jxl.write.DateFormat df = new jxl.write.DateFormat("dd MM yyyyhh:mm:ss");
jxl.write.WritableCellFormat wcfDF = newjxl.write.WritableCellFormat(df);
jxl.write.DateTime labelDTF = new jxl.write.DateTime(1, 3, newjava.util.Date(), wcfDF);
ws.addCell(labelDTF);
(7)添加带有字体颜色Formatting的对象
jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL, 10,WritableFont.NO_BOLD, false,UnderlineStyle.NO_UNDERLINE,jxl.format.Colour.RED);
jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);
import="jxl.format.*
jxl.write.WritableFont wfc = newjxl.write.WritableFont(WritableFont.ARIAL,20,WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,jxl.format.Colour.GREEN);
(8)设置单元格样式
jxl.write.WritableCellFormat wcfFC = newjxl.write.WritableCellFormat(wfc);
wcfFC.setBackGround(jxl.format.Colour.RED);//设置单元格的颜色为红色
wcfFC = new jxl.write.Label(6,0,"i love china",wcfFC);