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以内

本文章出自:腾飞工作室 转载请注明出处

posted on 2014-03-25 15:51  腾飞工作室  阅读(1052)  评论(0编辑  收藏  举报