zoukankan      html  css  js  c++  java
  • SSM框架下实现导入功能

    何叫导入?简单说,导入就是把excel表格里的数据插入到数据库里。我这里做的是支持.xls和.xlsx格式。

    因为是自己做案例记录,那些jar包什么的就不细说了,主要讲实现和步骤,看代码:

    先在你的项目文件中创建一个excel表格模板,方便用户知晓导入的格式和文件内容:

    一、页面中导入按钮

    二、点击按钮跳转到导入页面,这里直接用的标签跳转,<%@ include file="importHarness.jsp"%>

    三、点确认时先做下验证,文件格式、类型什么的

    $('#importHarnessForm')为form表单id,(".hp_form_error")为确认按钮上方一个隐藏的DIV的class,显示提示信息用的。

    四、点击确认按钮  传值  后台代码:

    Controller类:

    @RequestMapping(value = "/import" , method = RequestMethod.POST)
    @ResponseBody
    public String xlsImport(@RequestParam("xlsfile") MultipartFile file){
    // 返回string类型为解决ie9兼容性
    ResponseBase responseBase = new ResponseBase();
    if (file.isEmpty()) {
    responseBase.setMessage("'文件内容不能为空'");
    responseBase.setStatus(DATA_VALIDATION_ERROR);
    return responseBase.toString();
    }
    //文件名
    String fileName = file.getOriginalFilename();
    if (fileName == null || (!fileName.endsWith(".xls") && !fileName.endsWith(".xlsx"))) {
    responseBase.setMessage("'文件格式不正确'");
    responseBase.setStatus(DATA_VALIDATION_ERROR);
    return responseBase.toString();
    }
    InputStream inputStream = null;
    try{
    inputStream = file.getInputStream();
    Workbook wb = null;
    if (fileName.endsWith(".xlsx")) {
    wb = new XSSFWorkbook(inputStream);
    }else {
    wb = new HSSFWorkbook(inputStream);
    }
    //获取第一个工作表对象
    Sheet sheet = wb.getSheetAt(0);
    //行号
    int rowNum = sheet.getLastRowNum();
    //最大导入数
    if (sheet.getLastRowNum() > 1000) {
    responseBase.setMessage("'数据最多可导入1000条");
    responseBase.setStatus(DATA_VALIDATION_ERROR);
    return responseBase.toString();
    }
    Subject currentUser = SecurityUtils.getSubject();
    Session session = currentUser.getSession();
    Integer uid = (Integer) session.getAttribute("userId");
    List<HarnessDTO> hpList = new ArrayList<HarnessDTO>();
    int count = 0; //成功条数
    int ercount = 0; //失败条数
    for (int i = 1; i <= rowNum; i++) {

    HarnessDTO hp = new HarnessDTO();
    Row row = sheet.getRow(i);
    String brandId = FileOperateUtil.getCellValue(row.getCell(0));
    String seriesId = FileOperateUtil.getCellValue(row.getCell(1));
    String modelId = FileOperateUtil.getCellValue(row.getCell(2));
    String harnessInfo = FileOperateUtil.getCellValue(row.getCell(3));

    if(StringUtils.isNotBlank(brandId) && StringUtils.isNotBlank(seriesId) && StringUtils.isNotBlank(harnessInfo)){
    int rowCount = harnessPositionService.selectCount(brandId, seriesId, modelId);
    if(rowCount >= 0){
    hp.setBrandId( brandId );
    hp.setSeriesId( seriesId) ;
    hp.setModelId("".equals(modelId) ? "-1" : modelId);
    hp.setHarnessInfo(harnessInfo);
    hp.setStatus("1");
    hp.setEditUser(String.valueOf(uid));
    hpList.add(hp);
    count ++;
    }else{
    ercount++;
    }
    }else{
    responseBase.setMessage("'车辆品牌、型号和线束管理不能为空,导入失败,请重新导入'");
    responseBase.setStatus(DATA_VALIDATION_ERROR);
    return responseBase.toString();
    }
    }
    harnessPositionService.insertCount(hpList);
    if (count == 0) {
    responseBase.setStatus(DATA_VALIDATION_ERROR);
    }
    responseBase.setMessage("'已成功导入" + count + "条,失败" + ercount + "条'");
    }catch(Exception e){
    logger.error("文件格式不符合要求,导入失败,请重新导入 ", e);
    responseBase.setMessage("'文件格式不符合要求,导入失败,请重新导入'");
    responseBase.setStatus(DATA_VALIDATION_ERROR);
    return responseBase.toString();
    }finally{
    try {
    if (inputStream != null) {
    inputStream.close();
    inputStream = null;
    }
    } catch (IOException e) {
    logger.error("关闭文件流失败", e);
    responseBase.setMessage("'关闭文件流失败'");
    responseBase.setStatus(DATA_VALIDATION_ERROR);
    return responseBase.toString();
    }
    }
    return responseBase.toString();
    }

    Service类:

    实现类:

    DAO层:

    SQL:

    这是实现的全部代码,值得注意的是Controller类获取行数的时候,int rowNum = sheet.getLastRowNum();  往往会出现如下情况:

    获取到的行数要大于实际表格中(有数据)的行数,自己解决办法

    1.在循环中,自己再嵌入一层循环,判断获取到的行数是否为空,为空跳出循环执行下一次循环(continue)

    2.偷懒的方法,创建的模板,手动把模板下面的行和列删除、清空内容一次,选多点行数,几千行随你选,这样导入的时候就不会出现那种情况啦(只是针对导入模板的用户  选此方法吧)

  • 相关阅读:
    [Sql Server 转载]
    [C#][收集整理]
    [Sql Server][原创]
    [Sql Server][原创]
    [Sql Server][原创]
    C#代码验证sql语句是否正确(只验证不执行sql)的方法
    [Sql Server][转载] 数据库表的基本信息,你真的都了解吗?
    [Sql Server][原创] 常用 Sql 查询
    LocalProxy
    通过字符串引入模块下的属性
  • 原文地址:https://www.cnblogs.com/yzw23333/p/7209851.html
Copyright © 2011-2022 走看看