JXL解析Excel表格内容到数据库
java中常用的解析Excel表格的工具一种是POI一种是JXL,POI功能强大,相比JXL稍嫌复杂,对表格样式的处理非常好;而JXL解析简单方便,对中文支持比较好。
工作中解析Excel内容上传到数据库常用JXL,而从数据库导出数据到Excel常用POI
下面是一个JXL解析Excel的一个简单案例
1.添加jxl的架包
下载地址:jxl.zip
2.解析Excel表格内容到一个集合
1 /** 2 * 解析Excel表格 3 * @param ExcelURI 表格文件的路径 4 * @return 表格内容的集合 5 */ 6 public static List<List<String>> readExcel(String ExcelURI){ 7 //用于存放所有的行 8 List<List<String>> list=new ArrayList<List<String>>(); 9 Workbook book = null; 10 try { 11 // 读取现有的工作薄 12 book = Workbook.getWorkbook(new File(ExcelURI)); 13 // 获取工作薄中所有的表对象 14 Sheet[] sheets = book.getSheets(); 15 for (int i = 0; i < sheets.length; i++) { 16 //获取表当前表中的总行数 17 int rowSum=sheets[i].getRows(); 18 for (int j = 0; j < rowSum; j++) {//如果不想读取表格第一行就把j的初始值设置为1 19 //获取当前行所有单元格对象 20 Cell[] rowCells=sheets[i].getRow(j); 21 //用于存放当前行中所有的单元格内容 22 List<String> strs=new ArrayList<String>(); 23 for (int k = 0; k < rowCells.length; k++) {//如果不想读取表格第一列就把k的初始值设置为1 24 //获取当前单元格对象 25 CellType ct=rowCells[k].getType(); 26 String content=null; 27 if (ct.equals(CellType.DATE)) { 28 //日期 类型的处理 ,如果不处理的话,读取的时候表格中的2014-03-25 会读取成14-03-25 29 DateCell dc = (DateCell) rowCells[k]; 30 Date jxlDate = dc.getDate(); 31 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 32 sdf.setTimeZone(TimeZone.getTimeZone("GMT")); 33 content=sdf.format(jxlDate); 34 }else{ 35 //不是日期类型的一律当做字符串处理 36 content=rowCells[k].getContents(); 37 } 38 strs.add(content.trim()); 39 } 40 list.add(strs); 41 } 42 } 43 } catch (Exception e) { 44 e.printStackTrace(); 45 } finally { 46 book.close(); 47 } 48 return list; 49 }
3.批量插入集合数据到数据库
1 /** 2 * 批量插入集合数据到数据库 3 * @param sql 要执行的sql插入语句 4 * @param list Excel文件内容集合 5 * @return 插入是否成功 6 */ 7 public boolean insertBatch(String sql,List<List<String>> list) { 8 Connection conn=super.getConnection(); 9 PreparedStatement pstmt=null; 10 boolean mark=true; 11 try { 12 pstmt=conn.prepareStatement(sql); 13 // 关闭JDBC自动执行事务处理 14 conn.setAutoCommit(false); 15 // 一个list代表一行,每行中都有一个参数集合list 16 for (int i = 0; i < list.size(); i++) { 17 List<String> cells=list.get(i); 18 for (int j = 0; j <cells.size(); j++) { 19 pstmt.setString(j+1,cells.get(j)); 20 } 21 pstmt.addBatch(); 22 } 23 pstmt.executeBatch(); 24 //命令执行完了就手动提交事务 25 conn.commit(); 26 //清空此 Statement 对象的当前 SQL 命令列表。 27 pstmt.clearBatch(); 28 } catch (SQLException e) { 29 try { 30 conn.rollback(); 31 mark=false; 32 } catch (SQLException e1) { 33 e1.printStackTrace(); 34 } 35 }finally{ 36 super.closeAll(null, pstmt, conn); 37 } 38 return mark; 39 }
使用executeBatch能够大大提高插入的效率
注意点:1、注意解析表格的时候要明确表格的哪些行、哪些列是不需要放到集合中的
2、注意表格中单元格的内容长度和数据库中字段的长度是否相符,如果数据库中字段长度比较小会出现java.sql.DataTruncation: Data truncation异常
3、单个Excel表格中的内容不要太多,保持在5M以内
本文章出自:腾飞工作室 转载请注明出处