当前位置: 首页 > 编程笔记 >

java 导入Excel思路及代码示例

白宏大
2023-03-14
本文向大家介绍java 导入Excel思路及代码示例,包括了java 导入Excel思路及代码示例的使用技巧和注意事项,需要的朋友参考一下

导出就是将List转化为Excel(listToExcel)

导入就是将Excel转化为List(excelToList)

一、思路分析

  1、我们要做导入,实际上也就是先文件上传,然后读取文件的数据。

  2、我们要有一个导入的模板,因为我们导入的Excel列要和我们的数据字段匹配上,所以我们要给它来一个规定,也就是模板。

  3、按照我们公司的套路,是做了一个导入信息的临时表,用来存导入文件中的信息。每当导入的时候,我们先把表信息清空,再拿到数据放进来,然后我们对导入的数据进行检查,最后才全部导入。

    这样做的目的是防止导入的数据和列没有对上却也直接导到了库里面,要真这样了就很尴尬。我们做了三个按钮,一个导入,一个确认导入,一个导入模板下载。

  4、捋一下过程:

    点击批量导入按钮,跳转到导入页面。

    点击模板下载。(事先写好一个模板.xls文件,此按钮放置下载链接)

    在模板中录入数据。

    点击导入按钮,跳出文件上传模态框。

    选择文件,上传文件。

    上传成功后调用后台方法,读取文件内容。

    把内容生成表格,显示到导入页面。

    观察数据有没有出错。

    点击确认导入,调用后台方法,执行导入操作。

    回调函数,导入成功/导入失败 的提示。

二、代码分析

   1、前端js代码:

var actionPath = contextPath + "/alumni-import";

$(function() {
  //加载数据
  loadData();
  //上传文件
  uploadFile({
    subfix: ['xls'],
    subfixTip: "请选择Excel的xls文件!",
    successCall: function(data, status, a) {
      $('[name=attachementPath]').val(data.fileName);
      $.post(actionPath + "!importExcel", { "f_id": data.f_id }, function(data) {
        if (data.success) {
          alertify.alert(data.message);
          $("#myModal-import").modal("hide");
          loadData();
        } else {
          alertify.alert(data.message);
        }

      }, "json");
    }
  });
  //导入
  $("#btn-import").click(function() {
    var html = template("importTpl");
    $("#import-body").html(html);
    $("#myModal-import").modal();
  });
  //确认导入
  $("#btn-sure").click(function() {
    var type = $("#indentity-type").val();
    alertify.confirm("确定要全部导入吗?", function(e) {
      if (!e) { return; } else {
        $.post("/alumni-import!saveReal?type=" + type, function(data) {
          alertify.alert("导入成功!", function() {
            location.href = "/alumni!hrefPage";
          });
        }, "json");
      }
    });
  });
});50 
function loadData() {
  var options = {
    url: actionPath + "!page"
  };
  loadPaginationData(options);
}

2、后台功能代码

    前端有四个请求,一个初始化页面数据加载,当然,一开始是没有数据的;一个导入文件上传;一个确认导入;一个导入完成后页面跳转回要信息页面(信息页面有一个批量导入跳转到这的导入页面)。

    第一个后最后一个就不讲了。讲一下第二个和第三个。

    ①第二个

//上传文件后调用
  public void importExcel() {
    try {
      //清空临时表的数据
      baseAlumniImportSrv.deleteAll();
      //读取文件
      File file = gridFsDao.readFile(f_id);
      //把文件信息给临时表
      int count = excelXYSrv.importExcel(file);
      //清空上传的文件
      file.delete();
      sendSuccessMsg(count, "上传成功" + count + "条数据");
    } catch (IOException e) {
      LOGGER.error(e);
      sendFailMsg(null, "上传失败");
    }
  }
@Override  //使用MongoDB GridFS,具体详解请各自初学者自行百度,注释写不下去了,我也不会,心态爆炸~~~
  public File readFile(String f_id) {
    //拿到文件
    GridFSDBFile gridFSFile = mongoGridFs.findOne(new Query(Criteria.where(F_ID).is(f_id)));
    if (gridFSFile == null) {
      return null;
    }
    String fileName = gridFSFile.getFilename();
    String extension = fileName.substring(fileName.lastIndexOf("."), fileName.length());
    InputStream ins = gridFSFile.getInputStream();
    String tmpFile = UUID.randomUUID().toString() + extension;
    File file = new File(tmpFile);
     
    try {
      OutputStream os = new FileOutputStream(file);
      int bytesRead = 0;
      byte[] buffer = new byte[8192];
      while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
        os.write(buffer, 0, bytesRead);
      }
      os.close();
      ins.close();
    } catch (IOException e) {
      e.printStackTrace();
    }

    return file;

  }
