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();
}
}