-------------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列.