easyPOI基本用法

参考网址:http://www.wupaas.com/

1.Excel文件的导入导出

项目源码:后台:https://github.com/zhongyushi-git/easypoi-demo-admin.git

     前端:https://github.com/zhongyushi-git/easypoi-demo.git

1.1准备工作

1)首先新建一个SpringBoot的项目,搭建基本的环境访问数据,详见源码。

2)导入easypoi依赖

  <!--easypoi进行excel操作-->
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-spring-boot-starter</artifactId>
            <version>3.3.0</version>
        </dependency>

3)创建Excel操作的工具类ExcelUtils

package com.example.easypoidemoadmin.utils;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;

/**
 * Excel导入导出工具类
 */

public class ExcelUtils {

    /**
     * excel 导出
     *
     * @param list     数据列表
     * @param fileName 导出时的excel名称
     * @param response
     */
    public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response) throws IOException {
        defaultExport(list, fileName, response);
    }

    /**
     * 默认的 excel 导出
     *
     * @param list     数据列表
     * @param fileName 导出时的excel名称
     * @param response
     */
    private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) throws IOException {
        //把数据添加到excel表格中
        Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
        downLoadExcel(fileName, response, workbook);
    }

    /**
     * excel 导出
     *
     * @param list         数据列表
     * @param pojoClass    pojo类型
     * @param fileName     导出时的excel名称
     * @param response
     * @param exportParams 导出参数(标题、sheet名称、是否创建表头,表格类型)
     */
    private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) throws IOException {
        //把数据添加到excel表格中
        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
        downLoadExcel(fileName, response, workbook);
    }

    /**
     * excel 导出
     *
     * @param list         数据列表
     * @param pojoClass    pojo类型
     * @param fileName     导出时的excel名称
     * @param exportParams 导出参数(标题、sheet名称、是否创建表头,表格类型)
     * @param response
     */
    public static void exportExcel(List<?> list, Class<?> pojoClass, String fileName, ExportParams exportParams, HttpServletResponse response) throws IOException {
        defaultExport(list, pojoClass, fileName, response, exportParams);
    }

    /**
     * excel 导出
     *
     * @param list      数据列表
     * @param title     表格内数据标题
     * @param sheetName sheet名称
     * @param pojoClass pojo类型
     * @param fileName  导出时的excel名称
     * @param response
     */
    public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, HttpServletResponse response) throws IOException {
        defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName, ExcelType.XSSF));
    }


    /**
     * excel 导出
     *
     * @param list           数据列表
     * @param title          表格内数据标题
     * @param sheetName      sheet名称
     * @param pojoClass      pojo类型
     * @param fileName       导出时的excel名称
     * @param isCreateHeader 是否创建表头
     * @param response
     */
    public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response) throws IOException {
        ExportParams exportParams = new ExportParams(title, sheetName, ExcelType.XSSF);
        exportParams.setCreateHeadRows(isCreateHeader);
        defaultExport(list, pojoClass, fileName, response, exportParams);
    }



   
    /**
     * excel下载
     *
     * @param fileName 下载时的文件名称
     * @param response
     * @param workbook excel数据
     */
    private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) throws IOException {
        try {
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + "." + ExcelTypeEnum.XLSX.getValue(), "UTF-8"));
            workbook.write(response.getOutputStream());
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }


    /**
     * excel 导入
     *
     * @param file      excel文件
     * @param pojoClass pojo类型
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(MultipartFile file, Class<T> pojoClass) throws IOException {
        return importExcel(file, 1, 1, pojoClass);
    }

    /**
     * excel 导入
     *
     * @param filePath   excel文件路径
     * @param titleRows  表格内数据标题行
     * @param headerRows 表头行
     * @param pojoClass  pojo类型
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass) throws IOException {
        if (StringUtils.isBlank(filePath)) {
            return null;
        }
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);
        params.setNeedSave(true);
        params.setSaveUrl("/excel/");
        try {
            return ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
        } catch (NoSuchElementException e) {
            throw new IOException("模板不能为空");
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }



    /**
     * excel 导入
     *
     * @param file       excel文件
     * @param titleRows  表格内数据标题行
     * @param headerRows 表头行
     * @param pojoClass  pojo类型
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass) throws IOException {
        return importExcel(file, titleRows, headerRows, false, pojoClass);
    }

    /**
     * excel 导入
     *
     * @param file       上传的文件
     * @param titleRows  表格内数据标题行
     * @param headerRows 表头行
     * @param needVerfiy 是否检验excel内容
     * @param pojoClass  pojo类型
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, boolean needVerfiy, Class<T> pojoClass) throws IOException {
        if (file == null) {
            return null;
        }
        try {
            return importExcel(file.getInputStream(), titleRows, headerRows, needVerfiy, pojoClass);
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }

    /**
     * excel 导入
     *
     * @param inputStream 文件输入流
     * @param titleRows   表格内数据标题行
     * @param headerRows  表头行
     * @param needVerfiy  是否检验excel内容
     * @param pojoClass   pojo类型
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(InputStream inputStream, Integer titleRows, Integer headerRows, boolean needVerfiy, Class<T> pojoClass) throws IOException {
        if (inputStream == null) {
            return null;
        }
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);
        params.setSaveUrl("/excel/");
        params.setNeedSave(true);
        params.setNeedVerfiy(needVerfiy);
        try {
            return ExcelImportUtil.importExcel(inputStream, pojoClass, params);
        } catch (NoSuchElementException e) {
            throw new IOException("excel文件不能为空");
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }

    /**
     * Excel 类型枚举
     */
    enum ExcelTypeEnum {
        XLS("xls"), XLSX("xlsx");
        private String value;

        ExcelTypeEnum(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }
}

