spring mvc 从excel导入数据
2016-04-19 12:31
381 查看
如题,从excel导入数据到数据库,支持.xls和.xlsx后缀。
用的是poi。
不多说了,具体代码如下:
用的是poi。
不多说了,具体代码如下:
/** * 上传excel文件 * @param tableId 上传数据到那个表的表id * @return 返回一个对象,包括上传是否成功的状态 * @author zhengjiang * @Time 2016年3月8日 */ @RequestMapping("/uploadExcel/{tableId}") @ResponseBody public Object uploadExcel(@PathVariable String tableId){ try{ CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); if(multipartResolver.isMultipart(request)) { MultipartHttpServletRequest multiRequest = multipartResolver.resolveMultipart(request); Iterator<String> iter = multiRequest.getFileNames(); while (iter.hasNext()) { int pre = (int) System.currentTimeMillis(); //取得上传文件 MultipartFile file = multiRequest.getFile(iter.next()); if (file != null) { return this.readExcel(file.getInputStream(), tableId); } else { return new Object(){public boolean success = false;public String url = "";public String msg = "无法读取文件"; }; } } } return new Object(){public boolean success = false;public String url = "";public String msg = "上传文件失败"; }; } catch (Exception e) { return e; } } /** * 把excel文件的数据导入数据库 * @param tableId 上传数据到那个表的表id * @return 返回一个对象,包括上传是否成功的状态 * @author zhengjiang * @Time 2016年3月15日 */ private Object readExcel(InputStream is,String tableId){ try{ String tableName = this.getTableNameByTable(tableId); HashMap map = this.getTableFieldsByTableId(tableId); Workbook wb = this.create(is); Sheet sheet = wb.getSheetAt(0); //表名不能为空 if(tableName == null || tableName == "") { return new Object(){public boolean success = false;public String msg = "找不到当前id下的图层"; }; } //必须存在xy轴 if(!map.containsKey("x") || !map.containsKey("y")) { return new Object(){public boolean success = false;public String msg = "导入数据失败。图层必须包括X、Y轴,而当前图层表结构缺省X、Y轴"; }; } Iterator<Row> rows = sheet.rowIterator(); //获得第一个表单的迭代器 Row row0 = sheet.getRow(0); while (rows.hasNext()) { //获得行数据 //获得行号从0开始 Row row = rows.next(); int rowNum = row.getRowNum(); if(rowNum == 0) continue; //获得第一行的迭代器 Iterator<Cell> cells = row.cellIterator(); String str = ""; while (cells.hasNext()) { Cell cell = cells.next(); int colNum = cell.getColumnIndex(); Object object = ""; //根据cell中的类型来输出数据 switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_NUMERIC: //读取数据的时候会把时间当数字,要再判断一下类型 if (HSSFDateUtil.isCellDateFormatted(cell)) { Date d = cell.getDateCellValue(); long dd = d.getTime(); object = map.get(row0.getCell(colNum).getStringCellValue()) + ":{$date:" + dd + "}" ; }else { object = map.get(row0.getCell(colNum).getStringCellValue()) + ":" + cell.getNumericCellValue(); } break; case HSSFCell.CELL_TYPE_STRING: object = map.get(row0.getCell(colNum).getStringCellValue()) + ":\"" + cell.getStringCellValue()+"\""; break; case HSSFCell.CELL_TYPE_BOOLEAN: object = map.get(row0.getCell(colNum).getStringCellValue()) + ":" + cell.getBooleanCellValue(); break; case HSSFCell.CELL_TYPE_FORMULA: object = map.get(row0.getCell(colNum).getStringCellValue()) + ":" + cell.getCellFormula(); break; default: System.out.println("unsuported sell type"); break; } if(str == ""){ str = object.toString(); }else { str += "," + object; } } //数据库具体操作 data d = new data(); str = "{" + str + "}"; HttpSession session = request.getSession(); if(session.getAttribute("loginUserName") == null) return null; String loginUserName = session.getAttribute("loginUserName") + ""; d.Insert(tableName,str,loginUserName); } return new Object(){public boolean success = true;public String msg = "数据上传完成"; }; } catch (Exception ex){ return new Object(){public boolean success = false;public String msg = ex.getMessage(); }; } } /** * 根据表id获取表名 * @param tableId 上传数据到那个表的表id * @return 表名 * @author zhengjiang * @Time 2016年3月15日 */ private String getTableNameByTable(String tableId) { data d = new data(); String sqlStr = "{\"_id\":{\"$oid\":\"" + tableId + "\"}}"; return d.getTableColumnByTableId("collectionList",sqlStr,"name").toString(); } /** * 不同的文件格式创建不同的Workbook * @param inp 输入数据流 * @return Workbook对象 * @author zhengjiang * @Time 2016年3月15日 */ private static Workbook create(InputStream inp) throws IOException,InvalidFormatException { if (!inp.markSupported()) { inp = new PushbackInputStream(inp, 8); } //.xls if (POIFSFileSystem.hasPOIFSHeader(inp)) { return new HSSFWorkbook(inp); } //.xlsx if (POIXMLDocument.hasOOXMLHeader(inp)) { return new XSSFWorkbook(OPCPackage.open(inp)); } throw new IllegalArgumentException("你的excel版本目前poi解析不了"); } /** * 创建以图层字段别名为key,字段名为value的键值对 * @param tableId 表id * @return 键值对 * @author zhengjiang * @Time 2016年3月21日 */ private HashMap getTableFieldsByTableId(String tableId) { HashMap map = new HashMap(); map.put("x","x"); map.put("y","y"); data d = new data(); String sqlStr = "{\"_id\":{\"$oid\":\"" + tableId + "\"}}"; //调用data的getTableColumnByTableId获取表结构的字段信息,因为他是一个对象,所以可以直接转成Document对象 Document doc = (Document)d.getTableColumnByTableId("collectionList",sqlStr,"fieldInfo"); //因为字段信息的字段列表是一个Document类型的集合,所以直接构造一个ArrayList<Document> ArrayList<Document> docs = new ArrayList<Document>(doc.get("fields",List.class)); for (Document document:docs) { map.put(document.get("alias"),document.get("name")); } return map; }
相关文章推荐
- java开发学习工具,必须收藏
- 【Leetcode】:238. Product of Array Except Self 问题 in JAVA
- Spring事务管理
- Java内部类的使用小结
- SpringMvc的自动注入与Struts2的区别
- Mybatis整合Spring(不需实现类 namespace方式)
- java常用线程池
- java jvm perf
- SpringMVC处理静态资源
- Ubuntu 14.04 安装配置 JDK8
- JavaWeb 项目——起点新闻社区
- java Spring集合
- log4j2 配置 基于JAVA 以Web为例
- Java多线程总结
- java的Socket连接简单案例
- Java中<T>泛型意思
- FileUtil.java
- Eclipse:An internal error occurred during: "Build Project". GC overhead limit exceeded
- (java)leetcode 第11题Container With Most Water(正确理解)
- java对tar、zip包的相关操作