最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java 導(dǎo)入Excel思路及代碼示例

 更新時(shí)間:2017年11月16日 11:46:04   作者:至尊丶神月  
這篇文章主要介紹了java 導(dǎo)入Excel思路及代碼示例,簡(jiǎn)要分析了設(shè)計(jì)思路,然后分享了實(shí)例代碼,具有一定參考價(jià)值,需要的朋友可以了解下。

導(dǎo)出就是將List轉(zhuǎn)化為Excel(listToExcel)

導(dǎo)入就是將Excel轉(zhuǎn)化為L(zhǎng)ist(excelToList)

一、思路分析

  1、我們要做導(dǎo)入,實(shí)際上也就是先文件上傳,然后讀取文件的數(shù)據(jù)。

  2、我們要有一個(gè)導(dǎo)入的模板,因?yàn)槲覀儗?dǎo)入的Excel列要和我們的數(shù)據(jù)字段匹配上,所以我們要給它來(lái)一個(gè)規(guī)定,也就是模板。

  3、按照我們公司的套路,是做了一個(gè)導(dǎo)入信息的臨時(shí)表,用來(lái)存導(dǎo)入文件中的信息。每當(dāng)導(dǎo)入的時(shí)候,我們先把表信息清空,再拿到數(shù)據(jù)放進(jìn)來(lái),然后我們對(duì)導(dǎo)入的數(shù)據(jù)進(jìn)行檢查,最后才全部導(dǎo)入。

    這樣做的目的是防止導(dǎo)入的數(shù)據(jù)和列沒有對(duì)上卻也直接導(dǎo)到了庫(kù)里面,要真這樣了就很尷尬。我們做了三個(gè)按鈕,一個(gè)導(dǎo)入,一個(gè)確認(rèn)導(dǎo)入,一個(gè)導(dǎo)入模板下載。

  4、捋一下過程:

    點(diǎn)擊批量導(dǎo)入按鈕,跳轉(zhuǎn)到導(dǎo)入頁(yè)面。

    點(diǎn)擊模板下載。(事先寫好一個(gè)模板.xls文件,此按鈕放置下載鏈接)

    在模板中錄入數(shù)據(jù)。

    點(diǎn)擊導(dǎo)入按鈕,跳出文件上傳模態(tài)框。

    選擇文件,上傳文件。

    上傳成功后調(diào)用后臺(tái)方法,讀取文件內(nèi)容。

    把內(nèi)容生成表格,顯示到導(dǎo)入頁(yè)面。

    觀察數(shù)據(jù)有沒有出錯(cuò)。

    點(diǎn)擊確認(rèn)導(dǎo)入,調(diào)用后臺(tái)方法,執(zhí)行導(dǎo)入操作。

    回調(diào)函數(shù),導(dǎo)入成功/導(dǎo)入失敗 的提示。

二、代碼分析

   1、前端js代碼:

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

$(function() {
  //加載數(shù)據(jù)
  loadData();
  //上傳文件
  uploadFile({
    subfix: ['xls'],
    subfixTip: "請(qǐng)選擇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");
    }
  });
  //導(dǎo)入
  $("#btn-import").click(function() {
    var html = template("importTpl");
    $("#import-body").html(html);
    $("#myModal-import").modal();
  });
  //確認(rèn)導(dǎo)入
  $("#btn-sure").click(function() {
    var type = $("#indentity-type").val();
    alertify.confirm("確定要全部導(dǎo)入嗎?", function(e) {
      if (!e) { return; } else {
        $.post("/alumni-import!saveReal?type=" + type, function(data) {
          alertify.alert("導(dǎo)入成功!", function() {
            location.href = "/alumni!hrefPage";
          });
        }, "json");
      }
    });
  });
});50 
function loadData() {
  var options = {
    url: actionPath + "!page"
  };
  loadPaginationData(options);
}

2、后臺(tái)功能代碼

    前端有四個(gè)請(qǐng)求,一個(gè)初始化頁(yè)面數(shù)據(jù)加載,當(dāng)然,一開始是沒有數(shù)據(jù)的;一個(gè)導(dǎo)入文件上傳;一個(gè)確認(rèn)導(dǎo)入;一個(gè)導(dǎo)入完成后頁(yè)面跳轉(zhuǎn)回要信息頁(yè)面(信息頁(yè)面有一個(gè)批量導(dǎo)入跳轉(zhuǎn)到這的導(dǎo)入頁(yè)面)。

    第一個(gè)后最后一個(gè)就不講了。講一下第二個(gè)和第三個(gè)。

   ?、俚诙€(gè)

//上傳文件后調(diào)用
  public void importExcel() {
    try {
      //清空臨時(shí)表的數(shù)據(jù)
      baseAlumniImportSrv.deleteAll();
      //讀取文件
      File file = gridFsDao.readFile(f_id);
      //把文件信息給臨時(shí)表
      int count = excelXYSrv.importExcel(file);
      //清空上傳的文件
      file.delete();
      sendSuccessMsg(count, "上傳成功" + count + "條數(shù)據(jù)");
    } catch (IOException e) {
      LOGGER.error(e);
      sendFailMsg(null, "上傳失敗");
    }
  }
@Override  //使用MongoDB GridFS,具體詳解請(qǐng)各自初學(xué)者自行百度,注釋寫不下去了,我也不會(huì),心態(tài)爆炸~~~
  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中讀取數(shù)據(jù),并存儲(chǔ)到數(shù)據(jù)庫(kù)臨時(shí)表中
   * @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;
  }

