原作者:sincoolvip
出处:http://www.cnblogs.com/sincoolvip/p/6531403.html

分析:首先采用一个工具类Excel2List.java,把excel各行的数据(一行为一条数据,每一列是字段)转换成ArrayList.,其中,包括了通过路径读取excel文件,遍历每一行,再遍历每一列。接下来,读取每一行每一列的值,判断单元格的值是否是我们数据库想要的值。这里,在判断时,要新定义一个异常抛出,异常需要包含行号及列号,以便捕获到异常后反馈给上传者,他所上传的excel哪一行哪一列的数据有问题。在没有异常的情况下,遍历完成后,excel中每一行有效数据都被装进了ArrayList的对象中,我们要进行的就是把ArrayList对象中的实体添加到数据库了。因为公司项目需要采用spring mvc的框架,由action层中得到了ArrayList对象,往service再往dao层传递完成插入,这里就不再赘述了。
在前端,为了简洁,我只用了一个类型是文件的input,获取到了上传文件的路径后,用ajax请求action,把路径传给action,这样,一个excel导入就完成了。
接下来,我分点介绍。

1、Excel2List.java
1.1 ArrayList transExcel(String URL)
通过路径读取excel文件,遍历每一行每一列,检查每一个值是否合法,形成ArrayList的对象。

public ArrayList<Entity> transExcel(String URL) throws IOException, ParseException, ImportException{SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );ArrayList<Entity> list = new ArrayList<Entity>();File file = new File(URL);Workbook workbook=null;try {workbook = WorkbookFactory.create(file);} catch (InvalidFormatException e) {e.printStackTrace();}//读取默认第一个工作表sheetSheet sheet =  workbook.getSheetAt(0);//获取sheet中最后一行行号int lastRowNum = sheet.getLastRowNum();//循环所有行ArrayList<String> list2 = new ArrayList<String>();//遍历第i行的所有单元格for (int i = 3; i <= lastRowNum; i++) {//获取当前行中的内容Row row = sheet.getRow(i);short cell = row.getLastCellNum();if(row !=null){Entity Entity =new Entity ();if (check("ID", getValue(row.getCell(1)))) {Entity .setId(getValue(row.getCell(1)));} else {throw new ImportException(i, 1);}if(check("NAME", getValue(row.getCell(2)))){Entity .setName(getValue(row.getCell(2)));} else {throw new ImportException(i, 2);}if(check("RULEDES", getValue(row.getCell(3)))){Entity .setRuleDes(getValue(row.getCell(3)));} else {throw new ImportException(i, 3);}if(check("STARTTIME", getValue(row.getCell(4)))){Date startTime = sdf.parse(getValue(row.getCell(4)));Entity .setStartTime(startTime);} else {throw new ImportException(i, 4);}if (check("ENDTIME", getValue(row.getCell(5)))) {Date endTime = sdf.parse(getValue(row.getCell(5)));Entity .setEndTime(endTime);} else {throw new ImportException(i, 5);}if(check("ISCOUPON", getValue(row.getCell(6)))){Entity .setIsCoupon(getValue(row.getCell(6)));} else {throw new ImportException(i, 6);}if(check("STATUS", getValue(row.getCell(7)))){Entity .setStatus(getValue(row.getCell(7)));} else {throw new ImportException(i, 7);}if(check("RULE", getValue(row.getCell(8)))){Entity .setRule(getValue(row.getCell(8)));} else {throw new ImportException(i, 8);}if(check("FULLCUT", getValue(row.getCell(9)))){if (!"".equals(getValue(row.getCell(9)))) {BigDecimal fullCut=new BigDecimal(getValue(row.getCell(9)));fullCut=fullCut.setScale(2, BigDecimal.ROUND_HALF_UP);Entity .setFullCut(fullCut);}} else {throw new ImportException(i, 9);}if(check("MONEY", getValue(row.getCell(10)))){BigDecimal money=new BigDecimal(getValue(row.getCell(10)));money=money.setScale(2, BigDecimal.ROUND_HALF_UP);Entity .setMoney(money);} else {throw new ImportException(i, 10);}Entity .setCreateTime(new Date());Entity .setUpdateTime(new Date());list.add(Entity );}}return list;}

