-------------jxl和POI的区别(来自网络,感谢)-----
jxl优点:
①Jxl对中文支持非常好,操作简单,方法看名知意。
②Jxl是纯javaAPI,在跨平台上表现的非常完美
③生成Excel 2000标准格式
④支持字体、数字、日期操作
⑤能够修饰单元格属性
④支持图像和图表,但是这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。
缺点:效率低,图片支持不完善,对格式的支持不如POI强大
POI优点:
①效率高,效率测试,可参考:http://blog.csdn.net/jarvis_java/article/details/4924099
②支持公式,宏,一些企业应用上会非常实用
③能够修饰单元格属性
④支持字体、数字、日期操作
缺点:不成熟,bug较多
用于项目,主要是读取少量数据的导入和导出,需要稳定性,则选择jxl
pom.xml
<!-- execel -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.13</version>
</dependency>
<dependency>
<groupId>net.sourceforge.jexcelapi</groupId>
<artifactId>jxl</artifactId>
<version>2.6.12</version>
</dependency>
操作代码如下:
package my.demo.java.z.file;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import jxl.Cell;
import jxl.CellType;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.VerticalAlignment;
import jxl.read.biff.BiffException;
import jxl.write.Boolean;
import jxl.write.Label;
import jxl.write.Number;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Binary Interchange File Format:Biff 二进制文件交换格式
* @desc 导入读取和导出写入
*
* */
public class RWExcelFile_jxl {
//log
private static final Logger LOG = LoggerFactory.getLogger(ExcelFile_jxl.class);
/**
* 读取excel工作簿信息.<br>
* @param book Excel工作簿
* */
public void readExcel(Workbook book){
try {
//获取excel下的sheet页总个数
int maxSheet = book.getNumberOfSheets();
LOG.info("Excel工作簿的sheet页总数:" + maxSheet + "页.");
//获取各个excel,可以控制需要导入那个页
for(int sheeti = 0; sheeti < maxSheet; sheeti++){
LOG.info("第" + (sheeti + 1) + "页读取开始……");
//获取sheet页
Sheet sheet = book.getSheet(sheeti);
//通过名称获取sheet页
// Sheet sheet = book.getSheet("sheet3");
//获取sheet的名称
String sheetName = sheet.getName();
LOG.info("第" + (sheeti + 1) + "页名称:" + sheetName + ".");
//当前sheet实际行总数
int realRows = sheet.getRows();
LOG.info("第" + (sheeti + 1) + "页实际行总数:" + realRows + "行.");
//当前sheet实际列总数
int realColumns = sheet.getColumns();
LOG.info("第" + (sheeti + 1) + "页实际列总数:" + realColumns + "列.");
//遍历每行每列的单元格 --类似二位数组定位excel单元格读取
//行
for(int row = 0; row < realRows; row++){
//列
for(int column = 0; column < realColumns; column++){
//定位的单元格
Cell cell = sheet.getCell(column, row);
//获取单元格类型
CellType type = cell.getType();
//获取单元格内容 -- 注:数据验证格式/纯数字需对科学计数法转换
String content = cell.getContents();
LOG.info("单元格[第" + (sheeti + 1) + "页-第" + (row + 1) + "行-第" + (column + 1) + "列(类型:" + type + ")]:" + content);
}
}
//释放资源
sheet = null;
}
} catch (IndexOutOfBoundsException e) {
LOG.info("读取excel工作簿信息数组下标越界:" + e.getMessage(), e);
}finally{
//释放资源
book.close();
}
}
/**
* 写入数据导出excel工作簿 -- 数据格式化
* */
public void writeExcel(){
WritableWorkbook book = null;
try {
//不加路径,导出在项目根目录
String excelName = "writeExcel.xls";
File excel = new File(excelName);
book = Workbook.createWorkbook(excel);
//参数一:名称,写入名为"batchexport"sheet页,参数二:0表示这是第一页
WritableSheet sheet = book.createSheet("batchexport", 0);
//行高和列宽
//将第一行的高度设为320
sheet.setRowView(0 , 320);
//将第4列的宽度设为30
sheet.setColumnView(3 , 300);
sheet.setColumnView(1 , 30);
//构造Label对象,并指定单元格位置是第一列第一行(0,0)--(列,行)
Label str1 = new Label(0, 0, "卡卡");
//将定义好的str1添加到工作表中
sheet.addCell(str1);
Number num1 = new Number(1, 0, 17400005555.889d);
sheet.addCell(num1);
Boolean bool1 = new Boolean(2, 0, true);
sheet.addCell(bool1);
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(System.currentTimeMillis());
//---字串格式化
//WritableFont不同情况下有非常丰富的构造方法,jExcelAPI的java-doc中有详细介绍,也可搜索.
//字串格式:字体为TIMES,字号16,加粗显示 --WritableFont.createFont("宋体")
WritableFont font1 = new WritableFont(WritableFont.TIMES, 16, WritableFont.BOLD);
//WritableCellFormat类,通过它可以指定单元格的各种属性,单元格格式化
WritableCellFormat format1 = new WritableCellFormat(font1);
//定数据的对齐方式
//水平对齐方式指定为居中
format1.setAlignment(Alignment.CENTRE);
format1.setVerticalAlignment(VerticalAlignment.CENTRE);
//垂直对齐方式指定为居中
//字串被赋予format1格式
Label date = new Label(3, 0, "时间:" +time,format1);
sheet.addCell(date);
//合并第一列,第二行到第六列,第一行的所有单元格
sheet.mergeCells(0 , 1, 5, 1);
//写入数据到工作簿
book.write();
LOG.info(excelName + "写入文件导出成功.");
} catch (RowsExceededException e) {
LOG.info("写入Excel工作簿内容行超过异常:" + e.getMessage(), e);
} catch (WriteException e) {
LOG.info("写入Excel工作簿内容写入异常:" + e.getMessage(), e);
} catch (IOException e) {
LOG.info("写入Excel工作簿内容输入输出流异常:" + e.getMessage(), e);
}finally{
try {
//关闭文件
book.close();
} catch (WriteException e) {
LOG.info("写入Excel工作簿内容写入异常:" + e.getMessage(), e);
} catch (IOException e) {
LOG.info("写入Excel工作簿内容输入输出流异常:" + e.getMessage(), e);
}
}
}
/**
* 修改数据导出excel工作簿
* */
public void editExcel(){
String excelName = "writeExcel.xls";
Workbook orgBook = null;
WritableWorkbook reBook = null;
try {
File orgExcel = new File(excelName);
File reExcel = new File(excelName);
//获得excel文件
orgBook = Workbook.getWorkbook(orgExcel);
//打开一个excel文件的副本,并且指定数据写回到原文件
reBook = Workbook.createWorkbook(reExcel, orgBook);
//添加一个工作页
WritableSheet sheet = reBook.createSheet("editSheet", 1);
sheet.addCell(new Label(0, 0, "编辑excel文件测试数据"));
reBook.write();
LOG.info(excelName + "编辑文件导出成功.");
} catch (RowsExceededException e) {
LOG.info("编辑Excel工作簿内容异常:" + e.getMessage(), e);
} catch (BiffException e) {
LOG.info("编辑Excel工作簿内容异常:" + e.getMessage(), e);
} catch (WriteException e) {
LOG.info("编辑Excel工作簿内容异常:" + e.getMessage(), e);
} catch (IOException e) {
LOG.info("编辑Excel工作簿内容异常:" + e.getMessage(), e);
}finally{
try {
reBook.close();
orgBook.close();
} catch (WriteException e) {
LOG.info("编辑Excel工作簿内容写入异常:" + e.getMessage(), e);
} catch (IOException e) {
LOG.info("编辑Excel工作簿内容输入输出流异常:" + e.getMessage(), e);
}
}
}
/**
* 文件形式.<br>
* 操作Excel工作簿.<br>
* @param file Excel文件
* */
public void readExcelOfFile(File file){
Workbook book = null;
try {
book = Workbook.getWorkbook(file);
readExcel(book);
} catch (BiffException e) {
LOG.info("读取Excel工作簿文件二进制文件交换格式异常:" + e.getMessage(), e);
} catch (IOException e) {
LOG.info("读取Excel工作簿文件输入输出流异常:" + e.getMessage(), e);
}
}
/**
* 输入流形式.<br>
* 操作Excel工作簿.<br>
* @param is Excel输入流,比如上传
* @throws IOException
* */
public void readExcelOfInputStream(InputStream is) throws IOException{
Workbook book = null;
try {
book = Workbook.getWorkbook(is);
readExcel(book);
} catch (BiffException e) {
LOG.info("读取Excel工作簿文件二进制文件交换格式异常:" + e.getMessage(), e);
} catch (IOException e) {
LOG.info("读取Excel工作簿文件输入输出流异常:" + e.getMessage(), e);
}finally{
is.close();
}
}
//测试
public static void main(String[] args) {
RWExcelFile_jxl jxlrw1 = new RWExcelFile_jxl();
//读取
//单元格格式--此处都为"文本"
String excelPath = "D:/RWExcelFile_jxl.xls";
File excel = new File(excelPath);
jxlrw1.readExcelOfFile(excel);
//导出
jxlrw1.writeExcel();
//编辑
jxlrw1.editExcel();
}
}
测试结果:
第一次导出:
编辑:
底部:
读取:
底部:
读取结果:
15:58:47.810 [main] INFO my.demo.java.z.file.ExcelFile_jxl - Excel工作簿的sheet页总数:5页.
15:58:47.813 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 第1页读取开始……
15:58:47.870 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 第1页名称:批量注册.
15:58:47.870 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 第1页实际行总数:10行.
15:58:47.871 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 第1页实际列总数:5列.
15:58:47.871 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第1行-第1列(类型:Label)]:姓名
15:58:47.871 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第1行-第2列(类型:Label)]:手机号
15:58:47.872 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第1行-第3列(类型:Label)]:执证号
15:58:47.872 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第1行-第4列(类型:Empty)]:
15:58:47.872 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第1行-第5列(类型:Empty)]:
15:58:47.872 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第2行-第1列(类型:Label)]:本兮
15:58:47.872 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第2行-第2列(类型:Number)]:15500005550
15:58:47.873 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第2行-第3列(类型:Number)]:44556600000
15:58:47.873 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第2行-第4列(类型:Empty)]:
15:58:47.873 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第2行-第5列(类型:Empty)]:
15:58:47.873 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第3行-第1列(类型:Label)]:童可可
15:58:47.873 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第3行-第2列(类型:Number)]:15500005551
15:58:47.873 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第3行-第3列(类型:Number)]:44556600001
15:58:47.873 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第3行-第4列(类型:Empty)]:
15:58:47.873 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第3行-第5列(类型:Empty)]:
15:58:47.873 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第4行-第1列(类型:Empty)]:
15:58:47.874 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第4行-第2列(类型:Empty)]:
15:58:47.874 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第4行-第3列(类型:Empty)]:
15:58:47.874 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第4行-第4列(类型:Empty)]:
15:58:47.874 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第4行-第5列(类型:Empty)]:
15:58:47.874 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第5行-第1列(类型:Empty)]:
15:58:47.874 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第5行-第2列(类型:Label)]:true
15:58:47.874 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第5行-第3列(类型:Label)]:2015-12-31 09:50:55
15:58:47.874 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第5行-第4列(类型:Empty)]:
15:58:47.874 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第5行-第5列(类型:Empty)]:
15:58:47.874 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第6行-第1列(类型:Empty)]:
15:58:47.875 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第6行-第2列(类型:Empty)]:
15:58:47.875 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第6行-第3列(类型:Empty)]:
15:58:47.875 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第6行-第4列(类型:Empty)]:
15:58:47.875 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第6行-第5列(类型:Label)]:测试总列数
15:58:47.875 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第7行-第1列(类型:Label)]:@#$%^&*B11
15:58:47.875 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第7行-第2列(类型:Label)]:AAAAaaaa
15:58:47.875 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第7行-第3列(类型:Empty)]:
15:58:47.875 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第7行-第4列(类型:Empty)]:
15:58:47.875 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第7行-第5列(类型:Empty)]:
15:58:47.876 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第8行-第1列(类型:Empty)]:
15:58:47.876 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第8行-第2列(类型:Empty)]:
15:58:47.876 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第8行-第3列(类型:Empty)]:
15:58:47.876 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第8行-第4列(类型:Empty)]:
15:58:47.876 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第8行-第5列(类型:Empty)]:
15:58:47.876 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第9行-第1列(类型:Empty)]:
15:58:47.876 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第9行-第2列(类型:Empty)]:
15:58:47.876 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第9行-第3列(类型:Empty)]:
15:58:47.876 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第9行-第4列(类型:Empty)]:
15:58:47.877 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第9行-第5列(类型:Empty)]:
15:58:47.877 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第10行-第1列(类型:Empty)]:
15:58:47.877 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第10行-第2列(类型:Empty)]:
15:58:47.877 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第10行-第3列(类型:Label)]:测试总行数
15:58:47.877 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第10行-第4列(类型:Empty)]:
15:58:47.877 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 单元格[第1页-第10行-第5列(类型:Empty)]:
15:58:47.877 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 第2页读取开始……
15:58:47.935 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 第2页名称:Sheet1.
15:58:47.935 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 第2页实际行总数:0行.
15:58:47.935 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 第2页实际列总数:0列.
15:58:47.935 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 第3页读取开始……
15:58:47.980 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 第3页名称:Sheet2.
15:58:47.980 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 第3页实际行总数:0行.
15:58:47.980 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 第3页实际列总数:0列.
15:58:47.980 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 第4页读取开始……
15:58:48.017 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 第4页名称:Sheet3.
15:58:48.017 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 第4页实际行总数:0行.
15:58:48.017 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 第4页实际列总数:0列.
15:58:48.017 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 第5页读取开始……
15:58:48.057 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 第5页名称:Sheet4.
15:58:48.057 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 第5页实际行总数:0行.
15:58:48.057 [main] INFO my.demo.java.z.file.ExcelFile_jxl - 第5页实际列总数:0列.