SpringBoot2.X手册:Easypoi导出excel,最新版的手感香不香?

POI 工具类,Excel的快速导入导出,Excel模板导出,Word模板导出,可以仅仅5行代码就可以完成Excel的导入导出,修改导出格式简单粗暴,快速有效,easypoi值得你尝试

目前来说,Easypoi确实方便,官网也提供了三种不同的版本,它在开源中国还,还是非常出名的,用的人非常多,也是对他的一个认可。

小编目前的项目,也是用这个来做,今天我们来做个excel的导入导出例子,看看怎么使用?

包体引入

目前官方提供最新版本是4.2.0,但是我在使用过程中,总是报错,时间关系就没怎么去查找,有兴趣的同学可以呀研究一下,类找不到,这个是apache的一个类,估计是新版本需要引入别的包,没去仔细追究。

java.lang.NoClassDefFoundError: org/apache/poi/xssf/usermodel/XSSFWorkbook
<!-- springboot核心web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 引入EasyPoi包 -->
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-spring-boot-starter</artifactId>
            <version>4.1.0</version>
        </dependency>

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>

编写导入导出工具类

/**
 * Excel枚举类型
 * @author:溪云阁
 * @date:2020年5月29日
 */

public enum ExcelTypeEnum &#123;

    XLS("xls"), XLSX("xlsx");

    private String value;

    private ExcelTypeEnum(String value) &#123;
        this.value = value;
    &#125;

    public String getValue() &#123;
        return value;
    &#125;

    public void setValue(String value) &#123;
        this.value = value;
    &#125;
&#125;
/**
 * Excel导出工具类
 * @author:溪云阁
 * @date:2020年5月29日
 */
@Component
public class ExcelExportUtils &#123;

    @Autowired
    private HttpServletResponse response;

    /**
     * 导出excel
     * @author 溪云阁
     * @param list 泛型数据
     * @param title 标题
     * @param sheetName sheet的名称
     * @param pojoClass 需要导出的对象
     * @param fileName 文件名称
     * @param isCreateHeader 是否创建表头
     * @throws IOException void
     */
    public void exportExcel(List<?> list, Class<?> pojoClass, String title, String sheetName, String fileName,
            boolean isCreateHeader) throws IOException &#123;
        final ExportParams exportParams = new ExportParams(title, sheetName, ExcelType.XSSF);
        exportParams.setCreateHeadRows(isCreateHeader);
        baseExport(list, pojoClass, fileName, exportParams);
    &#125;

    /**
     * 导出excel
     * @author 溪云阁
     * @param list 泛型数据
     * @param title 标题
     * @param sheetName sheet的名称
     * @param pojoClass 需要导出的对象
     * @param fileName 文件名称
     * @param response
     * @throws IOException void
     */
    public void exportExcel(List<?> list, Class<?> pojoClass, String title, String sheetName, String fileName)
            throws IOException &#123;
        baseExport(list, pojoClass, fileName, new ExportParams(title, sheetName, ExcelType.XSSF));
    &#125;

    /**
     * 导出excel
     * @author 溪云阁
     * @param list 泛型数据
     * @param pojoClass 需要导出的对象
     * @param fileName 文件名称
     * @param exportParams 文件书香
     * @param response
     * @throws IOException void
     */
    public void exportExcel(List<?> list, Class<?> pojoClass, String fileName, ExportParams exportParams)
            throws IOException &#123;
        baseExport(list, pojoClass, fileName, exportParams);
    &#125;

    /**
     * 多个sheet导出
     * @author 溪云阁
     * @param list
     * @param fileName
     * @throws IOException void
     */
    public void exportExcel(List<Map<String, Object>> list, String fileName) throws IOException &#123;
        baseExport(list, fileName);
    &#125;

    /**
     * 最基础的对象导出
     * @author 溪云阁
     * @param list 数据列表
     * @param pojoClass 导出对象
     * @param fileName 文件名称
     * @param exportParams 导出文件属性
     * @throws IOException void
     */
    private void baseExport(List<?> list, Class<?> pojoClass, String fileName, ExportParams exportParams)
            throws IOException &#123;
        final Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
        downLoadExcel(fileName, workbook);
    &#125;

    /**
     * 最基础的多sheet导出
     * @author 溪云阁
     * @param list 多个不同数据对象的列表
     * @param fileName 文件名称
     * @throws IOException void
     */
    private void baseExport(List<Map<String, Object>> list, String fileName) throws IOException &#123;
        final Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
        downLoadExcel(fileName, workbook);
    &#125;

    /**
     * 文件下载
     * @author 溪云阁
     * @param fileName 文件名称
     * @param workbook exce对象
     * @throws IOException void
     */
    private void downLoadExcel(String fileName, Workbook workbook) throws IOException &#123;
        ServletOutputStream output = null;
        try &#123;
            final String downloadName = URLEncoder.encode(fileName + "." + ExcelTypeEnum.XLSX.getValue(), "UTF-8");
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + downloadName);
            output = response.getOutputStream();
            workbook.write(output);
        &#125;
        catch (final Exception e) &#123;
            throw new IOException(e.getMessage());
        &#125;
        finally &#123;
            if (output != null) &#123;
                output.flush();
                output.close();
            &#125;
        &#125;
    &#125;

&#125;
/**
 * Excel导入工具类
 * @author:溪云阁
 * @date:2020年5月29日
 */
