zoukankan      html  css  js  c++  java
  • 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以内

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

  • 相关阅读:
    巧用$.extend
    easyui 表格中combo选择值后显示为valueField而非textField的解决
    jeasyui 造成$.data(...) is undefined报错的原因及解决
    无线路由器+摩托罗拉手机WIFI=能连接,但不能上网
    javascript 复制粘贴功能 各种浏览器兼容
    WriteLiteral与Write的区别
    打印机队列取消不了的解决方法
    js判断字符串长度,中文占两个字符
    针对chrome的css hack
    JS生成26个英文字母
  • 原文地址:https://www.cnblogs.com/tfgzs/p/3623327.html
Copyright © 2011-2022 走看看