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

Spring Boot整合EasyExcel(完整版包含上傳解析excel和下載模板)

 更新時間:2020年12月31日 14:31:34   作者:一個還沒入門的程序員  
這篇文章主要介紹了Spring Boot整合EasyExcel(完整版包含上傳解析excel和下載模板),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

1. 加入依賴

 <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>easyexcel</artifactId>
      <version>2.2.7</version>
    </dependency>

2. 對讀取excel內(nèi)容(批量添加)

@PostMapping("plUpdate")
  public R plUpdate(@RequestParam("filename") MultipartFile file) throws IOException {
    //String Originalfilename = file.getOriginalFilename();
    // String fileName = file.getName();
   // System.out.println("orname="+Originalfilename+";"+"filename"+file.getName());

    // 獲取文件全名
    String fileName = file.getOriginalFilename();
     //設(shè)置文件路徑
    String templatePath = "G:/excel/";
    File dest0 = new File(templatePath);
    File dest = new File(dest0, fileName);
    //文件上傳-覆蓋
    try {
      // 檢測是否存在目錄
      if (!dest0.getParentFile().exists()) {
        dest0.getParentFile().mkdirs();
        //檢測文件是否存在
      }
      if (!dest.exists()) {
        dest.mkdirs();
      }
      file.transferTo(dest);
    } catch (Exception e) {
      return R.error();
    }

    String finameUrl = templatePath+fileName;
    ExcelReader excelReader = null;
    try {
    //TeacherExcel.class對應的是和模板一樣的實體類,
    //eduTeacherService對應持久層的接口
      excelReader = EasyExcel.read(finameUrl, TeacherExcel.class, new DemoDataListener(eduTeacherService)).build();
      ReadSheet readSheet = EasyExcel.readSheet(0).build();
      excelReader.read(readSheet);
    } finally {

      if (excelReader != null) {
        // 這里千萬別忘記關(guān)閉,讀的時候會創(chuàng)建臨時文件,到時磁盤會崩的
        excelReader.finish();
      }
    }
    return R.ok();
  }

創(chuàng)建一個監(jiān)聽類:

package com.atguigu.excel;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.atguigu.eduservice.entity.EduTeacher;
import com.atguigu.eduservice.entity.vo.TeacherExcel;
import com.atguigu.eduservice.service.EduTeacherService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;

// 有個很重要的點 DemoDataListener 不能被spring管理,要每次讀取excel都要new,然后里面用到spring可以構(gòu)造方法傳進去
public class DemoDataListener extends AnalysisEventListener<TeacherExcel> {
  private static final Logger LOGGER = LoggerFactory.getLogger(DemoDataListener.class);
  //這里寫持久層的類
  private EduTeacherService eduTeacherService;
  
  /**

   * 如果使用了spring,請使用這個構(gòu)造方法。每次創(chuàng)建Listener的時候需要把spring管理的類傳進來

   *

   * @param eduTeacherService

   */

  public DemoDataListener( EduTeacherService eduTeacherService) {
        //進行持久層的類
    this.eduTeacherService = eduTeacherService;

  }
  