4)创建数据库db2020及表user,执行脚本请下载。链接:https://pan.baidu.com/s/1u2BkcMjTzHiMEB2XPYC0-w ,提取码:86gz

5)excel表格要导入的数据请下载。链接:https://pan.baidu.com/s/1bK6ted72lPlq7anjOy7-Mw ,提取码:w2g4

6)使用vue-cli新建一个vue的项目,并安装需要的插件。项目对axios进行了封装,调用的时候,直接在js中使用即可,详见源码。

7)最后一点,要配置文件中加一行配置

#easypoi启用覆盖
spring
  main:
    allow-bean-definition-overriding: true

1.2导入

excel文件的导入,主要就是把文件上传之后把内容读取出来进行相应的操作。

1)编写controller导入接口,service及dao详见源码。需要注意的是,上述的导入的excel内容必须包含表头和标题,否则读取不到内容。

 /**
     * 导入数据
     * @param file
     * @return
     * @throws IOException
     */
    @RequestMapping(value = "/import", method = RequestMethod.POST)
    public CommonResult importExcel(@RequestParam("file") MultipartFile file) throws IOException {
        List<User> list = ExcelUtils.importExcel(file, User.class);
        int i = userService.insertByBatch(list);
        if (i != 0) {
            return new CommonResult(200, "导入成功");
        } else {
            return new CommonResult(444, "导入失败");
        }
    }

2)页面导入的组件

  <el-upload class="upload-demo" action="" :limit="1" :http-request="importExcel" :show-file-list="false" :file-list="fileList">
            <el-button size="small" type="primary" icon="el-icon-upload">导入</el-button>
          </el-upload>

3)页面导入的方法

  //导入
      importExcel(param) {
        const formData = new FormData()
        formData.append('file', param.file)
        home.upload(formData).then(res => {
          if (res.code == 200) {
            this.fileList = []
            this.$message.success("导入成功")
            this.getList()
          } else {
            this.$message.error("导入失败")
          }
        }).catch(err =>{
          console.log(err)
          this.$message.error("导入失败")
        })
      } 

1.3导出

导入就是根据查询的条件把查询结果先写到excel表格中,然后下载这个excel即可。

1)编写controller导出接口,service及dao详见源码。

/**
     * 导出数据,使用map接收
     *
     * @param map
     * @param response
     * @throws IOException
     */
    @PostMapping("/exportExcel")
    public void exportExcel(@RequestBody Map<String, Object> map, HttpServletResponse response) throws IOException {
        IPage<User> iPage = userService.getList((String) map.get("name"), (Integer) map.get("page"), (Integer) map.get("limit"));
        ExcelUtils.exportExcel(iPage.getRecords(), (String) map.get("title"), (String) map.get("sheetName"), User.class, (String) map.get("fileName"), response);
    }

2)给实体类加注解

package com.example.easypoidemoadmin.entity;

