Excel动态创建Mysql数据库表,并将Excel中的数据插入到动态创建的Mysql表中

1.传入参数为表名,excel文件名和sheet名。

2.将excel中的空值以sql的null值存储到数据库。

3.根据sheet中的列数,动态创建数据库表名,数据库字段名为 name1,name2......

4.将excel中的值传入动态创建的表中。

第一步查询指定目标excel表格中的所有数据: 创建List<String>类型的返回返回方法,传入参数为excel文件名和sheet名,使用Workbook打开文件,需要添加poi依赖,使用Workbook可以打开excel的2003版本和2007版本,得到行数和列数,然后通过for循环,将excel中的每个单元格里面的内容添加到list里面。

public static List<String> getAllByExcel(String file, String sheet){
    List<String> list = new ArrayList<String>();
    DBhelper db = new DBhelper();
    try {
        Workbook rwb = Workbook.getWorkbook(new File(file));
        Sheet rs=rwb.getSheet(sheet);
        clos=rs.getColumns();//得到所有列
        int rows =rs.getRows();
        String str[] = new String[clos+1];
        for(int n=0;n<clos;n++){
            str[n]="name"+n;
        }
        for(int i=0;i<rows;i++){//i行数从第0行开始 j 列数
            for(int j=0;j<clos;j++){
                String arr[ ]=new String[clos+1];
                arr[j] =rs.getCell(j,i).getContents();
                System.out.println(str[j]+":"+arr[j]);  //字段名加数据内容
                list.add( arr[j]); //得到表中所有数据
            }
        }
        rwb.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return list;
}

第二步动态创建表:写一个创建表的方法,传参为表名,调用连接数据库方法,编写sql语句,使用sql拼接,for循环创建数据库表字段,循环次数为第二步得到的列数,用”name"+i 的形式,可以将字段命名为name1,name2....,编写时注意sql语言的规范性,要能拼接成完全能运行的sql语句,使用PrepareStatement 来执行sql语句。ps.executeUpdate(sql)。

String sql= null;
 try {
    sql = "create table if not exists "+tablename+" ";
    sql+="(";
    for(int i=1;i<=clos;i++){
        sql+="name"+i +" varchar(100)";//表字段
        if(i<clos){
            sql+=",";
        }
    }
    sql+=")DEFAULT CHARSET=utf8;";
    PreparedStatement ps=null;
    ps=db.conn.prepareStatement(sql);
    ps.executeUpdate(sql);
    ps.close();
} catch (Exception e) {
    System.out.println("建表失败"+e.getMessage());
}

第三步添加数据的mysql语句:编写insert方法,参数为表名,拼接sql语句,insert into tablename(name1,name2...)values(NULLIF(?,''),...),因为要将空值转为null值,需要使用NULLIF将空值转为数据库中的(null)。

try {
    sql="insert into "+tablename+"(";
    for(int i=1;i<=clos;i++){
        sql+="name"+i;
        if(i<clos){
            sql+=",";
        }
    }
    sql+=")values(";
    for(int i=1;i<=clos;i++){
        sql+="NULLIF(?,'')";
        if(i<clos){
            sql+=",";
        }
    }
    sql+=");";
    db.conn.close();
} catch (Exception e) {
    e.printStackTrace();
}

第四步将list中的数据和sql语句合并,实现数据插入到mysql中,循环list,执行插入的sql语句,在循环插入每一条数据,循环条数为excel中的列数,使用ps.setString(j+1,list.get(i++)),j为一条记录的第几列,i为list中的第i个值。

List<String> listExcel=ExcelService.getAllByExcel("D://xx.xlsx","Sheet1");//读excel表中的数据
ExcelService.CreateTable(tableName);//创建数据库表
String sql=ExcelService.insert(tableName);
for(int i=0;i<listExcel.size();){
    PreparedStatement ps=null;
    try {
        ps=db.conn.prepareStatement(sql);
        if(listExcel!=null){
            for(int j=0;j<ExcelService.clos;j++){
                ps.setString(j+1,listExcel.get(i++));
            }
        }
        ps.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
发布了36 篇原创文章 · 获赞 19 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_27182767/article/details/84348258