/**
   * @param excelFile
   *      从excel中读取数据,并存储到数据库临时表中
   * @return
   * @throws IOException
   */
  @Override
  public int importExcel(File excelFile) throws IOException {
    List<List<Object>> datas = ExcelImportUtil.readExcel(excelFile);
    int count = 0;
    for (int i = 1; i < datas.size(); i++) {
      BaseAlumniImport entity = this.convert2Entity(datas.get(i));
      this.baseAlumniImportSrv.save(entity);
      count++;
    }
    return count;
  }

 ②第三个

public void saveReal() {
    int count = 0;
    List<BaseAlumniImport> importList = this.baseAlumniImportSrv.findAll();
    for (int i = 0; i < importList.size(); i += 10) {
      List<BaseAlumniImport> newlist = new ArrayList<>();
      if ((i + 10) < importList.size()) {
        newlist = importList.subList(i, i + 10);
      } else {
        newlist = importList.subList(i, importList.size());
      }
      count += excelXYSrv.saveReal(newlist, this.type);
    }
    sendSuccessMsg(count, "导入成功" + importList.size() + "条数据");
  }
@Override
  public int saveReal(List<BaseAlumniImport> importList, String type) {
    int count = 0;
    String alumniIdentityName = dicSrv.findById(DicAlumniIdentity.class, Integer.parseInt(type)).getValue();
    for (BaseAlumniImport inst : importList) {
      LOGGER.info(inst.getId());
      BaseAlumni v = this.importExportSrv.convert(inst);
      v.setId(IdKit.uuid());
      v.setCreateTime(new Date());
      v.setLastUpdate(new Date());
      this.baseAlumnidDao.save(v);
      this.baseAlumniImportSrv.deleteById(inst.getId());
      count++;
    }
    return count;
  }
@Override
  public int saveReal(List<BaseAlumniImport> importList, String type) {
    int count = 0;
    String alumniIdentityName = dicSrv.findById(DicAlumniIdentity.class, Integer.parseInt(type)).getValue();
    for (BaseAlumniImport inst : importList) {
      LOGGER.info(inst.getId());
      BaseAlumni v = this.importExportSrv.convert(inst);
      v.setId(IdKit.uuid());
      v.setCreateTime(new Date());
      v.setLastUpdate(new Date());
      this.baseAlumnidDao.save(v);
      this.baseAlumniImportSrv.deleteById(inst.getId());
      count++;
    }
    return count;
  }

 没啥好讲的……会的应该都能看懂,看不懂的我也不会……

三、结果图

总结

以上就是本文关于java 导入Excel思路及代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

Java解压zip文件完整代码分享

Java探索之Thread+IO文件的加密解密代码实例

Java编程获取文件列表及子文件目录的方法(非递归)

如有不足之处,欢迎留言指出。

 类似资料:
  • 本文向大家介绍用PHP代替JS玩转DOM的思路及示例代码,包括了用PHP代替JS玩转DOM的思路及示例代码的使用技巧和注意事项,需要的朋友参考一下 事情的起源比较简单,我需要把一个导航页的数据整理好写入数据库。一个比较直观的方法是对html文件进行分析,通用的方法是用php的正则表达式来匹配。但是这样做开发和维护都很困难,代码可读性非常差。 导航页的数据都是规则的排列在DOM树当中的,用JS可以用

  • 本文向大家介绍Flex4 DataGrid中嵌入RadioButton实现思路及代码,包括了Flex4 DataGrid中嵌入RadioButton实现思路及代码的使用技巧和注意事项,需要的朋友参考一下 MXML页面

  • 本文向大家介绍AngularJs导出数据到Excel的示例代码,包括了AngularJs导出数据到Excel的示例代码的使用技巧和注意事项,需要的朋友参考一下 公司一个新的需求导出Exce表格,研究了一下,最后终于实现,分享给大家。 1 使用FileSaver 第一次采用FileSaver.js 由于刚开始导致导出一片空白,还只能抓取网页里面的表格地址:https://github.com/eli

  • 本文向大家介绍jquery 页眉单行信息滚动显示实现思路及代码,包括了jquery 页眉单行信息滚动显示实现思路及代码的使用技巧和注意事项,需要的朋友参考一下 以下是控制滚动的样式,将滚动的内容查询出来,放在一个div 或者别的容器里面,我这里使用的是<dt> 以下是滚动内容展示的容器 以下是js,查询滚动展示内容 以下是控制滚动展示时间,以及样式

  • 本文向大家介绍mysql获得60天前unix时间思路及代码,包括了mysql获得60天前unix时间思路及代码的使用技巧和注意事项,需要的朋友参考一下 首先根据now()获得当前时间 使用adddate()方法获得60天前时间 使用unix_timestamp()方法转换时间类型

  • 本文向大家介绍Java 数组详解及示例代码,包括了Java 数组详解及示例代码的使用技巧和注意事项,需要的朋友参考一下 下面是stackoverflow中关于数组方法的相关问题中,获得最多票数的12个数组操作方法。 1.  声明一个数组 2.  输出一个数组 3.  从一个数组创建数组列表 4.  检查一个数组是否包含某个值 5.  连接两个数组 6.  声明一个内联数组(Array inline