java对excel导入和导出处理的几种方法(一)使用easypoi

以下所有方法本人都亲测有效,如需转载,请标明出处。

方法一:使用 easypoi(顾名思义,该工具用法非常简单,能满足大部分人的需求)

文档学习 EasyPoi教程
因为文档已经写的非常详细,基本上不需要我过多的解释,就放一个简单的demo,演示一下超好用的easypoi工具的入门使用。
本人基于Spring boot + Maven实现demo,所以直接上pom文件,需要jar包的同学可自行去maven仓库下载


pom依赖


<dependency>
  <groupId>cn.afterturngroupId>
    <artifactId>easypoi-baseartifactId>
    <version>3.1.0version>
dependency>
<dependency>
    <groupId>cn.afterturngroupId>
    <artifactId>easypoi-webartifactId>
    <version>3.1.0version>
dependency>
<dependency>
    <groupId>cn.afterturngroupId>
    <artifactId>easypoi-annotationartifactId>
    <version>3.1.0version>
dependency>
<dependency>
     <groupId>org.projectlombokgroupId>
     <artifactId>lombokartifactId>
     <version>1.16.20version>
     <scope>providedscope>
 dependency>

导入对象

package zero.excel.domain;

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

import java.util.Date;

/**
 * @author Zero
 * @date 2018/11/8
 */
@Data
public class ExcelImport {

    @Excel(name = "测试标题")
    private String title;

    //可以自动替换excel中内容
    @Excel(name = "中英文类型", replace = {"中文_CN", "英文_EN"})
    private String type;

    @Excel(name = "日期")
    private Date date;
}

导出对象

package zero.excel.domain;

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

import java.util.Date;

/**
 * @author Zero
 * @date 2018/11/9
 */
@Data
@AllArgsConstructor
public class ExcelExport {

    @Excel(name = "测试标题")
    private String title;

    //可以自动替换excel中内容
    @Excel(name = "中英文类型", replace = {"中文_CN", "英文_EN"})
    private String type;

    @Excel(name = "日期", format = "yyyy-MM-dd HH:mm:ss")
    private Date date;
}

Controller

package zero.excel.controller;

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.poi.ss.usermodel.Workbook;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import zero.excel.domain.ExcelExport;
import zero.excel.domain.ExcelImport;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * @author Zero
 * @date 2018/11/8
 */
@RestController
@RequestMapping("/excelReader")
public class ExcelDemoController {

    /**
     * excel导入
     *
     * @param file 导入文件
     * @return excel对象数组
     */
    @PostMapping(value = "/excelImport")
    public Object importExcel(@RequestParam("file") MultipartFile file) {

        //接收导入数组
        List<ExcelImport> excelImportList = null;
        try {
            excelImportList = ExcelImportUtil.importExcel(file.getInputStream(), ExcelImport.class, new ImportParams());
        } catch (Exception e) {
            e.printStackTrace();
        }

        return excelImportList;
    }

    /**
     * excel 下载
     *
     * @param response response只能使用一次
     */
    @RequestMapping(value = "/excelExport")
    public void exportExcel(HttpServletResponse response) {
        //mock 下载导出测试数据
        ExcelExport export1 = new ExcelExport("测试1", "CN", new Date());
        ExcelExport export2 = new ExcelExport("测试2", "EN", new Date());
        List<ExcelExport> list = new ArrayList<>();
        list.add(export1);
        list.add(export2);

        //参数配置
        ExportParams params = new ExportParams();
        //此处设置ExcelType HSSF为excel2003版本,XSSF为excel2007版本
        params.setType(ExcelType.XSSF);
        Workbook workbook = ExcelExportUtil.exportExcel(params, ExcelExport.class, list);
        ExcelUtil.downloadExcel(response, workbook, "excel-export");
    }

工具类

package zero.excel.util;

import org.apache.poi.ss.usermodel.Workbook;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;

/**
 * @author Zero
 * @date 2018/11/9
 */
public class ExcelUtil {

    /**
     * 下载通用配置
     *
     * @param response  HttpServletResponse
     * @param workbook  Workbook
     * @param excelName excelName
     */
    public static void downloadExcel(HttpServletResponse response, Workbook workbook, String excelName) {
        try (OutputStream os = response.getOutputStream()) {

            response.reset();
            if (excelName == null) {
                excelName = UUID.randomUUID().toString();
            }
            response.setHeader("Content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "inline; filename=" + new String(excelName.getBytes("gb18030"), "ISO8859-1") + ".xlsx");
            workbook.write(os);
            os.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

导入excel内容
java对excel导入和导出处理的几种方法(一)使用easypoi_第1张图片
postman返回结果

[
    {
        "title": "测试1",
        "type": "CN",
        "date": "2018-11-9"
    },
    {
        "title": "测试2",
        "type": "EN",
        "date": "Fri Nov 09 00:00:00 CST 2018"
    }
]

下载测试结果(下载内容已在controller中写入)
java对excel导入和导出处理的几种方法(一)使用easypoi_第2张图片

以上内容就是easypoi的简单使用


--------------------------------------------------华丽的分割线--------------------------------------------------------------


20190110更新

简单补充easypoi工具的注解变种:
基于List 的导出,ExcelExportEntity是注解经过处理翻译成的实体类,两者几乎是一对的,所以如果我们要动态自定义导出列,我们只要动态拼装ExcelExportEntity就可以了
再整合上反射的方式,动态获取前端传入的对象 ExcelExportJudgementConditionQO 里面存放布尔类型属性,作为导出依据。

		List<ExcelExportEntity> entityList = new ArrayList<>();
		Class judgementClass = ExcelExportJudgementConditionQO.class;
        Field[] judgementFields = PoiPublicUtil.getClassFields(judgementClass);
        for (Field f:judgementFields){
            try {
                f.setAccessible(true);
                //在此判断,是否需要导出
                boolean flag = Boolean.parseBoolean(f.get(excelExportJudgementConditionQO).toString());
                if (flag) {
                //将需要导出的列放入导出实体对象中
                    Excel excel = f.getAnnotation(Excel.class);
                    if (excel != null) {
                        entityList.add(ExcelExportEntityUtil.createEntity(goodsDetailsInfoClass, excel.name(), f.getName()));
                    }
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }

        }
        ExportParams params = new ExportParams();
        params.setType(ExcelType.XSSF);
        //goodsInfoList为具体导出的对象数组,将需要导出的全量属性(对应excel列名)都加@Excel注解,通过ExcelExportJudgementConditionQO控制具体需要导出哪些列。
        Workbook workbook = ExcelExportUtil.exportExcel(params, entityList, goodsInfoList);
        ExcelFileUtil.downloadExcel(response, workbook);

因为按时间顺序写的文章,就没放在 方法一 的分类中。方法一 中介绍的方法是提前写好注解,明确知道导出具体的列。而20190110补充的是,假设导出列全量已知,但用户可以选择自己想要的列进行导出的情景。由于注解是在服务启动时就加载的,无法在启动后动态去增加或删除注解(反射可以改变注解的值,但是无法新增和删除一个注解),所以如果不确定需要导出哪些列的话,是无法动态去增减注解的。而用了List的导出,配合反射获取对象属性,可以非常巧妙的进行动态选择列导出。


--------------------------------------------------华丽的分割线--------------------------------------------------------------


文笔不好,望见谅! ^ _ ^
如有任何问题或者意见,欢迎留言交流。

下一篇:java对excel导入和导出处理的几种方法(二)使用自己封装的工具类

你可能感兴趣的:(excel)