@Component
public class ExcelImportUtils &#123;

    /**
     * 从指定位置获取文件后进行导入
     * @author 溪云阁
     * @param filePath 文件路径
     * @param titleRows 表格标题行数,默认0
     * @param headerRows 表头行数,默认1
     * @param pojoClass 上传后需要转化的对象
     * @return
     * @throws IOException List<T>
     */
    public <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass)
            throws Exception &#123;
        if (Strings.isEmpty(filePath)) &#123;
            return null;
        &#125; else &#123;
            final ImportParams params = new ImportParams();
            // 表格标题行数,默认0
            params.setTitleRows(titleRows);
            // 表头行数,默认1
            params.setHeadRows(headerRows);
            // 是否需要保存上传的Excel
            params.setNeedSave(true);
            // 保存上传的Excel目录
            params.setSaveUrl("/excel/");
            return ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
        &#125;
    &#125;

    /**
     * 上传文件导入
     * @author 溪云阁
     * @param file
     * @param titleRows 标题行
     * @param headerRows 表头行
     * @param needVerfiy 是否检验excel内容
     * @param pojoClass 导入的对象
     * @return
     * @throws Exception List<T>
     */
    public <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, boolean needVerfiy,
            Class<T> pojoClass) throws Exception &#123;
        if (file == null) &#123;
            return null;
        &#125; else &#123;
            return baseImport(file.getInputStream(), titleRows, headerRows, needVerfiy, pojoClass);
        &#125;

    &#125;

    /**
     * 最基础导入
     * @author 溪云阁
     * @param inputStream
     * @param titleRows 表格标题行数,默认0
     * @param headerRows 表头行数,默认1
     * @param needVerify 是否需要检测excel
     * @param pojoClass 导入的对象
     * @return
     * @throws IOException List<T>
     */
    private <T> List<T> baseImport(InputStream inputStream, Integer titleRows, Integer headerRows,
            boolean needVerify, Class<T> pojoClass) throws Exception &#123;
        if (inputStream == null) &#123;
            return null;
        &#125; else &#123;
            final ImportParams params = new ImportParams();
            params.setTitleRows(titleRows);
            params.setHeadRows(headerRows);
            params.setSaveUrl("/excel/");
            params.setNeedSave(true);
            params.setNeedVerify(needVerify);
            return ExcelImportUtil.importExcel(inputStream, pojoClass, params);
        &#125;

    &#125;

&#125;

编写导入导出对象

这里,为了覆盖更全一点,我分别用了不同的类型来做实验,数字类型采用NumberFormat进行格式化操作。

/**
 * 用户信息
 * @author:溪云阁
 * @date:2020年5月29日
 */
public class User implements Serializable &#123;

    // 数字格式化
    private NumberFormat nf = NumberFormat.getNumberInstance();

    private static final long serialVersionUID = 1L;

    @Excel(name = "用户id", orderNum = "0", width = 15)
    @Setter
    @Getter
    private long userId;

    @Excel(name = "性别", orderNum = "1", width = 15, replace = &#123; "男_1", "女_2" &#125;, suffix = "孩")
    @Setter
    @Getter
    private int sex;

    @Excel(name = "金钱", orderNum = "2", width = 15)
    @Setter
    private double money;

    public String getMoney() &#123;
        return nf.format(money);
    &#125;

    @Excel(name = "用户信息", orderNum = "3", width = 15)
    @Setter
    @Getter
    private String userName;

    @Excel(name = "价格", orderNum = "4", width = 15)
    @Setter
    @Getter
    private float price;

    @Excel(name = "时间", orderNum = "5", width = 15, format = "yyyy-MM-dd")
    @Setter
    @Getter
    private Date now;

&#125;

编写测试方法

/**
 * excel导入导出
 * @author:溪云阁
 * @date:2020年5月29日
 */
@Api(tags = &#123; "APP服务:数据接口" &#125;)
@RestController
@RequestMapping("view/ie")
public class ImportExportController &#123;

    @Autowired
    private ExcelExportUtils excelExportUtils;

    @Autowired
    private ExcelImportUtils excelImportUtils;

    /**
     * 导出用户信息
     * @author 溪云阁 void
     */
    @ApiOperation(value = "导出excel")
    @GetMapping(value = "/exportExcel")
    public void exportExcel() throws Exception &#123;
        final List<User> userList = new ArrayList<>();
        for (int i = 0; i < 10; i++) &#123;
            final User user = new User();
            user.setUserId(i);
            user.setSex(1);
            user.setMoney(12332123 + i);
            user.setUserName("小明" + i);
            user.setPrice(23.1f + i);
            user.setNow(new Date());
            userList.add(user);
        &#125;
        excelExportUtils.exportExcel(userList, User.class, "用户信息", "员工信息的sheet", "用户信息表");
    &#125;

    /**
     * 导入用户信息
     * @author 溪云阁
     * @param file
     * @return
     * @throws IOException Object
     */
    @ApiOperation(value = "导入excel")
    @GetMapping(value = "/importExcel")
    public ResponseMsg<List<User>> importExcel(@RequestParam("file") MultipartFile file) throws Exception &#123;
        final List<User> userList = excelImportUtils.importExcel(file, 1, 1, false, User.class);
        return MsgUtils.buildSuccessMsg(userList);
    &#125;

&#125;

导出结果

在导出中,直接在浏览器输入地址接口,结果如截图所示

其中,金钱,时间上,我们分别进行了格式化

导入结果

把刚刚导出来的文件,直接导入进去,这里采用postMan进行操作,其中要注意的点,我已经用红色的圈圈标出来。

从实验结果上看,已经可以导入进去,并且把数据返回来

问题

在导入进去的构成中,这里留下一个问题给同学自行解决,导入的金额是0,可自行研究解决

评论