java实现对Excel文件的存取

[quote="javaeye"][size=small] 经过了一个下午的研究终于把java实现对Excel文件的存取有了一定的了解,现在发表出来,给大家参看参考,共同学习下,还请高手们指点指点。O(∩_∩)O。
注:试验用的Excel文件大家可以下下载。
[/size][/quote]


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;

import jxl.Cell;
import jxl.CellType;
import jxl.DateCell;
import jxl.LabelCell;
import jxl.NumberCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.UnderlineStyle;
import jxl.write.Boolean;
import jxl.write.DateFormat;
import jxl.write.DateTime;
import jxl.write.Label;
import jxl.write.Number;
import jxl.write.NumberFormat;
import jxl.write.WritableCell;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

/**
* 我想大家作为微软的忠实使用者,不用excel是那是不太可能的,但是要用java操作
*
* excel表格,使用jdk自己的东西可能是不太可能的,因为我们水平可能还不够高吧。
*
* 本类是用来操作excel表的,包含读取excel表,创建excel表 和 更新 excel表。
*
* 要操作excel表,开源社区里好像有很多包,这里是用的是jxl包,这个是第三方的包,
*
* 在开源社区里面有下,大家也可以到他们的官网上下载最新版的jxl.jar包,地址是:
*
* http://sourceforge.net/project/showfiles.php?group_id=79926
*
* @author LoongHua
*
*/

public class JxlDemo {

private final static String filePath="d:/test.xls";

/**
*
* 下面是要读取excel文件。
*
*/
public static void readExcel() {

File file=null;//声明一个文件对象。
InputStream is=null;//声明一个输入流。
Workbook rwb=null;//声明一个工作簿。
Sheet sht=null;//声明一个工作表。

try {
file=new File(filePath);


// 读取文件时,应该先判断文件是否存在,要养成好习惯。
if(!file.exists()){
System.out.println("需要读入的excel文件不存在!");
return ;//之间推出函数。
}

// 两种得到workbook对象的方法:一是通过流的方式,二是通过得到文件的方式。
// 在得到工作簿的时候,要调用他们的工厂方法,不能之间用构造函数,要注意哦。
// rwb = Workbook.getWorkbook(is);
// is = new FileInputStream(file);

rwb = Workbook.getWorkbook(file);

//得到一个工作簿,有两种方式:一是通过工作表的索引,二是通过工作表的表明。
sht = rwb.getSheet("人员工资");
// sht=rwb.getSheet(0);

Cell cell=null;//声明一个单元格。

String str = null;//字符串类型。
double num = 0.00;//双精度型。
Date date = null;//日期型。

//得到列数。
int cols=sht.getColumns();
//得到行数。
int rows=sht.getRows();

for (int i = 0; i < cols; i++) {

for (int j = 0; j < rows; j++) {

// 根据列行坐标得到单元格对象。
// 在getCell函数中,第一个参数是列号:从0开始;第二个是行号:从0开始。
// 也可以通过单元格的名字得到单元格对象:Cell c11=sht.getCell("cellname");
cell=sht.getCell(i,j);

//判断单元格内容的类型是否为标签型:对应java的String型。
if (cell.getType() == CellType.LABEL) {
//把单元格强转成标签型单元格。
LabelCell label = (LabelCell) cell;
//得到单元格的内容。
str = label.getString();

System.out.println("Cell("+i+", "+j+")" + " value : " + str+ "; type : " + cell.getType());
}
//判断单元格内容的类型是否为数字型:对应java的int等类型。
if (cell.getType() == CellType.NUMBER) {
//把单元格强转成标数字型单元格。
NumberCell numc = (NumberCell) cell;
//得到单元格的数值。
num = numc.getValue();

System.out.println("Cell("+i+", "+j+")" + " value : " + num+ "; type : " + cell.getType());

}
//判断单元格内容的类型是否为日期型:对应java的Date等类型。
if (cell.getType() == CellType.DATE) {
//把单元格强转成标日期型单元格。
DateCell datec = (DateCell) cell;
//得到单元格的日期。
date = datec.getDate();

System.out.println("Cell("+i+", "+j+")" + " value : " + date+ "; type : " + cell.getType());

}

}
}

//得到一列中所有的单元格。
Cell[] colcells=sht.getColumn(1);

for (int i = 0; i < colcells.length; i++) {
//之间用单元对象得到其内容。
System.out.println(colcells[i].getContents());
}

//得到一行中所有的单元格。
Cell[] rowcells=sht.getRow(1);

for (int i = 0; i < rowcells.length; i++) {
//之间用单元对象得到其内容。
System.out.println(rowcells[i].getContents());
}

} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
//关闭工作簿,这个是非常重要的,如果不进行这部,很容易把excel文件破坏。

//如果是很重要的文件,你的麻烦就大了。关闭语句最好是写在finnally语句块中。
rwb.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}

/**
*
* 下面是要创建excel文件。
*
*/
public static void createExcel(){

WritableWorkbook ww=null;
WritableSheet ws=null;

try {
String filepath="d:test1.xls";
File file=new File(filepath);

if(file.exists()){
System.out.println("该文件不存在,将由WritableWorkbook对象来创建。");
}

//创建excel文件时,只能用WritableWorkbook类,不能用Workbook,它只能读excel文件。
//创建WritableWorkbook对象要使用Workbook的工厂方法,不能用构造方法,这方法是受保护的。
ww=Workbook.createWorkbook(file);

//创建可写的工作表对象。以下是创建“公司部门”表。方法需要两个参数,一个是工作表的名称,另一个是工作表在工作薄中的位置,
ws=ww.createSheet("公司部门", 0);


//1.添加Label对象
Label labelC = new Label(0, 0, "This is a Label cell");
ws.addCell(labelC);

//添加带有字型Formatting的对象
WritableFont wf = new WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
WritableCellFormat wcfF = new WritableCellFormat(wf);
Label labelCF = new Label(1, 0, "This is a Label Cell", wcfF);
ws.addCell(labelCF);

//添加带有字体颜色Formatting的对象
WritableFont wfc = new WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,
UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED);
WritableCellFormat wcfFC = new WritableCellFormat(wfc);
Label labelCFC = new Label(1, 0, "This is a Label Cell", wcfFC);
ws.addCell(labelCFC);

//2.添加Number对象
Number labelN = new Number(0, 1, 3.1415926);
ws.addCell(labelN);

//添加带有formatting的Number对象
NumberFormat nf = new NumberFormat("#.##");
WritableCellFormat wcfN = new WritableCellFormat(nf);
Number labelNF = new Number(1, 1, 3.1415926, wcfN);
ws.addCell(labelNF);

//3.添加Boolean对象
Boolean labelB = new Boolean(0, 2, false);
ws.addCell(labelB);

//4.添加DateTime对象
DateTime labelDT = new DateTime(0, 3, new java.util.Date());
ws.addCell(labelDT);

//添加带有formatting的DateFormat对象
DateFormat df = new DateFormat("dd MM yyyy hh:mm:ss");
WritableCellFormat wcfDF = new WritableCellFormat(df);
DateTime labelDTF = new DateTime(1, 3, new java.util.Date(), wcfDF);
ws.addCell(labelDTF);

} catch (Exception e) {
System.out.println(e.getMessage());
}
finally{
try {
if(ww!=null){
ww.write();
ww.close();
}
} catch (Exception e) {
System.out.println(e.toString());
}
}

}

