这几天对excel的操作感兴趣,目前java语言操作Excel文件技术有:JXL 、POI等。
Jxl(jExcelAPI) 是一个韩国人写的 java操作Excel的工具,功能相对于POI要弱一些,但是对中文有很好的支持,需要说明的是,jxl对图像和图表的处理有限,只支持PNGD的格式。
1、 创建Excel
// 写入数据到excel
public static void createExl(){
// 写入
try {
// 创建输出对象
WritableWorkbook book = Workbook.createWorkbook(new File("表格.xls"));
// 生成第一页
WritableSheet sheet = book.createSheet("第一页", 0);
// 第一行第一列设置值
// 设置字体
WritableFont font = new WritableFont(WritableFont.TIMES,16,WritableFont.BOLD);
WritableCellFormat format = new WritableCellFormat(font);
format.setAlignment(jxl.format.Alignment.CENTRE);// 水平对齐方式:居中
format.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);// 垂直对齐方式:居中
Label label = new Label(0,0,"第一行第一列",format);
sheet.addCell(label);
// 设置第二列第一行的值
// 数字定义格式
WritableCellFormat integerFormat = newWritableCellFormat(NumberFormats.INTEGER);
jxl.write.Number num = newjxl.write.Number(1,0,23.11480912903,integerFormat);
sheet.addCell(num);
// 设置第6列第一行的值
// 数字定义格式
WritableCellFormat floatFormat = newWritableCellFormat(NumberFormats.FLOAT);
jxl.write.Number num1 = newjxl.write.Number(5,0,23.11480912903,floatFormat);
sheet.addCell(num1);
// 设置第7列第一行的值
// 数字定义格式
NumberFormat myNumber = new NumberFormat("#.####");
WritableCellFormat numFormat = new WritableCellFormat(myNumber);
jxl.write.Number num2 = newjxl.write.Number(6,0,23.11480912903,numFormat);
sheet.addCell(num2);
// 设置第8列第一行的值
// 数字定义格式
NumberFormat numF = new NumberFormat("#.####");
WritableFont font2 = new WritableFont(WritableFont.TIMES,13,WritableFont.BOLD);
WritableCellFormat numFormat2 = newWritableCellFormat(font2,numF);
jxl.write.Number num3 = newjxl.write.Number(7,0,23.11480912903,numFormat2);
sheet.addCell(num3);
// 日期(1,1) 第二行第一列
Date now = Calendar.getInstance().getTime();
DateFormat curDateFormat = new DateFormat("yyyy-MM-dd hh:mm:ss");
WritableCellFormat dateFormat = newWritableCellFormat(curDateFormat);
DateTime curTime = new DateTime(0,1,now,dateFormat);
sheet.addCell(curTime);
// 日期(1,1)
Date date = new Date();
DateTime time = new DateTime(1,1,date);
sheet.addCell(time);
// boolean 第2行第3列
boolean flag = true;
Boolean bol = new Boolean(2,1,flag);
sheet.addCell(bol);
// 第一行第5列
Label labelNull = new Label(4,0,null);
sheet.addCell(labelNull);
// 合并单元格
//sheet.mergeCells(0,0, 3, 3);
// 设置行高
sheet.setRowView(0, 1000);
// 设置列宽
sheet.setColumnView(0, 30);
// 操作图片
File file = new File("C:\\temp\\ajccF08.png");
WritableImage image = new WritableImage(0,5,1,2,file);
sheet.addImage(image);
// 写入数据并且关闭
book.write();
book.close();
} catch (IOException e) {
e.printStackTrace();
} catch (RowsExceededException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
}
}
2、 读取Excel
// 从excel中读取数据
public static void readExl(){
// 读取
try {
String path = "表格.xls";
InputStream is = new FileInputStream(path);
// 打开文件对象
// Workbook book = Workbook.getWorkbook(new File("表格.xls"));
Workbook book = Workbook.getWorkbook(is);
// 电子表格的拷贝
WritableWorkbook newBook = Workbook.createWorkbook(new File("output.xls"),book);
newBook.write();
newBook.close();
// 获得第一个工作表对象
Sheet sheet = book.getSheet(0);
// 获取单元格
Cell cell = sheet.getCell(0, 0);
// 读取第一行第一列
System.out.println(cell.getContents());
// 读取第二列第一行
cell = sheet.getCell(1, 0);
System.out.println(cell.getContents());
// 第二行第二列
cell = sheet.getCell(1,1);
System.out.println(cell.getContents());
// 第一行三列
cell = sheet.getCell(2,1);
// 第一行四列
cell = sheet.getCell(3,1);
// 第一行第5列
cell = sheet.getCell(4,1);
// 关闭
book.close();
} catch (BiffException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
}
}
3、 判断类型
// 判断单元格数据类型
public static void judgeType(Cell cell){
CellType type = cell.getType();
// String
if(type == CellType.LABEL){
LabelCell lable = (LabelCell)cell;
System.out.println("cell 类型:String ("+lable.getString()+")");
}else if(type == CellType.DATE){// 日期
DateCell date = (DateCell)cell;
System.out.println("cell 类型:Date ("+date.getDate()+")");
}else if(type == CellType.NUMBER){ // 数字
NumberCell number = (NumberCell)cell;
System.out.println("cell 类型:Number ("+number.getValue()+")");
}else if(type == CellType.BOOLEAN){ // 布尔类型
BooleanCell lable = (BooleanCell)cell;
System.out.println("cell 类型:BOOL ("+lable.getValue()+")");
}else if(type == CellType.EMPTY){ // 空
System.out.println("cell 类型:空 (null)");
}else if(type == CellType.ERROR){ // 错误
Label lable = (Label)cell;
System.out.println("cell 类型:error ("+lable.getString()+")");
}
}
4、 设置字体
// 设置字体
WritableFont font = new WritableFont(WritableFont.TIMES,16,WritableFont.BOLD);
WritableCellFormat format = new WritableCellFormat(font);
format.setAlignment(jxl.format.Alignment.CENTRE);// 水平对齐方式:居中
format.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);// 垂直对齐方式:居中
Label label = new Label(0,0,"第一行第一列",format);
sheet.addCell(label);
5、 格式化
// 数字定义格式
WritableCellFormat integerFormat = newWritableCellFormat(NumberFormats.INTEGER);
jxl.write.Number num = new jxl.write.Number(1,0,23.11480912903,integerFormat);
sheet.addCell(num);
// 设置第6列第一行的值
// 数字定义格式
WritableCellFormat floatFormat = newWritableCellFormat(NumberFormats.FLOAT);
jxl.write.Number num1 = newjxl.write.Number(5,0,23.11480912903,floatFormat);
sheet.addCell(num1);
// 设置第7列第一行的值
// 数字定义格式
NumberFormat myNumber = new NumberFormat("#.####");
WritableCellFormat numFormat = new WritableCellFormat(myNumber);
jxl.write.Number num2 = newjxl.write.Number(6,0,23.11480912903,numFormat);
sheet.addCell(num2);
// 设置第8列第一行的值
// 数字定义格式
NumberFormat numF = new NumberFormat("#.####");
WritableFont font2 = new WritableFont(WritableFont.TIMES,13,WritableFont.BOLD);
WritableCellFormat numFormat2 = newWritableCellFormat(font2,numF);
jxl.write.Number num3 = newjxl.write.Number(7,0,23.11480912903,numFormat2);
sheet.addCell(num3);
// 日期第二行第一列
Date now = Calendar.getInstance().getTime();
DateFormat curDateFormat = new DateFormat("yyyy-MM-dd hh:mm:ss");
WritableCellFormat dateFormat = newWritableCellFormat(curDateFormat);
DateTime curTime = new DateTime(0,1,now,dateFormat);
sheet.addCell(curTime);
6、 插入图像
// 操作图片
File file = new File("C:\\temp\\ajccF08.png");
WritableImage image = new WritableImage(0,5,1,2,file);
sheet.addImage(image);
说明:WritableImage(x,y,width,height,source):width和height不是图片的宽高,而是图片要占据的单元格的个数。
7、 合并单元格
WritableSheet.mergeCells(intm,int n,int p,int q):从(m,n)到(p,q)的单元格全部合并;
注意:合并后的单元格不能再合并,同时合并后的数据为第一个单元的数据。
8、 设置行高、列高
WritableSheet.setRowView(intI,int height);作用是指定i+1行的高度;
WritableSheet.setColumnView(intI,int width):作用是指定第i+1列的宽度。