import cn.afterturn.easypoi.excel.annotation.Excel;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

/**
 * @author zhongyushi
 * @date 2020/6/24 0024
 * @dec 用户实体
 */
@Data
@TableName(value = "User")
public class User {

    /**
     * 用户名
     */
    @TableId(value = "username")
    @Excel(name = "用户名", orderNum = "0", width = 30)
    private String username;

    /**
     * 姓名
     */
    @TableField(value = "name")
    @Excel(name = "姓名", orderNum = "1", width = 30)
    private String name;

    /**
     * 年龄
     */
    @TableField(value = "age")
    @Excel(name = "年龄", orderNum = "2", width = 30)
    private Integer age;

    /**
     * 性别,0表示男,1表示女
     */
    @TableField(value = "sex")
    @Excel(name = "性别", orderNum = "3", width = 30,replace = {"男_0", "女_1"})
    private String sex;

    /**
     * 籍贯
     */
    @TableField(value = "address")
    @Excel(name = "籍贯", orderNum = "4", width = 30)
    private String address;

}

3)页面导出的方法

 //导出
      exportExcel() {
        this.downloadLoading = true
        home.exportExcel({
          title: '用户基本信息',
          sheetName: '用户信息',
          fileName: '用户信息表',
          name: this.pageData.name,
          page: this.pageData.page,
          limit: this.pageData.limit,
        }).then(res => {
          //使用js下载文件
          fileDownload(res, '用户信息表.xlsx')
        }).finally(() => {
          this.downloadLoading = false;
        });
      },

这里使用到了js-file-download插件,它是用来帮助下载文件的。当下载文件时,很多时候都是在地址栏输入url后浏览器自动帮忙下载,但是要统一请求方式,就把返回的二进制文件交给js-file-download进行处理后再下载。需要注意的是,这个导出的请求,我封装了一个单独的方法,需要指定响应的方式,否则无法下载后的文件是空的,方法截图如下:

1.4图片的导出

有了上面的导出基础,图片的导出就很简单了。

1)新建一个实体类,用于和上面的实体类区分

package com.example.easypoidemoadmin.entity;

import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;

/**
 * @author zhongyushi
 * @date 2020/6/26 0026
 * @dec 描述
 */
@Data
public class Company {
    @Excel(name = "公司名称",width =20)
    private String name;

    /**
     * type为 2 表示字段类型为图片
     * imageType为 1 表示从file读取
     */
    @Excel(name = "公司logo",width =20,type = 2,imageType = 1)
    private String logo;

    @Excel(name = "公司介绍",width =100)
    private String dec;

    public Company(String name,String logo,String dec){
        this.name=name;
        this.logo=logo;
        this.dec=dec;
    }
}

2)创建接口

 /**
     * 图片的导出
     * @param response
     * @throws IOException
     */
    @GetMapping("/imgexport")
    public void imgExport(HttpServletResponse response) throws IOException {
        List<Company> list=new ArrayList<>();
        //图片的路径自定义,但必须要正确
        list.add(new Company("百度","E:/img/1.jpg","百度一下你就知道"));
        list.add(new Company("腾讯","E:/img/3.jpg","腾讯qq,交流的世界"));
        list.add(new Company("阿里巴巴","E:/img/2.jpg","阿里巴巴,马云的骄傲"));
        ExcelUtils.exportExcel(list,"公司介绍","公司介绍",Company.class,"公司介绍",response);
    }

3)简单起见,直接使用浏览器地址栏进行测试。在浏览器输入http://localhost:8001/easypoidemo-admin/api/user/imgexport即可进行下载,下载的文件如图

1.5图片的导入

1)给Company对象加上无参构造,否则会出现异常

  public Company(){}

2)导入接口

 /**
     * 导入图片
     * @param file
     * @return
     * @throws IOException
     */
    @PostMapping("/imgimport")
    public CommonResult imgImport(@RequestParam("file") MultipartFile file) throws IOException {
        List<Company> list = ExcelUtils.importExcel(file, Company.class);
       return new CommonResult(200,"导入成功",list);
    }

3)参考excel的导入,添加一个导入的按钮和请求的方法,详见源码

4)点击excel图片上传,把上一步导出的文件进行导入,看到浏览器返回的数据如图

猜你喜欢

转载自www.cnblogs.com/zys2019/p/13194068.html