全部博文(2065)
分类: Java
2010-05-09 14:38:54
Java中EXCEL操作整理之API熟悉
下载URL:
一、熟练掌握API的相关操作方法
先复习一下相关术语
在默认情况下,每一个工作簿文件会打开3个工作表文件,分别以Sheet1、Sheet2、Sheet3来命名。工作表的名字显示在工作簿文件窗口底部的 选项卡里。
工作表 工作表是指由“65536 ”个行和“256”个列所构成的一个表格,如图2-5所示。行号的编号是由上自下从“1”到“65536 ”编号;列号则由左到右采用字母编号为“A”…“IV”。每一个行、列坐标所指定的位置称为单元格。
可以这样理解:
工作簿相当于一个数据库。默认打开的时候就有三个工作表名称为sheet1 sheet2这些了
工作表相当于一个数据表
数据表里面有65536*256 个二维数据
Excel单元格是组成Excel工作表的一个个表格格子。
API里面的
Workbook 相当于是一个工作簿了
创建的方法有如下几个
static (java.io.File file)
A factory method which takes in an excel
file and reads in the contents. static (java.io.File file, ws)
A factory method which takes in an
excel file and reads in the contents. static (java.io.InputStream is)
A factory method which takes in an
excel file and reads in the contents. static (java.io.InputStream is, ws)
A factory method which takes in an
excel file and reads in the contents.
示例:
InputStream is = new FileInputStream("E:/users.xls");
jxl.Workbook rwb = Workbook.getWorkbook(is);
我们使用了 static (java.io.InputStream is) 来处理的!
看一下这些方法均是静态的方法。所以要注意使用的时候是静态调用!
jxl.Workbook 类的相关方法
1、 遍历一个工作簿里面的全部的工作表sheet
String[] sheetss =
rwb.getSheetNames(); //工作表的集合
for (String string : sheetss) {
System.out.println(string);
}
2、 得到sheet对象的方法
Sheet sheet = rwb.getSheet(1); //依据索引位置
Sheet sheets = rwb.getSheet("sheet"); //依据sheet表名称
//获取第一张Sheet表
Sheet rs = rwb.getSheet(0);
一旦得到了Sheet,我们就可以通过它来访问Excel Cell(术语:单元格).相当于我们现在获取到了一个数据表了现在就可以操作这个表里面的字段记录数据
Sheet rs = rwb.getSheet(0); //读取第一个sheet
Cell c00 = rs.getCell(0, 0);//第一个数据表里面的第一行第一列的元素值!
String strc00 =
c00.getContents();//获取元素内容值
System.out.println(strc00);
获取数据表的列名
Sheet rs = rwb.getSheet(0); //读取第一个sheet
int colNum=rs.getColumns();//列数
System.out.println(colNum);
示例代码1. 读取一个EXCEL表格里面的单元格内容
public static void main(String[] args) throws BiffException,
IOException,FileNotFoundException {
InputStream is = new FileInputStream("E:/users.xls");
jxl.Workbook rwb = Workbook.getWorkbook(is);
Sheet rs = rwb.getSheet(0); //读取第一个sheet
int colNum=rs.getColumns();//列数
int rowNum = rs.getRows();
for (int i = 0; i < rowNum; i++) {
for (int j = 0; j < colNum; j++) {
Cell c00 = rs.getCell(j,i);
System.out.print(c00.getContents() + " ");
}
System.out.println();
}
}
示例2. 依据所读取到的值动态判断其数据类型然后再赋值
Sheet rs = rwb.getSheet(0); //读取第一个sheet
int colNum=rs.getColumns();//列数
String strc00 = null;
int rowNum = rs.getRows();
for (int i = 0; i < rowNum; i++) {
for (int j = 0; j < colNum; j++) {
Cell c00 = rs.getCell(j,i);
if(c00.getType() == CellType.LABEL)
{
LabelCell labelc00 = (LabelCell)c00;
strc00 = labelc00.getString();
}
if(c00.getType() == CellType.NUMBER)
{
NumberCell numc10 = (NumberCell)c00;
strc00 = String.valueOf(numc10.getValue());
}
if(c00.getType() == CellType.DATE)
{
DateCell datec11 = (DateCell)c00;
strc00 = datec11.getDate().toString();
}
System.out.print(strc00+"
");
}
System.out.println();
}
说明:在读员工的时候是不需要的。而在读工资数据的时候是需要的!
说明:在读完之后要记得将其关闭掉:rwb.close();
二、分析一下sheet类的相关属性与方法
InputStream is = new FileInputStream("E:/users.xls");
jxl.Workbook rwb = Workbook.getWorkbook(is);
Sheet rs = rwb.getSheet(0); //读取第一个sheet
System.out.println(rs.getName());//获取这个工作表的名称getName()
Cell[] cell = rs.getRow(0); //返回第一行出来!
System.out.println(cell[0].getContents());
Cell getCell(int column, int row)
获取指定单元格的对象引用,需要注意的是它的两个参数,第一个是列数,第 二个是行数,这与通常的行、列组合有些不同。(原来如此!)
三、实战
3.1 生成新的EXCEL工作簿
try
{
//构建Workbook对象, 只读Workbook对象
//Method 1:创建可写入的Excel工作薄
jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile));
//Method 2:将WritableWorkbook直接写入到输出流
/*
OutputStream os = new FileOutputStream(targetfile);
jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(os);
*/
}
catch (Exception e)
{
e.printStackTrace();
}
API提供了两种方式来处理可写入的输出流,一种是直接生成本地文件,如果文件名不带全路径的话,缺省的文件会定位在当前目录,如 果文件名带有全路径的话,则生成的Excel文件则会定位在相应的目录;另外一种是将Excel对象直接写入到输出流,例如:用户通过浏览器来访问Web 服务器,如果HTTP头设置正确的话,浏览器自动调用客户端的Excel应用程序,来显示动态生成的Excel电子表格。
接下来就是要创建工作表,创建工作表的方法与创建工作薄的方法几乎一 样,同样是通过工厂模式方法获得相应的对象,该方法需要两个参数,一个是工作表的名称,另一个是工作表在工作薄中的位置,参考下面的代码片段:
// 创建Excel工作表
jxl.write.WritableSheet ws = wwb.createSheet("Test
Sheet 1", 0);
现在要做的只是实例化API所提供的Excel基本数据类型,并将它们 添加到工作表中就可以了,参考下面的代码片段:
//1.添加Label对象
jxl.write.Label labelC = new jxl.write.Label(0, 0,
"This is a Label cell");
ws.addCell(labelC);
// 添加带有字型Formatting的对象
jxl.write.WritableFont wf = new
jxl.write.WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
jxl.write.WritableCellFormat wcfF = new
jxl.write.WritableCellFormat(wf);
jxl.write.Label labelCF = new jxl.write.Label(1, 0,
"This is a Label Cell", wcfF);
ws.addCell(labelCF);
// 添加带有字体颜色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);
jxl.write.Label labelCFC = new jxl.write.Label(1, 0,
"This is a Label Cell", wcfFC);
ws.addCell(labelCF);
//2. 添加Number对象
jxl.write.Number labelN = new jxl.write.Number(0, 1,
3.1415926);
ws.addCell(labelN);
//添加带有formatting的Number对象
jxl.write.NumberFormat nf = new
jxl.write.NumberFormat("#.##");
jxl.write.WritableCellFormat wcfN = new
jxl.write.WritableCellFormat(nf);
jxl.write.Number labelNF = new jxl.write.Number(1, 1,
3.1415926, wcfN);
ws.addCell(labelNF);
//3. 添加Boolean对象
jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2,
false);
ws.addCell(labelB);
//4.添加DateTime对象
jxl.write.DateTime labelDT = new jxl.write.DateTime(0,
3, new java.util.Date());
ws.addCell(labelDT);
// 添加带有formatting的DateFormat对象
jxl.write.DateFormat df = new
jxl.write.DateFormat("dd MM yyyy hh:mm:ss");
jxl.write.WritableCellFormat wcfDF = new
jxl.write.WritableCellFormat(df);
jxl.write.DateTime labelDTF = new jxl.write.DateTime(1,
3, new java.util.Date(), wcfDF);
ws.addCell(labelDTF);
这里有两点大家要引起大家的注意。第一点,在构造单元格时,单元格在工作表中的位置就已经确定了。一旦创建后,单元格的位置是不能 够变更的,尽管单元格的内容是可以改变的。第二点,单元格的定位是按照下面这样的规律(column,
row),而且下标都是从0开始,例如,A1被存储在(0,
0),B1被存储在(1,
0)。
最后,不要忘记关闭打开的Excel
工作薄对象,以释放占用的内存,参见下面的代码片段:
//写入Exel工作表
wwb.write();
//关闭 Excel工作薄对象
wwb.close();
这可能与读取Excel文件的操作有少少不同,在关闭Excel对象之前, 你必须要先调用write()方法,因为先前的操作都是存储在缓存中的,所以要通过该方法将操作的内容保存在文件中。如果你先关闭了Excel对象,那么 只能得到一张空的工作薄了。
示例3.
实现将数据写入到EXCEL的代码如下
public static void main(String[] args) throws BiffException,
IOException,FileNotFoundException, RowsExceededException, WriteException {
jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File("F:\\a.xls"));
jxl.write.WritableSheet ws = wwb.createSheet("Test Sheet 1", 0);
jxl.write.Label labelC = new jxl.write.Label(0, 0, "This is a Label cell 第一行第一列");
ws.addCell(labelC);
jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
jxl.write.WritableCellFormat wcfF = new
jxl.write.WritableCellFormat(wf);
jxl.write.Label labelCF = new jxl.write.Label(1, 0, "This is a Label Cell 第二列", wcfF);
ws.addCell(labelCF);
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);
jxl.write.Label labelCFC = new jxl.write.Label(2, 0, "This is a Label Cell 第三列", wcfFC);
ws.addCell(labelCFC);
jxl.write.Number labelN = new jxl.write.Number(3,0, 3.1415926);
ws.addCell(labelN);
jxl.write.Boolean labelB = new jxl.write.Boolean(4, 0, false);
ws.addCell(labelB);
jxl.write.DateTime labelDT = new jxl.write.DateTime(5, 0, new java.util.Date());
ws.addCell(labelDT);
jxl.write.DateFormat df = new jxl.write.DateFormat("dd MM yyyy hh:mm:ss");
jxl.write.WritableCellFormat wcfDF = new
jxl.write.WritableCellFormat(df);
jxl.write.DateTime labelDTF = new jxl.write.DateTime(6, 0, new java.util.Date(),
wcfDF);
ws.addCell(labelDTF);
wwb.write();//写到XSL里面来
wwb.close();