SpringBoot整合easyexcel

SpringBoot整合easyexcel

easyexcel:poi工具类,处理excel

官网:[EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel (alibaba.com)](https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write)
在这里插入图片描述

1、基础篇
1、导入依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.1.1</version>
</dependency>

2、对象
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

import java.util.Date;

@Getter
@Setter
@ColumnWidth(12) //设置全部宽度
@EqualsAndHashCode
public class DemoData {
    @ColumnWidth(20) //单独设置宽度
    @ExcelProperty("字符串标题")
    private String string;
    @ExcelProperty("日期标题")
    private Date date;
    @ExcelProperty("数字标题")
    private Double doubleData;
    /**
     * 忽略这个字段
     */
    @ExcelIgnore
    private String ignore;
}
3、工具类
public static List<DemoData> data() {
        List<DemoData> list =new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            DemoData data = new DemoData();
            data.setString("字符串" + i);
            data.setDate(new Date());
            data.setDoubleData(0.56);
            list.add(data);
        }
        return list;
    }
4、测试
 public static void main(String[] args) {
        // 注意 simpleWrite在数据量不大的情况下可以使用(5000以内,具体也要看实际情况),数据量大参照 重复多次写入

        // 写法1 JDK8+
        // since: 3.0.0-beta1
        String fileName =  "E:\\IDE项目\\ide项目\\SpringBoot\\springboot-easyexcel\\src\\main"+ ".xlsx";
        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        EasyExcel.write(fileName, DemoData.class)
                .sheet("模板")
                .doWrite(data());
    }
2、进阶篇
1、vue
    //导入excel
    exportexcel(){
      console.log(this.multipleSelection)
      this.axios.post("http://localhost:8001/tMeeting/exportexcel",
        {meetingmap: this.multipleSelection},
        {responseType:"blob"}).then(response => {
        let blob = new Blob([response.data], { type: 'application/vnd.ms-excel;charset=utf-8' })
        let downloadElement = document.createElement('a');
        let href = window.URL.createObjectURL(blob); //创建下载的链接
        downloadElement.href = href;
        downloadElement.download = '会议通知.xlsx';     //下载后文件名
        document.body.appendChild(downloadElement);
        downloadElement.click();                     //点击下载
        document.body.removeChild(downloadElement);  //下载完成移除元素
        window.URL.revokeObjectURL(href);            //释放掉blob对象
        this.$refs.multipleTable.clearSelection();//清空表格所选中的选项
      })

    }
2、工具类
package edu.hunnan.net.util;
/**
 * 导入会议Excel
 */
@Component
public class TMeetingExcel {
    private List<TMeeting> data(List<TMeeting> meetings) {
        List<TMeeting> list = ListUtils.newArrayList();
        for (TMeeting meeting : meetings) {
            if(meeting.getIsStatus().equals("0")){
                meeting.setIsStatus("审批中");
            }else{
                meeting.setIsStatus("已审批");
            }
            if (meeting.getIsMessage().equals("0")) {
                meeting.setIsMessage("暂未通知");
            }else{
                meeting.setIsMessage("已通知");
            }
            list.add(meeting);
        }
        return list;
    }

    public void simpleWrite(HttpServletResponse response,List<TMeeting> meetings) throws IOException {
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), TMeeting.class).sheet("会议通知").doWrite(data(meetings));

    }

}

3、controller
 /**
     * 会议通知导入Excel
     * @param meetingmap
     */
    @PostMapping("/exportexcel")
    public void exportExcel(@RequestBody Map<String,List<TMeeting>> meetingmap, HttpServletResponse response) throws IOException {
        for (Map.Entry<String, List<TMeeting>> listEntry : meetingmap.entrySet()) {
            for (TMeeting tMeeting : listEntry.getValue()) {
                log.info("会议是->{}",tMeeting);
            }
            tMeetingExcel.simpleWrite(response,listEntry.getValue());
        }
    }
3、实战
1、导入
1.1、controller
   /**
     * 学生基本信息导入
     * @param file
     * @return
     */
    @PostMapping("/studentInfoImportExcel")
    public ResponseEntity studentImportExcel(@RequestParam("file") MultipartFile file){
        int i = studentAchievementService.insertBatchStudentInfo(file);
        if(i == 1){
            return ResponseEntity.ok("请求成功");
        }else if(i == 2){
            return ResponseEntity.status(500).body("格式错误");
        }

        return ResponseEntity.status(500).body("导入失败");
    }
1.2、service
  //解析Excel
	public List<StudentInfoExcel insertBatchStudentInfo(MultipartFile file){
        return studentInfoExcelList = studentInfoExcel(file.getInputStream());
    }
     

 /**
     * 解析学生基本信息模板Excel
     *
     * @param inputStream
     * @return
     */
    public List<StudentInfoExcel> studentInfoExcel(InputStream inputStream) {
        List<StudentInfoExcel> list = new ArrayList<>();

        EasyExcel.read(inputStream).head(StudentInfoExcel.class).sheet("大学生人才信息表") //表格名称一致否则找不到
                //通过监听器去解析表格
                .registerReadListener(new AnalysisEventListener<StudentInfoExcel>() {
                    @Override
                    //一行一行的进行解析
                    public void invoke(StudentInfoExcel studentInfoExcel, AnalysisContext analysisContext) {
                        list.add(studentInfoExcel);
                    }

                    @Override
                    //解析完成之后执行此回调
                    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                        System.out.println("解析完成");
                    }
                }).doRead();//doRead开始执行
        return list;
    }