/**
*
* 下面是要更新一个数字型单元格,更新一个标签的单元格。
*
*/
public static void updateExcle(){

File file=null;
OutputStream os=null;
Workbook rwb=null;
WritableWorkbook ww=null;
WritableSheet ws=null;

try {

file=new File(filePath);

if (!file.exists()){
System.out.println("需要被更新的文件不存在,程序终止运行!");
return ;
}

//下面三行放在一起是有原因的,我们使用jlx包来操作excel文件,就必须要这样做。
//先把该文件读到内存,然后再覆盖的方式,这样就更新了该excel文件。必须记住哦。

rwb=Workbook.getWorkbook(file);
os=new FileOutputStream(file);
ww=Workbook.createWorkbook(os, rwb);

ws=ww.getSheet("人员工资");//得到要更新的工作簿的工作表。


//这里是更新数字型的单元格。
//得到需要更新的单元格,这里都必须是可写的。
WritableCell wc=ws.getWritableCell(1, 2);

//注意以下if..else..里面写法不同,实现的功能也不同哦。
//第一个是向空单元格中加入内容,字体等样式是jlx包默认的。
//第二个是向有内容的单元格中更新内容,字体样式和之前的一样。
if(wc.getType()==CellType.EMPTY){
Number num=new Number(1,2,5000);
ws.addCell(num);
}
else{
if(wc.getType()==CellType.NUMBER){
Number num=(Number)wc;
num.setValue(5000);
System.out.println("修改数字型的单元格成功!");
}
}


//这里是更新标签型的单元格。
WritableCell wc1=ws.getWritableCell(0, 3);

//注意以下if..else..里面写法不同,实现的功能也不同哦。
//第一个是向空单元格中加入内容,字体等样式是jlx包默认的。
//第二个是向有内容的单元格中更新内容,字体样式和之前的一样。
if(wc1.getType()==CellType.EMPTY){
Label lab=new Label(0,3,"合计");
ws.addCell(lab);
System.out.println("添加标签型的单元格成功!");
}
else{
if(wc1.getType()==CellType.LABEL){
Label lab=(Label)wc1;
lab.setString("合计");
System.out.println("修改标签型的单元格成功!");
}
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
if(ww!=null){
ww.write();
ww.close();
}
if(rwb!=null){
rwb.close();
}
} catch (Exception e) {
System.out.println(e.toString());
}
}
}

public static void main(String[] args) {
// 以下三个方法一个一个执行,观察下效果更好些。
readExcel();
// createExcel();
// updateExcle();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值