  /**
   * 每隔5條存儲數(shù)據(jù)庫,實際使用中可以3000條,然后清理list ,方便內(nèi)存回收
   */
  private static final int BATCH_COUNT = 5;
  List<TeacherExcel> list = new ArrayList<TeacherExcel>();
  /**
   * 假設(shè)這個是一個DAO,當然有業(yè)務(wù)邏輯這個也可以是一個service。當然如果不用存儲這個對象沒用。
   */
  //private DemoDAO demoDAO;
  public DemoDataListener() {
    // 這里是demo,所以隨便new一個。實際使用如果到了spring,請使用下面的有參構(gòu)造函數(shù)
    //demoDAO = new DemoDAO();
  }
  /**
   * 如果使用了spring,請使用這個構(gòu)造方法。每次創(chuàng)建Listener的時候需要把spring管理的類傳進來
   *
   * @param demoDAO
   */
  /* public DemoDataListener(DemoDAO demoDAO) {
    this.demoDAO = demoDAO;
  }*/
  /**
   * 這個每一條數(shù)據(jù)解析都會來調(diào)用
   *
   * @param data
   *      one row value. Is is same as {@link AnalysisContext#readRowHolder()}
   * @param context
   */
  @Override
  public void invoke(TeacherExcel data, AnalysisContext context) {
    LOGGER.info("解析到一條數(shù)據(jù):{}",data.toString());
    list.add(data);
    // 達到BATCH_COUNT了,需要去存儲一次數(shù)據(jù)庫,防止數(shù)據(jù)幾萬條數(shù)據(jù)在內(nèi)存,容易OOM

  }
  /**
   * 所有數(shù)據(jù)解析完成了 都會來調(diào)用
   *
   * @param context
   */
  @Override
  public void doAfterAllAnalysed(AnalysisContext context) {
    // 這里也要保存數(shù)據(jù),確保最后遺留的數(shù)據(jù)也存儲到數(shù)據(jù)庫
    saveData();
    LOGGER.info("所有數(shù)據(jù)解析完成!");
  }
  /**
   * 加上存儲數(shù)據(jù)庫
   */
  private void saveData() {
    LOGGER.info("{}條數(shù)據(jù),開始存儲數(shù)據(jù)庫!", list.size());
    //因為我excel模板的實體和插入數(shù)據(jù)庫實體的類不一樣,所以需要進行轉(zhuǎn)化

    for (int i =0;i<list.size();i++ ){
      EduTeacher teacher = new EduTeacher();
      teacher.setLevel(list.get(i).getLevel());
      teacher.setCareer(list.get(i).getCareer());
      teacher.setName(list.get(i).getName());
      teacher.setSort(list.get(i).getSort());
      teacher.setIntro(list.get(i).getIntro());
      boolean save = eduTeacherService.save(teacher);
      if (save){
        System.out.println("第"+i+"添加成功");
      }
    }
  } 
}

例如我的excel模板是:

在這里插入圖片描述

實體類:

字段上ExcelProperty的注解可以使用index聲明字段在模板中的順序,使用value聲明模板各個字段的名稱。
例如:

@ExcelProperty(value = “講師簡介”,index = 1)
private String intro;

在這里插入圖片描述

模板的實體類要和excel字段一樣對應,不然會出錯

效果:

在這里插入圖片描述

3. 模板下載:

創(chuàng)建一個工具類:

package com.atguigu.eduservice.config;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import org.apache.poi.ss.usermodel.HorizontalAlignment;

import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;

/**
 * @author linjiazeng
 * @version 1.0
 * @date 2020/12/28 22:29
 **/
public class ExcelUtil {

  /**
   * 導出
   * @param response
   * @param data
   * @param fileName
   * @param sheetName
   * @param clazz
   * @throws Exception
   */
  public static void writeExcel(HttpServletResponse response, List<? extends Object> data, String fileName, String sheetName, Class clazz) throws Exception {
    //表頭樣式
    WriteCellStyle headWriteCellStyle = new WriteCellStyle();
    //設(shè)置表頭居中對齊
    headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
    //內(nèi)容樣式
    WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
    //設(shè)置內(nèi)容靠左對齊
    contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
    HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
    EasyExcel.write(getOutputStream(fileName, response), clazz).excelType(ExcelTypeEnum.XLSX).sheet(sheetName).registerWriteHandler(horizontalCellStyleStrategy).doWrite(data);
  }
  private static OutputStream getOutputStream(String fileName, HttpServletResponse response) throws Exception {
    fileName = URLEncoder.encode(fileName, "UTF-8");
    response.setContentType("application/vnd.ms-excel");
    response.setCharacterEncoding("utf8");
    response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
    response.addHeader("Access-Control-Expose-Headers", "Content-disposition");

    return response.getOutputStream();
  }
}

調(diào)用工具類下載模板

 /*下載模板*/
  @GetMapping("/download/template")
  public void downloadTemplate(HttpServletResponse response){
    String fileName = "導入講師模板";
    String sheetName="導入講師模板";
    List<TeacherExcel> teacherExcelList = new ArrayList<>();
    TeacherExcel teacherExcel = new TeacherExcel();
    teacherExcel.setName("ljz");
    teacherExcel.setIntro("清華畢業(yè),高材生");
    teacherExcel.setCareer("資深講師");
    teacherExcel.setSort(1);
    teacherExcel.setLevel(1);
    teacherExcelList.add(teacherExcel);
    try {
      //TeacherExcel.class對應你的模板類
      //teacherExcelList模板的例子
      //也可以使用這種方式導出你查詢出數(shù)據(jù)excel文件
      ExcelUtil.writeExcel(response,teacherExcelList,fileName,sheetName,TeacherExcel.class);
    } catch (Exception e) {
      System.out.println(e.getCause());

    }
  }