1.2 Excel2List.java类中还应有的方法有getValue,按单元格格式取单元格里的值。

private String getValue(Cell cell){if(cell==null) return "";String cellSring="";switch (cell.getCellType()) {  case HSSFCell.CELL_TYPE_STRING: // 字符串  cellSring = cell.getStringCellValue();break;  case HSSFCell.CELL_TYPE_NUMERIC: // 数字  cellSring=String.valueOf(cell.getNumericCellValue());break; case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean cellSring=String.valueOf(cell.getBooleanCellValue());break;  case HSSFCell.CELL_TYPE_FORMULA: // 公式  cellSring=String.valueOf(cell.getCellFormula());break;  case HSSFCell.CELL_TYPE_BLANK: // 空值  cellSring=""; break;  case HSSFCell.CELL_TYPE_ERROR: // 故障  cellSring=""; break;  default:  cellSring="ERROR";  break; }        return cellSring;}

1.3 Excel2List.java类中,还应有的一个方法是判断各字段内容是否符合数据库的要求。

private Boolean check(String fieldName, String value){switch(fieldName){case "ID":case "NAME":if ("".equals(value)){return false;}return true;case "STARTTIME":case "ENDTIME": if ("".equals(value)){return false;}try {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date= sdf.parse(value);} catch (Exception e) {e.printStackTrace();return false;}return true;case "MONEY":if ("".equals(value)){return false;}try {BigDecimal bigDecimal=new BigDecimal(value);bigDecimal=bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP);} catch (Exception e) {e.printStackTrace();return false;}return true;default:return false;}}

2 大家可能已经留意到了,在Excel2List.java类中,transExcel方法在调用check方法判断每个字段是否合法的时候,如果判断为不合法,会抛出ImportException(i, j)异常。创建这样一个异常的原因在于,给上传者返回具体的数据错误位置。

public class ImportException extends Exception{public ImportException(int i, int j){super("第"+(i+1)+"行第"+(j+1)+"列的数据不合法,请严格按照模板标明的数据格式进行输入!");}}

3 接下来,介绍一下前台是如何传递url到后台的
3.1 HTML

<input type="file" id="excel" onchange="change(this.value)">

3.2 javascript, 这里异步请求url被映射到了action层。

function change(src){var a=confirm("确定导入Excel吗?");if(!a){return;}$.ajax({type: "POST",url:"manage/importExcel",data:{'url':src},success: function(msg) {},error: function(error){}});
}

3.3 action层处理,这里调用了entityService.add(Entity),就不再赘述了。

@RequestMapping(value="/importExcel", method = RequestMethod.POST)public void importExcel(HttpServletRequest rq,HttpServletResponse rp, String url) throws Exception{try {ExcelToList excelToList=new ExcelToList();ArrayList<Entity> list=null;try {list =excelToList.transExcel(url);} catch (ImportException e) {e.printStackTrace();Error(e.getMessage(), rp);return;}for (Entity entity : list) {entityService.add(Entity);}SuccessMsg("import successfully!", rp);return;} catch (Exception e) {e.printStackTrace();Error("import failed!", rp);return;}}

至此,excel导入数据库就基本结束了。仍存在的bug我没有成功解决的是:url从前台传入无法获取全部路径的问题。我用的火狐浏览器,尝试了多种解决方法仍未能有效解决,最后我采用了掩耳盗铃的方法。因为在火狐中,它会统一表示C:\fakepath\FileName,我就干脆在C盘新建了一个文件夹命名为fakepath,再把excel粘贴进去。这样,其实火狐并没有真正得到文件的路径,只是一种投机取巧的方式。
欢迎朋友们与我探讨!

java web excel导入数据库相关推荐

  1. Java实现Excel导入数据库,数据库中的数据导入到Excel

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 实现的功能: Java实现Excel导入数据库,如果存在就更新 数据库中的数据导入到Excel 1. ...

  2. java poi excel 导入数据库_java POI 处理excel表格数据并导入数据库示例

    java操作Excel最常用的开源组件有poi与jxl.jxl是韩国人开发的,发行较早,但是更新的很慢,目前似乎还不支持excel2007. poi是apache下的一个子项目,poi应该是处理ms的 ...

  3. java web 导入数据库_关于JAVA、 JAVA Web项目导入数据库驱动包的问题

    导入jdbc驱动程序包其实有很多种方法,但是不同的导包方式有不同的含义, 1.给Tomcat导包(表示服务器可能要用到数据库,例如数据源),如果是MyEclipse集成Tomcat,显然是要用&quo ...

  4. java中excel文件导入数据库中_〖JAVE经验〗java中Excel导入数据库里

    1 从Excel文件读取数据表 Java Excel API既可以从本地文件系统的一个文件(.xls),也可以从输入流中读取Excel数据表.读取Excel数据表的第一步是创建Workbook(术语: ...

  5. Java开发环境!java实现excel导入数据库

    京东一面凉经 object的方法,7大方法 synchronized方法讲解 synchronized方法实现原理 volatile关键字的原理 锁的分类 偏向锁讲解 NoClassDefFoundE ...

  6. java实现excel导入数据库,附架构师必备技术详解

    京东一面凉经 object的方法,7大方法 synchronized方法讲解 synchronized方法实现原理 volatile关键字的原理 锁的分类 偏向锁讲解 NoClassDefFoundE ...

  7. java通过jxl处理execl空行_jxl操作Excel导入数据库之空行的处理

    jxl因其快速小巧受到大家的欢迎,但是jxl还是有许多不尽如人意的地方. 本文旨在解决jxl读取excel数据时无法自动取掉空行的问题,其实就是添加一个方法. ? //返回去掉空行的记录数 priva ...

  8. .NET网站本机调试通过、发布后EXCEL导入数据库报错问题的解决

    近期做了一个EXCEL导入数据库的页面,在VS2012本机调试中导入XLS\XLSX均顺利通过,但在WEB环境下导入时均出错! 在网上查了相关资料,最有可能的原因是 DCOM 中EXCEL应用程序权限 ...

  9. Java POI Excel导入导出

    Java POI Excel导入导出 1.maven引入依赖 2.导入Excel 3.导出Excel 1.maven引入依赖 <!-- POI Excel 操作 --> <depen ...

最新文章

  1. OpenCASCADE Make Primitives-Sphere
  2. 【t081】序列长度(贪心做法)
  3. HDU 2833 WuKong
  4. 如何优雅而又不失内涵的在centos7下安装tree命令
  5. 让人期待的Visual Studio 2010
  6. c++ || && 逻辑短路问题
  7. mysql open table_MySQL open table
  8. 中国电子银行网-互联网金融第一大网站
  9. 【数学分析笔记01】平均值不等式证明
  10. 二分插入排序(c语言)
  11. 通信原理6.2-6.4码型及码间串扰
  12. 如果unity双击无法打开怎么办
  13. 明明是旅游小程序却做起了内容电商?
  14. VBS病毒(爱虫病毒) 源代码
  15. python中compile函数
  16. GOlang将华氏温度转换为摄氏温度的函数
  17. 面试现场:今日头条(一面已通过)
  18. 敏捷开发与Scrum区别(敏捷开发(Agile)教程)
  19. 照片建模神器 Recap Photo
  20. 学习—吴恩达《机器学习》—手敲代码_准备工作之基于Ubuntu系统的 Anaconda(python环境)搭建

热门文章

  1. 判断一个数是否为整数、正整数、小数通用算法
  2. 访问网站php直接下载,访问php文件自动下载及502问题-Go语言中文社区
  3. 不只在办公室写代码, 程序员的一天还可以是这样的!
  4. mp4压缩视频不改变画质?怎么压缩视频大小不改变清晰度?
  5. 输出由1、2、3、4四个数字组成的每位都不相同的所有三位数
  6. 买卖股票的最佳时间含手续费的代码实现
  7. 项目管理——软件文档分类简介
  8. 《白帽子讲Web安全 》 随手记(一)
  9. Android EventBus Subscriber class XXXActivity has no public methods called onEvent
  10. oracle命令导入expdp,oracle的导入导出命令:expdp和impdp