前提提要:excel 2003只能存在5w6多条数据,数据超出使用2007(槽点:excel中超过5w多行数据也是没谁了,毕竟excel是用来给人看的,真正保存哪里有数据库好使)
话不多说,这段代码我先干了
@RequestMapping(value = "/importPropertyAvgPriceRecord.do", method = RequestMethod.POST) @ResponseBody public Result importPropertyAvgPriceRecord(@RequestParam("fileName") CommonsMultipartFile[] files,Model model, HttpSession session,HttpServletRequest request) { Result res = new Result(); City city = (City) session.getAttribute("city"); try { SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");// 设置日期格式 String strDate = "-" + df.format(new Date()); for (int i = 0; i < files.length; i++) { File newFile = null; String fileName = files[i].getOriginalFilename(); fileName = fileName.substring(0, fileName.lastIndexOf(".xls")) + strDate + fileName.substring(fileName.lastIndexOf(".xls")); //这个校验很粗暴 if (!fileName.contains("xls")) { res.setMsg("导入的文件格式暂时只支持.xls格式"); return res; } try { FileManager.saveFileFromInputStream(files[i].getInputStream(), request.getSession().getServletContext().getRealPath("/upload"), fileName); newFile = new File( request.getSession().getServletContext().getRealPath("/upload") + "/" + fileName); } catch (Exception ex) { res.setMsg("上传文件失败"); return res; } res.setMsg(propertyPriceRecordService.addExcelData(newFile, city, city.getId())); } } catch (Exception e) { this.handleException(e, res); } return res; } 以上为controller中的code
以下为service中的code
@Override public String addExcelData(File file, City city, Long cityId) { if (cityId != city.getId()) { return "城市不匹配"; } //查询出导入价格源列表 AvgPriceSourceExample example11 = new AvgPriceSourceExample(); com.ulink.zgzf.biz.price.city.model.AvgPriceSourceExample.Criteria c = example11.createCriteria(); c.andCityIdEqualTo(cityId); c.andPriceTypeEqualTo(4); List<AvgPriceSource> pps = propertyPriceSourceService.selectByExample(example11); if(pps==null||pps.size()==0){ return "该城市没有导入价格源"; } String[] priceSource = new String[pps.size()]; for (int i = 0; i < pps.size(); i++) { priceSource[i] = pps.get(i).getName(); } File excelFile = file;// Excel文件对象 InputStream is = null;// 输入流对象 StringBuffer strMsg = new StringBuffer(); StringBuffer strMsg2 = new StringBuffer(); int x = 0; int y = 0; int errorCount = 0; Workbook wb = null; Sheet sheet = null; String lstStrValue[] = { "城市", "楼盘名", "价格来源", "价格", "价格时点" }; // 补全城区id,入库时间,楼盘编码,城市id List<String> userList = new ArrayList<String>(); Collections.addAll(userList, lstStrValue); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String cityName = city.getName(); Long ccityId = city.getId(); try { is = new FileInputStream(excelFile); if (excelFile.getName().indexOf(".xlsx") > 0) { wb = new XSSFWorkbook(is); } else if (excelFile.getName().indexOf(".xls") > 0) { wb = new HSSFWorkbook(is); } sheet = wb.getSheetAt(0); strMsg.append("excle中总共" + sheet.getLastRowNum() + "条数据\n"); // 标题总列数 int colNum = sheet.getRow(0).getPhysicalNumberOfCells(); Property property = new Property(); PropertyExample example = new PropertyExample(); com.ulink.zgzf.biz.bd.property.model.PropertyExample.Criteria query = example.createCriteria(); query.andCityIdEqualTo(ccityId); for (int j = 0; j < colNum; j++) { String strValue = getValue(sheet.getRow(0).getCell(j)); if (!userList.contains(strValue)) { strMsg2.append("第" + j + "列数据项“" + strValue + "”未能与模板匹配; \r\n"); errorCount++; return "第" + j + "列数据项“" + strValue + "”未能与模板匹配; \r\n"; } } logger.info("开始导入数据"); for (int i = 1; i <= sheet.getLastRowNum(); i++) { example.clear(); query = example.createCriteria(); query.andCityIdEqualTo(ccityId); PropertyPriceRecord propertyPriceRecord = new PropertyPriceRecord(); Row row = sheet.getRow(i);// 获取行对象 if (row == null) { continue; } // 获得楼盘对象 从楼盘对象中取到城区id和其他数据 query.andNameEqualTo(getValue(row.getCell(1))); List<Property> propertyList = propertyService.selectByExample(example); if (propertyList.size() == 0) { strMsg2.append("系数表里第" + i + "行" + "\"楼盘找不到,该项数据被忽略\r\n"); errorCount++; continue; } property = propertyList.get(0); for (int j = 0; j < colNum; j++) { String strValue = getValue(sheet.getRow(0).getCell(j)); switch (strValue) { case "城市": String value = getValue(row.getCell(j)); if (value != null && !value.equals("")) { if (value.equals(cityName)) { propertyPriceRecord.setCityId(ccityId); propertyPriceRecord.setCityName(cityName); }else{ strMsg2.append("表里第" + i + "行第" + (j + 1) + "列数据内容\"" + value + "\"不是对应城市名,该项数据被忽略\r\n"); errorCount++; } } break; case "楼盘名": value = getValue(row.getCell(j)); if (value != null && !value.equals("")) { propertyPriceRecord.setPropertyName(value); propertyPriceRecord.setPropertyId(property.getId()); propertyPriceRecord.setPropertyCode(property.getPropertySystemCode()); } break; case "价格时点": value = getValue(row.getCell(j)); if (value != null && !value.equals("")) { try { Date date = sdf.parse(value); if(date.before(new Date())){ propertyPriceRecord.setPriceDate(date); }else{ strMsg2.append("表里第" + i + "行第" + (j + 1) + "列数据内容\"" + value + "\"价格时点异常,该项数据被忽略\r\n"); errorCount++; } } catch (ParseException e) { e.printStackTrace(); strMsg2.append("表里第" + i + "行第" + (j + 1) + "列数据内容\"" + value + "\"不是Date类型,该项数据被忽略\r\n"); errorCount++; } } break; case "价格": value = getValue(row.getCell(j)); if (Validation.isDouble(value) || Validation.isInteger(value)) { propertyPriceRecord.setPrice(Double.valueOf(value)); } else { strMsg2.append("表里第" + i + "行第" + (j + 1) + "列数据内容\"" + value + "\"不是double类型,该项数据被忽略\r\n"); errorCount++; } break; case "价格来源": value = getValue(row.getCell(j)); if (value != null && !value.equals("")) { if(Arrays.asList(priceSource).contains(value)){ propertyPriceRecord.setPriceSource(value); for (AvgPriceSource avgPriceSource : pps) { if(avgPriceSource.getName().equals(value)){ propertyPriceRecord.setPriceSourceId(avgPriceSource.getId()); } } }else{ strMsg2.append("表里第" + i + "行第" + (j + 1) + "列数据内容\"" + value + "\"不是该城市设置的楼盘导入价格来源\r\n"); errorCount++; } } break; } } if (propertyPriceRecord.getCityId() == null || propertyPriceRecord.getPriceDate() == null || propertyPriceRecord.getPrice() == null || propertyPriceRecord.getPriceSource() == null) { strMsg2.append("第" + i + "行数据导入错误"); errorCount++; continue; } // 将楼盘表的剩余字段进行赋值 propertyPriceRecord.setDistrictId(property.getDistrictId()); propertyPriceRecord.setDistrictName(property.getDistrictName()); propertyPriceRecord.setTargetType(property.getPropertyTargetType()); propertyPriceRecord.setCreateTime(new Date()); // 进行去重校验 PropertyPriceRecordExample example1 = new PropertyPriceRecordExample(); Criteria query1 = example1.createCriteria(); query1.andCityIdEqualTo(propertyPriceRecord.getCityId()); query1.andPropertyIdEqualTo(propertyPriceRecord.getPropertyId()); query1.andPriceDateEqualTo(propertyPriceRecord.getPriceDate()); query1.andPriceSourceEqualTo(propertyPriceRecord.getPriceSource()); List<PropertyPriceRecord> recordList = mapper.selectByExample(example1); try { propertyPriceRecord.setPrice(Double .valueOf(new java.text.DecimalFormat("#0.00").format(propertyPriceRecord.getPrice()))); } catch (Exception e) { logger.error("价格简写为两位失败:" + e); } if (recordList.size() == 0) { this.insertSelective(propertyPriceRecord,"导入价格数据"); x++; } else { propertyPriceRecord.setId(recordList.get(0).getId()); this.updateByPrimaryKeySelective(propertyPriceRecord); y++; } logger.info("总共" + sheet.getLastRowNum() + "条数据,已导入" + i + "条数据"); } } catch (IOException e) { e.printStackTrace(); return "文件读取错误"; } finally { if (is != null) { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } strMsg.append("已成功导入" + x + "条数据\r\n"); if (y > 0) { strMsg.append("更新数据" + y + "条数据\r\n"); } strMsg.append(strMsg2); String strErrorPath = SysParameterUtil.getPropertyName("errer_log_url").getParamValue(); File txt = new File(strErrorPath + "/importPropertyPriceRecordErrorLog.txt"); if (errorCount > 10) { PrintStream ps; try { if (!new File(strErrorPath).exists()) { new File(strErrorPath).mkdirs(); } if (txt.exists()) { txt.delete(); } ps = new PrintStream(new FileOutputStream(txt)); ps.println(strMsg.toString()); ps.flush(); ps.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } } logger.info("数据导入完成"); if (errorCount > 10) { return SysParameterUtil.getPropertyName("server_url").getParamValue() + "/bd/property/getErrorLog.do" + "?logPath=" + txt.getPath(); } else { return strMsg.toString(); } } 代码中存在一些业务逻辑,不是单纯的导入导出,如果需要使用到其他地方,需要修改其中的逻辑判断和处理