poi解析excel导入MySQL数据库
2016-08-24 09:33
453 查看
ssh框架下利用poi解析excel文件后导入数据库到相应的字段,列出遇到的问题,贴出解决办法,网上的代码虽然是遍地开发,但最开始的时候确实给了我不少的启示,良莠不齐,要花大量的的时间来甄选,比较苦恼,另外得根据自己的实际情况作出符合的调整,才能实现,才能为我所用,有一些代码虽然可以实现最后的目的,但是过程繁琐,本可以很简单的解决。
最开始的时候,一心只想着只有能够把excel成功导入数据就OK了,做到了之后,就开始想着,对不同版本的excel(2003.2007)都能够满足,excel中数据格式的问题,可以在弄出一个通用的版本出来,以后再碰到同样的事件就要简单许多。
直接贴代码
jsp
action
遇到的问题
1、总是在构建excel文件对象的那句出错,在控制台只有warn,原因是缺一个xmlbeans.jar这个包(之前已经导入了其他poi的包,很多网上的都没有这个包),导入即可
poi包下载链接: http://download.csdn.net/detail/forrest_ou/9611291
2、User user = new User(); 这行代码忘记写和写错,那样传过来的值就是null
3、关于精简的问题,下面的两种方案都可以达到目的,代码量天壤之别
4、excel格式的问题,上面的代码对excel单元格的格式进行了判断,并都转为string格式,在导入数据库相应格式的时候在转,这样就不用管excel中的格式问题了,下面是最开始用的简单的代码,如果项目简单,也可以试试,毕竟很好弄
以上基本上是碰见的所有内容了,如果有朋友有其他的见解,欢迎留言,希望能共同进步
--------------------------更新分割线------------------------------------------------------------------------------------------------------------
对上传的文件进行JS验证
1、选择文件是否为空
2、选择文件是否是excel文件
解决问题一 。 因为我的jsp页面中并没有像完整项目中的common.jsp 。所以需要自己引入jQuery和对应的js文件,这里就涉及到文件相对路径的问题,引入的jQuery和js的src是相对于jsp的文件地址(../返回上一级)
JSP代码
JS代码
以上解决选择文件为空的问题
解决问题二。在解决这个问题的时候走了一个捷径,并没有使用JS来做判断,而是使用了struts的file标签的accept属性,直接说明只能选择后缀名为.xls 和.xlsx的文件
代码
最开始的时候,一心只想着只有能够把excel成功导入数据就OK了,做到了之后,就开始想着,对不同版本的excel(2003.2007)都能够满足,excel中数据格式的问题,可以在弄出一个通用的版本出来,以后再碰到同样的事件就要简单许多。
直接贴代码
jsp
<form id="file" name="form1" action="upload.action" method="post" enctype="multipart/form-data"> <s:file name="uploadExcel" label="文件" id="fileName" accept=".xls,.xlsx"></s:file> <input type="submit" value="导入数据" onclick="checkFile();" id="go" > </form>
action
private File uploadExcel; public File getUploadExcel() { return uploadExcel; } public void setUploadExcel(File uploadExcel) { this.uploadExcel = uploadExcel; } SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); String filePath = uploadExcel.getPath(); Workbook workBook = WorkbookFactory.create(new FileInputStream(filePath)); for (int numSheet = 0; numSheet < workBook.getNumberOfSheets(); numSheet++) { Sheet sheet = workBook.getSheetAt(numSheet); if (sheet == null) { continue; } User user = new User(); for (int rowNum = 1; rowNum <= sheet.getLastRowNum(); rowNum++) { Row xRow = sheet.getRow(rowNum); int cellNum = xRow.getPhysicalNumberOfCells(); for(int c=1 ; c<cellNum ; c++){ Cell xCell = xRow.getCell(c); int cellType = xCell.getCellType(); String cellValue = null; int cv = 0; switch (cellType) { case Cell.CELL_TYPE_STRING: //文本 cellValue = xCell.getStringCellValue(); break; case Cell.CELL_TYPE_NUMERIC: //日期或数字 if(DateUtil.isCellDateFormatted(xCell)) { cellValue = fmt.format(xCell.getDateCellValue()); // 日期 }else{ cv = (int)xCell.getNumericCellValue(); cellValue = String.valueOf(cv); // 数字 } break; case Cell.CELL_TYPE_BOOLEAN: // 布尔型 cellValue = String.valueOf(xCell.getBooleanCellValue()); break; case Cell.CELL_TYPE_BLANK: // 空白 cellValue = xCell.getStringCellValue(); break; case Cell.CELL_TYPE_ERROR: // 错误 cellValue = "错误"; break; case Cell.CELL_TYPE_FORMULA: // 公式 cellValue = "错误"; break; default: cellValue = "错误"; } switch (c) { case 1: user.setUserName(cellValue); break; case 2: user.setName(cellValue); break; case 3: user.setPassword(cellValue); break; case 4: user.setPhone(cellValue); break; case 5: user.setGender(cellValue); break; case 6: user.setDeleteFlg(cellValue); break; case 7: user.setGroupId(Integer.parseInt(cellValue)); break; case 8: user.setCreateUserId(Integer.parseInt(cellValue)); break; case 9: user.setCreateUserName(cellValue); break; case 10: user.setCreateTime(Date.valueOf(cellValue)); break; case 11: user.setUpdateUserId(Integer.parseInt(cellValue)); break; case 12: user.setUpdateUserName(cellValue); break; case 13: user.setUpdateTime(Date.valueOf(cellValue)); break; default: break; } } this.userService.save(user); } }
遇到的问题
1、总是在构建excel文件对象的那句出错,在控制台只有warn,原因是缺一个xmlbeans.jar这个包(之前已经导入了其他poi的包,很多网上的都没有这个包),导入即可
poi包下载链接: http://download.csdn.net/detail/forrest_ou/9611291
2、User user = new User(); 这行代码忘记写和写错,那样传过来的值就是null
3、关于精简的问题,下面的两种方案都可以达到目的,代码量天壤之别
String path = ServletActionContext.getServletContext().getRealPath( "/upload");
File f = new File(path , uploadExcelFileName); FileUtil.copyFile(uploadExcel,f); String filePath = f.getPath();
String filePath = uploadExcel.getPath();
4、excel格式的问题,上面的代码对excel单元格的格式进行了判断,并都转为string格式,在导入数据库相应格式的时候在转,这样就不用管excel中的格式问题了,下面是最开始用的简单的代码,如果项目简单,也可以试试,毕竟很好弄
user.setUserName(xRow.getCell(0).getStringCellValue()); user.setName(xRow.getCell(1).getStringCellValue()); user.setPassword(xRow.getCell(2).getStringCellValue()); user.setGender(xRow.getCell(3).getStringCellValue()); user.setDeleteFlg(xRow.getCell(4).getStringCellValue()); this.userService.save(user);
以上基本上是碰见的所有内容了,如果有朋友有其他的见解,欢迎留言,希望能共同进步
--------------------------更新分割线------------------------------------------------------------------------------------------------------------
对上传的文件进行JS验证
1、选择文件是否为空
2、选择文件是否是excel文件
解决问题一 。 因为我的jsp页面中并没有像完整项目中的common.jsp 。所以需要自己引入jQuery和对应的js文件,这里就涉及到文件相对路径的问题,引入的jQuery和js的src是相对于jsp的文件地址(../返回上一级)
JSP代码
<!-- 引入jQuery --> <script src="js/jquery/jquery-1.12.3.js"></script> <!-- 引入JS --> <script src="js/uploadFile.js"></script> <button type="button" id="btnUpload" onclick="checkFile">导入数据 </button>
JS代码
function checkFile() { if($('#fileName').val()){ $('#uploadFile').submit(); }else{ alert('请选择文件!'); } }
以上解决选择文件为空的问题
解决问题二。在解决这个问题的时候走了一个捷径,并没有使用JS来做判断,而是使用了struts的file标签的accept属性,直接说明只能选择后缀名为.xls 和.xlsx的文件
代码
<s:file name="uploadExcel" label="文件" id="fileName" accept=".xls,.xlsx"></s:file>
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- Linux Generating SSH Keys
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- 使用Python生成Excel格式的图片
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列