版权声明:可以转载奥 https://blog.csdn.net/Jiajikang_jjk/article/details/82561433
Excel数据导入到mysql数据库
一 技术说明
1:Excel版本为2007版
2:使用的是poi进行解析
3: MySQL版本5.7.17
二 准备工作
1:文件获取
链接:https://pan.baidu.com/s/1WQHiQIkGSwJIL8-TZTTC1w 密码:hbih
链接:https://pan.baidu.com/s/11iE0A7JtUTm1CaFathDvdQ 密码:z8gz
链接:https://pan.baidu.com/s/1CAJi_XnuKL6Z7rpaQiix3g 密码:x91s
2:poi解析相关说明
HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls
XSSFWorkbook:是操作Excel2007的版本,扩展名是.xlsx
HWPF-提供读写Microsoft Word DOC格式档案的功能.
HSLF- 供读写Microsoft PowerPoint格式档案的功能。
HDGF-提供读Microsoft Visio格式档案的功能。
HPBF-提供读Microsoft Publisher格式档案的功能。
三 思路分析
1:第一步
添加点击按钮,这里添加按钮是实现qjl_list.jsp的主页面中跳转到上传文件到服务器中的功能页面
2:第二步
创建excel表结构以及创建相应数据库表单
1:excel表结构(模板)
2:对应的数据库
3:第三步
解析excel文件,在第二步已经将excel模板创建好,现在根据自己创建的模板开始进行解析excel表中内容。
解析相关代码如下所示:
// 开始解析
// 获取文件输入流
FileInputStream ExcelFileToRead = new FileInputStream(in_filedir);//读取指定位置中的文件,就是刚才保存在指定文件夹中的上传文件
System.out.println("\n文件位置:"+ExcelFileToRead);
XSSFSheet excel_Sheet=null; //工作簿对象
XSSFRow excel_Row=null; //行对象
XSSFCell excel_Cell=null; //单元格对象
// 获取读取的实例
XSSFWorkbook workbook = new XSSFWorkbook(ExcelFileToRead);//读取指定文件夹下的excel文件(//工作簿对象)
XSSFSheet xssfSheet = workbook.getSheet("Sheet1"); //获得了Workbook对象之后,就可以通过它得到Sheet(工作表)对象了
int i1=xssfSheet.getLastRowNum();//读取到一共的行数
System.out.println("\n一共 " + i1 + " 行");
if(3>=i1)
{
// 有效行数可变长
// 最少3行以上,标准为:行0是器件说明行,行1是各个字段名,行3:数据行从行3开始(倒数最后一行为统计行,以上行为连续行,中间没有空行,也没有空列)
// 即数据区不包括行0、1、2、最后一行。
throw new Exception("『back::_self』上载的EXCEL表格【"+in_filename+"】中监测数据填报区域数据格式错误!");
}
excel_Sheet=workbook.getSheetAt(0); //读取下标为0的表
if(null==excel_Sheet)
{
System.out.println("工作表0【默认名为 Sheet1 】为空"); //使用工作表之前要检查行对象是否为null,否则会报空指针异常
throw new Exception("『back::_self』错误:工作表为空!");
}
// err_code="0x01_B";
excel_Row=excel_Sheet.getRow(0);
excel_Cell=excel_Row.getCell((short)0);
System.out.println("第一个单元是:" + excel_Cell.getStringCellValue());// 主键
// 测试
System.out.println("\n注意1:行没有内容即为空,但被合并的没有内容的行如果合并后合并单元格有内容,则此无内容的被合并的行不为空而是为空字符串");
System.out.println("\n注意2:单元格没有内容即为空,但被合并的没有内容的单元格如果合并后合并单元格有内容,则此无内容的被合并的单元格不为空而是为空字符串");
System.out.println("\n工作表有效的开始行号="+excel_Sheet.getFirstRowNum());
System.out.println("\n工作表有效的结束行号="+excel_Sheet.getLastRowNum());
System.out.println("\n工作表有效物理行数="+excel_Sheet.getPhysicalNumberOfRows()); //注意此有效物理行数不一定是连续的行
// 遍历行和列(从获取的遍历)i2=excel_Sheet.getFirstRowNum();
// =excel_Sheet.getLastRowNum(); //最后一行的行号(行号从0开始编)
// 创建集合---将值存入到集合中以此来插入
String[] All = new String[13]; // 一共13个单元格
int i = xssfSheet.getLastRowNum();//总共的行数
XSSFCell f0,f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12 = null; // 初始化单元格
String[] F0 = new String[i];// id
String[] F1 = new String[i];// 器件类名称
String[] F2 = new String[i];// 产品序列号
String[] F3 = new String[i];// 规格型号
String[] F4 = new String[i];// 功能描述
String[] F5 = new String[i];// 参考寿命
String[] F6 = new String[i];// 实物图片存放位置
String[] F7 = new String[i];// 器件类型
String[] F8 = new String[i];// 器件属性
String[] F9 = new String[i];// 生产厂家
String[] F10 = new String[i];// 购买时间
String[] F11 = new String[i];// 购买价格
String[] F12 = new String[i];// 备注
// 遍历总的行数:从有效行(数据行开始遍历)
for (int j = 2;j<=i;j++)
{
XSSFRow row = xssfSheet.getRow(j);
if (row == null){break;}
// 获取单元格中的数据(对应单元格中的所以行数中的数据)
f0 = row.getCell(0);
f1 = row.getCell(1);
f2 = row.getCell(2);
f3 = row.getCell(3);
f4 = row.getCell(4);
f5 = row.getCell(5);
f6 = row.getCell(6);
f7 = row.getCell(7);
f8 = row.getCell(8);
f9 = row.getCell(9);
f10 = row.getCell(10);
f11 = row.getCell(11);
f12 = row.getCell(12);
System.out.println("f0="+f0);
// 进行强制转变
F0[j-2]=f0.toString();
F1[j-2]=f1.toString();
F2[j-2]=f2.toString();
F3[j-2]=f3.toString();
F4[j-2]=f4.toString();
F5[j-2]=f5.toString();
F6[j-2]=f6.toString();
F7[j-2]=f7.toString();
F8[j-2]=f8.toString();
F9[j-2]=f9.toString();
F10[j-2]=f10.toString();
F11[j-2]=f11.toString();
F12[j-2]=f12.toString();
}
// 测试--------------------这里只是针对获得单元格对于的数据进行一个检测
// 遍历单元格对应集合的数据
for(int x = 0 ;x<=F0.length-2;x++){
System.out.println("测试第一列F0:"+F0[x]);
}
//workbook.close();
4:第四步
解析完excel表数据之后,就开始连接数据库进行插入excel表中的数据到表单中。
连接数据库相关代码:
//连接数据库并写入数据
boolean ok=false; //成功操作则此标志转为true
Connection my_con=null;
try
{
String my_dbdriver=com_station_datebase_driver; //MYSQL 5.0 用的JDBC驱动
String my_url=com_station_datebase_url; //MYSQL数据库名为dqz_mysql_test
String my_username=com_station_datebase_user; //数据库管理用户
String my_password=com_station_datebase_password; //数据库管理密码
Class.forName(my_dbdriver); //装载驱动程序
my_con=DriverManager.getConnection(my_url,my_username,my_password); //连接数据库
Statement my_stmt=my_con.createStatement();//建立远程视图
//err_code="0x01_C";//成功执行到获取了远程视图
// 遍历id单元格
for(int x=0;x<F0.length;x++)
{
// 这里虽然获取了id的集合,但是没有插入,因为数据库中id是自增的所以无需插入:order by id asc
String sql="INSERT INTO excel1_list (name,xlh,xh,gnms,cksm,swtp,qjlx,qjsx,sccj,gmsj,gmjg,bz)" ;
sql+="values('"+F1[x]+"','"+F2[x]+"','"+F3[x]+"','"+F4[x]+"','"+F5[x]+"','"+F6[x]+"','"+F7[x]+"','"+F8[x]+"','"+F9[x]+"','"+F10[x]+"','"+F11[x]+"','"+F12[x]+"')";
my_stmt.execute(sql);
//my_stmt.executeUpdate(sql); //执行插入语句
//err_code="0x01_D";// 成功插入语句
}
ok = true;// 处理成功
my_con.close(); // 关闭数据库
}catch(Exception e)
{
e.printStackTrace();
}
四 结果
在解析,连接数据库完毕之后就是进行插入数据,如下就是插入结果
五 附录
相关文件如下