?、诘谌齻€(gè)

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, "導(dǎo)入成功" + importList.size() + "條數(shù)據(jù)");
  }
@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;
  }

 沒啥好講的……會(huì)的應(yīng)該都能看懂,看不懂的我也不會(huì)……

三、結(jié)果圖

總結(jié)

以上就是本文關(guān)于java 導(dǎo)入Excel思路及代碼示例的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:

Java解壓zip文件完整代碼分享

Java探索之Thread+IO文件的加密解密代碼實(shí)例

Java編程獲取文件列表及子文件目錄的方法(非遞歸)

如有不足之處,歡迎留言指出。

相關(guān)文章

  • Maven 構(gòu)建插件的自定義配置方式

    Maven 構(gòu)建插件的自定義配置方式

    Maven是一個(gè)強(qiáng)大的構(gòu)建工具,支持自定義配置的插件,本文介紹了如何在pom.xml中配置Maven插件,包括基本的插件配置結(jié)構(gòu)、常見插件的自定義配置以及如何控制插件的執(zhí)行順序,通過這些配置,開發(fā)者可以更靈活地管理項(xiàng)目的構(gòu)建過程,提高構(gòu)建效率,感興趣的朋友一起看看吧
    2025-02-02
  • Java?Collection接口中的常用方法總結(jié)

    Java?Collection接口中的常用方法總結(jié)

    這篇文章將大概用代碼案例簡(jiǎn)單總結(jié)一下?Collection?接口中的一些方法,我們會(huì)以他的實(shí)現(xiàn)類?Arraylist?為例創(chuàng)建對(duì)象??煲黄饋?lái)看看吧
    2022-12-12
  • SpringBoot對(duì)Druid配置SQL監(jiān)控功能失效問題及解決方法

    SpringBoot對(duì)Druid配置SQL監(jiān)控功能失效問題及解決方法

    這篇文章主要介紹了SpringBoot對(duì)Druid配置SQL監(jiān)控功能失效問題的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • SpringBoot中實(shí)現(xiàn)數(shù)據(jù)脫敏處理的方法詳解

    SpringBoot中實(shí)現(xiàn)數(shù)據(jù)脫敏處理的方法詳解

    項(xiàng)目開發(fā)中,在處理敏感信息時(shí),數(shù)據(jù)脫敏是一項(xiàng)重要的安全措施,本文主要為大家介紹了如何在SpringBoot項(xiàng)目中進(jìn)行數(shù)據(jù)脫敏處理,有需要的可以了解下
    2025-03-03
  • java多線程編程技術(shù)詳解和實(shí)例代碼

    java多線程編程技術(shù)詳解和實(shí)例代碼

    這篇文章主要介紹了 java多線程編程技術(shù)詳解和實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • JAVA構(gòu)造方法/構(gòu)造器以及this使用方式

    JAVA構(gòu)造方法/構(gòu)造器以及this使用方式

    這篇文章主要介紹了JAVA構(gòu)造方法/構(gòu)造器以及this使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • MapStruct處理Java中實(shí)體與模型間不匹配屬性轉(zhuǎn)換的方法

    MapStruct處理Java中實(shí)體與模型間不匹配屬性轉(zhuǎn)換的方法

    今天小編就為大家分享一篇關(guān)于MapStruct處理Java中實(shí)體與模型間不匹配屬性轉(zhuǎn)換的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • Maven構(gòu)建時(shí)跳過部分測(cè)試的實(shí)例

    Maven構(gòu)建時(shí)跳過部分測(cè)試的實(shí)例

    下面小編就為大家分享一篇Maven構(gòu)建時(shí)跳過部分測(cè)試的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助
    2017-11-11
  • Jmeter如何將每次測(cè)試的結(jié)果保存到文件中

    Jmeter如何將每次測(cè)試的結(jié)果保存到文件中

    這篇文章主要介紹了Jmeter如何將每次測(cè)試的結(jié)果保存到文件中的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java基礎(chǔ)之Unsafe內(nèi)存操作不安全類詳解

    Java基礎(chǔ)之Unsafe內(nèi)存操作不安全類詳解

    Java是面向?qū)ο笳Z(yǔ)言,在使用Java編程時(shí),大多數(shù)情況下都不會(huì)直接操作內(nèi)存,而且Java也不提倡直接操作內(nèi)存,但是Java中到底有沒有可以直接操作內(nèi)存的工具類呢?有!Java中提供Unsafe類可以用來(lái)來(lái)直接操作內(nèi)存,文中詳細(xì)介紹了Unsafe內(nèi)存操作不安全類,需要的朋友可以參考下
    2021-06-06

最新評(píng)論

临泉县| 潞城市| 读书| 华阴市| 镇雄县| 甘德县| 淅川县| 双流县| 林芝县| 邢台市| 青海省| 酒泉市| 江都市| 安乡县| 伊金霍洛旗| 汝阳县| 延吉市| 龙游县| 启东市| 任丘市| 辽阳市| 柯坪县| 北流市| 游戏| 泸州市| 乌拉特前旗| 化德县| 宜章县| 多伦县| 平江县| 扶风县| 建昌县| 福鼎市| 泾阳县| 高台县| 铁岭县| 台北市| 常山县| 金坛市| 梁山县| 樟树市|