1.3、vue
//学生基本信息Excel导入
    studentInfoImportExcel(item){
      this.loading = true;
      let fileObj = item.file;
      console.log(fileObj);
      const form = new FormData();
      form.append("file", fileObj);
      // form.append("type", type);
      this.$http({
        url: "/proxyApi/admin/studentTraceability/studentInfoImportExcel",
        method: "POST",
        headers: { "Content-type": "multipart/form-data" },
        data: form
      }).then(res => {
        this.loading = false;
        console.log(res);
        this.$refs.upload.clearFiles(); //清空上传组件
        if (res.status == 200) {
          this.$message({
            message: "导入成功",
            type: "success"
          });
        }
      });
    },
2、下载
2.1、controller
   /**
     * 成绩以及学生信息下载
     * @param response
     * @param list
     * @return
     */
    @PostMapping("/downloadExcel")
    public void downloadExcel(HttpServletResponse response,@RequestBody List<StudentInfoDownloadExcel> list) {
        studentTracingInfoService.downloadExcel(response,list);
    }
2.2、service
 @Override
    public void downloadExcel(HttpServletResponse response, List<StudentInfoDownloadExcel> list) {
        if(list.size() == 0){
            try {
                throw new Exception("请至少选择一个");
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        List list1 = new ArrayList();
        


        String fileName = null;
        try {
            fileName = URLEncoder.encode( "成绩及基本信息下载" + ".xlsx", "utf-8");
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName);
            EasyExcel.write(response.getOutputStream(), StudentInfoDownloadExcel.class)
                    .sheet("成绩及基本信息")
                    .doWrite(list);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
2.3、vue

        
        
         //成绩下载
    download() {
      if (this.multipleSelection.length == 0) {
        this.$message({
          message: "请至少选择一个下载",
          type: "warning"
        });
        return;
      }
      console.log(this.multipleSelection);
      this.loading = true;
      this.$http({
        url: "/proxyApi/admin/studentTraceability/downloadExcel",
        method: "post",
        data: this.multipleSelection,
        responseType: "blob"
      }).then(res => {
        console.log("res data = " + res.data);
        let blob = new Blob([res.data], {
          type: "application/vnd.ms-excel;charset=utf-8"
        }); // 文件类型
        console.log(res.headers["content-disposition"]); // 从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx") 设置的文件名;
        //以=分割取数组[1]元素为文件名
        let filename = window.decodeURI(
          res.headers["content-disposition"].split("=")[1]
        );
        let url = window.URL.createObjectURL(blob); // 创建下载链接
        let aLink = document.createElement("a"); // 赋值给a标签的href属性
        aLink.style.display = "none";
        aLink.href = url;
        aLink.setAttribute("download", filename);
        document.body.appendChild(aLink); // 将a标签挂载上去
        aLink.click(); // a标签click事件
        document.body.removeChild(aLink); // 移除a标签
        window.URL.revokeObjectURL(url); // 销毁下载链接
        this.loading = false;
        this.$message({
          message: "下载成功",
          type: "success"
        });
      });
    },
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot整合EasyExcel可以使得我们在使用Java编程语言操作Excel文件时更加方便快捷,无需手动处理Excel的复杂格式和数据类型转换问题。下面是一个简单的示例: 1. 引入EasyExcel依赖 在pom.xml文件中添加以下依赖: ```xml <!-- EasyExcel --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.10</version> </dependency> ``` 2. 创建Excel模板类 ```java @Data public class ExcelData { @ExcelProperty(value = "姓名", index = 0) private String name; @ExcelProperty(value = "年龄", index = 1) private Integer age; @ExcelProperty(value = "性别", index = 2) private String gender; } ``` 3. 编写Excel读取代码 ```java @Service public class ExcelService { public List<ExcelData> readExcel(MultipartFile file) throws IOException { InputStream inputStream = file.getInputStream(); List<ExcelData> list = new ArrayList<>(); ExcelReader reader = new ExcelReader(inputStream, ExcelTypeEnum.XLSX, null, new AnalysisEventListener<ExcelData>() { @Override public void invoke(ExcelData data, AnalysisContext context) { list.add(data); } @Override public void doAfterAllAnalysed(AnalysisContext context) { } }); reader.read(new Sheet(1, 1, ExcelData.class)); return list; } } ``` 4. 编写Excel导出代码 ```java @Service public class ExcelService { public void writeExcel(HttpServletResponse response, List<ExcelData> list) throws IOException { response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); String fileName = URLEncoder.encode("测试文件.xlsx", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName); EasyExcel.write(response.getOutputStream(), ExcelData.class).sheet("测试").doWrite(list); } } ``` 以上就是Spring Boot整合EasyExcel的基本示例,可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值