发布时间: 阅读量

Easypoi:一行代码搞定导入导出

Easypoi,一行代码搞定导入导出,又腾出点时间撩妹,安排!

前言

之前对导入导出总是慎得慌,说起来功能不难可实现的代码一大堆,偶然间看到了EasyPoi,高手,这就是高手啊,代码简直高亮,用起来舒服,并多次应用于实战,真是百试不爽!


话不多说 开始实操

1.创建一个简单的springbootWeb工程

2.在工程的pom文件中加入依赖如下

<dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>3.0.3</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-web</artifactId>
            <version>3.0.3</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-annotation</artifactId>
            <version>3.0.3</version>
        </dependency>

3.编写一个实体类也就是你将要导出的内容

    class User {
    @Excel(name = "id", orderNum = "0")
    private Integer id;
    @Excel(name = "姓名", orderNum = "1")
    private String name;
    @Excel(name = "年龄", orderNum = "2")
    private Integer age;
    
    //此处省略getset

下面是一些Easypoi的相关注解,根据实际情况自行选取:

属性 类型 类型 说明
name String null 列名
needMerge boolean fasle 纵向合并单元格
orderNum String "0" 列的排序,支持name_id
replace String[] {} 值得替换 导出是{a_id,b_id} 导入反过来
savePath String upload 导入文件保存路径
type int 1 导出类型 1 是文本 2 是图片,3 是函数,10 是数字 默认是文本
width double 10 列宽
height double 10 列高,后期打算统一使用@ExcelTarget的height,这个会被废弃,注意
isStatistics boolean fasle 自动统计数据,在追加一行统计,把所有数据都和输出这个处理会吞没异常,请注意这一点
isHyperlink boolean fasle 超链接,如果是需要实现接口返回对象
isImportField boolean true 校验字段,看看这个字段是不是导入的Excel中有,如果没有说明是错误的Excel,读取失败,支持name_id
exportFormat String "" 导出的时间格式,以这个是否为空来判断是否需要格式化日期
importFormat String "" 导入的时间格式,以这个是否为空来判断是否需要格式化日期
databaseFormat String "yyyyMMddHHmmss" 导出时间设置,如果字段是Date类型则不需要设置 数据库如果是string 类型,这个需要设置这个数据库格式,用以转换时间格式输出
numFormat String "" 数字格式化,参数是Pattern,使用的对象是DecimalFormat
imageType int 1 导出类型 1 从file读取 2 是从数据库中读取 默认是文件 同样导入也是一样的
suffix String "" 文字后缀,如% 90 变成90%
isWrap boolean true 是否换行 即支持\n
mergeRely int[] {} 合并单元格依赖关系,比如第二列合并是基于第一列 则{1}就可以了
mergeVertical boolean fasle 纵向合并内容相同的单元格

4.写一个封装导入导出方法的工具类

  public class FileUtil {

    public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response){
        ExportParams exportParams = new ExportParams(title, sheetName);
        exportParams.setCreateHeadRows(isCreateHeader);
        defaultExport(list, pojoClass, fileName, response, exportParams);

    }
    public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass,String fileName, HttpServletResponse response){
        defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));
    }
    public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response){
        defaultExport(list, fileName, response);
    }

    private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) {
        Workbook workbook = ExcelExportUtil.exportExcel(exportParams,pojoClass,list);
        if (workbook != null);
        downLoadExcel(fileName, response, workbook);
    }

    private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
        try {
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition",
                    "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            workbook.write(response.getOutputStream());
        } catch (IOException e) {
            throw new NormalException(e.getMessage());
        }
    }
    private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {
        Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
        if (workbook != null);
        downLoadExcel(fileName, response, workbook);
    }

    public static <T> List<T> importExcel(String filePath,Integer titleRows,Integer headerRows, Class<T> pojoClass){
        if (StringUtils.isBlank(filePath)){
            return null;
        }
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);
        List<T> list = null;
        try {
            list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
        }catch (NoSuchElementException e){
            throw new NormalException("模板不能为空");
        } catch (Exception e) {
            e.printStackTrace();
            throw new NormalException(e.getMessage());
        }
        return list;
    }
    public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass){
        if (file == null){
            return null;
        }
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);
        List<T> list = null;
        try {
            list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
        }catch (NoSuchElementException e){
            throw new NormalException("excel文件不能为空");
        } catch (Exception e) {
            throw new NormalException(e.getMessage());
        }
        return list;
    }

添加一个异常类NormalException

qqtu-pian-20181215153555

5.创建一个controller

5.1导出操作

@Controller
public class FileController {
    @RequestMapping("/export")
    public void exportExcel(HttpServletResponse response){
        List<User> list = new ArrayList<>();
        list.add(new User(1,"小刘",17));
        list.add(new User(2,"小周",11));
        list.add(new User(3,"小赵",15));
        list.add(new User(4,"小丽",44));

        //导出操作
        FileUtil.exportExcel(list,"通讯录","技术部",User.class,"通讯录.xls",response);
    }

    @RequestMapping("/import")
    public void importExcel(HttpServletRequest req){
        ImportParams params = new ImportParams();
        //解析excel,
        params.setHeadRows(1);
        params.setTitleRows(1);
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)req;
        MultipartFile file = multipartRequest.getFile("upfile");
   

        List<User> list = FileUtil.importExcel(file, 1,1,User.class);
        System.out.println(list);
    }
}

启动项目,在浏览器中访问http://localhost:8080/export
qqtu-pian-20181215141539

打开导出的Excel

qqtu-pian-20181215141932

图中标红下图相对应
qqtu-pian-20181215142545

5.2导入操作

在原有数据上添加一条
qqtu-pian-20181215150834

使用postman发起请求

qqtu-pian-20181215151231

qqtu-pian-20181215151629

还有一点需要注意
实体类要加上无参构造
否则会报出
qqtu-pian-20181215152626

postman 测试的时候,可以download下载导出的excel


后续

参考博文
详情移步官方博客
xia-zai