效果:

在這里插入圖片描述

有問題可以互相交流,也可以去EasyExcel官網(wǎng)學習

到此這篇關(guān)于Spring Boot整合EasyExcel(完整版包含上傳解析excel和下載模板)的文章就介紹到這了,更多相關(guān)SpringBoot整合EasyExcel內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot創(chuàng)建非可執(zhí)行jar包的實例教程

    Spring Boot創(chuàng)建非可執(zhí)行jar包的實例教程

    這篇文章主要介紹了Spring Boot創(chuàng)建非可執(zhí)行jar包的實例教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Struts2學習教程之入門小白的開始基礎(chǔ)

    Struts2學習教程之入門小白的開始基礎(chǔ)

    struts2其實就是為我們封裝了servlet,簡化了jsp跳轉(zhuǎn)的復雜操作,并且提供了易于編寫的標簽,可以快速開發(fā)view層的代碼。下面這篇文章主要給各位想要學習Struts2的小白們詳細介紹了關(guān)于Struts2入門的一些開始基礎(chǔ),需要的朋友可以參考下
    2018-04-04
  • java實現(xiàn)分段讀取文件并通過HTTP上傳的方法

    java實現(xiàn)分段讀取文件并通過HTTP上傳的方法

    這篇文章主要介紹了java實現(xiàn)分段讀取文件并通過HTTP上傳的方法,實例分析了java分段讀取文件及使用http實現(xiàn)文件傳輸?shù)南嚓P(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • Spring IOC控制反轉(zhuǎn)的實現(xiàn)解析

    Spring IOC控制反轉(zhuǎn)的實現(xiàn)解析

    這篇文章主要介紹了Spring IOC控制反轉(zhuǎn)的實現(xiàn),IOC是Spring的核心思想之一,它通過將對象的創(chuàng)建、依賴注入和生命周期管理交給容器來實現(xiàn)解耦,使開發(fā)者能夠更專注于業(yè)務(wù)邏輯的實現(xiàn),需要的朋友可以參考下
    2025-02-02
  • Mybatis resultType返回結(jié)果為null的問題排查方式

    Mybatis resultType返回結(jié)果為null的問題排查方式

    這篇文章主要介紹了Mybatis resultType返回結(jié)果為null的問題排查方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java之多個線程順序循環(huán)執(zhí)行的幾種實現(xiàn)

    Java之多個線程順序循環(huán)執(zhí)行的幾種實現(xiàn)

    這篇文章主要介紹了Java之多個線程順序循環(huán)執(zhí)行的幾種實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • SpringBoot項目將mybatis升級為mybatis-plus的方法

    SpringBoot項目將mybatis升級為mybatis-plus的方法

    本文主要介紹了SpringBoot項目將mybatis升級為mybatis-plus的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • Java實現(xiàn)的JSONUtil工具類與用法示例

    Java實現(xiàn)的JSONUtil工具類與用法示例

    這篇文章主要介紹了Java實現(xiàn)的JSONUtil工具類與用法,結(jié)合實例形式分析了Java操作json格式數(shù)據(jù)工具類JSONUtil的定義與簡單使用技巧,需要的朋友可以參考下
    2018-07-07
  • Spring?Kafka中如何通過參數(shù)配置解決超時問題詳解

    Spring?Kafka中如何通過參數(shù)配置解決超時問題詳解

    這篇文章主要給大家介紹了關(guān)于Spring?Kafka中如何通過參數(shù)配置解決超時問題的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-01-01
  • springboot運行時新增/更新外部接口的實現(xiàn)方法

    springboot運行時新增/更新外部接口的實現(xiàn)方法

    這篇文章主要介紹了springboot運行時新增/更新外部接口的實現(xiàn)方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03

最新評論

裕民县| 沁源县| 郯城县| 扎鲁特旗| 九龙县| 方正县| 青岛市| 康定县| 万州区| 视频| 荔浦县| 明星| 泰州市| 朝阳县| 桐梓县| 于田县| 南召县| 三都| 奉贤区| 安西县| 洞口县| 康马县| 淮安市| 岑溪市| 孙吴县| 湘阴县| 赤壁市| 呼玛县| 花垣县| 元江| 林州市| 平舆县| 桂平市| 民乐县| 恩平市| 集贤县| 临湘市| 岳池县| 福海县| 永年县| 枣强县|