使用Easypoi实现Excel导入导出

EayPoi官方文档

1.Excel的导出

这是我刚开始工作所写的博客,(java小白)为了让自己对这些新学的知识,框架更加的熟悉,熟练,以此来此记录,如有错误,请各位大佬指正!!!
因为公司采用的前后端分离方式,所以本人所有的代码都只有后端接口。且返回的结果集是公司自己封装的一个josn处理结果集。(全部返回josn字符串)

1.1导入依赖

导入EasyPoi依赖,我导入的是4.1.0版本,如要导入其他版本,请考虑版本冲突问题。

<easypoi.version>4.1.0</easypoi.version>
<!-- easypoi依赖 -->
            <dependency>
                <groupId>cn.afterturn</groupId>
                <artifactId>easypoi-base</artifactId>
                <version>${easypoi.version}</version>
            </dependency>
            <dependency>
                <groupId>cn.afterturn</groupId>
                <artifactId>easypoi-web</artifactId>
                <version>${easypoi.version}</version>
            </dependency>
            <dependency>
                <groupId>cn.afterturn</groupId>
                <artifactId>easypoi-annotation</artifactId>
                <version>${easypoi.version}</version>
            </dependency>
            

1.2导出源码

实体类:

在这里插入图片描述
在想要导出的字段上加Excel注解,自己在name属性设置导出后的key值

web层:

@RequestMapping(value = "/personnelCountOut",method = RequestMethod.POST)
public void personnelCountOut(
            HttpServletResponse response,
            @RequestBody ItemRecordDTO itemRecordDTO) throws IOException {
        //itemRecordDTOS 为想要导出的数据,
        List<ItemRecordDTO> itemRecordDTOS = itemRecordService.listItemPersonnelCountList(itemRecordDTO);
        // 设置响应输出的头类型
        // 设置响应输出的头类型
        response.setHeader("content-Type", "application/vnd.ms-excel");
        // 设计导出文件的名称,尽量不要中文
        String fileName = new String("导出.xls".getBytes(), "ISO-8859-1");
        response.setHeader("Content-Disposition","attachment;filename="+fileName);
        //输出流。
        ServletOutputStream out = response.getOutputStream();
        // 创建参数对象(用来设定excel得sheet的内容等信息)
        ExportParams params = new ExportParams() ; //sheet
        // title的参数为ExportParams类型,目前仅仅在ExportParams中设置了sheetName
        params.setSheetName("导出");
        Workbook workbook = ExcelExportUtil.exportExcel(params, ItemRecordDTO.class,itemRecordDTOS) ;
        workbook.write(out);
    }

上面的ItemRecordDTO 实体类是一个搜索条件,根据自己的实际情况来创建,也可以导出所有,就是不要条件,那么就不需要实体类参数,请求方法改为get。有对象参数请求方式为post。

1.3导出测试结果

直接浏览器输出该接口的路径,进行下载。
http://localhost:8080/ts/api/ts/manage/xf/v1/learningPowerManage/exportTemplate
根据自己真实的路径进行修改。
可看到文档已经被下载到本地
打开文档看看是不是我们前面放进去的数据
在这里插入图片描述
ExcelPoi导出成功!!!

2.简单的Excel的导入

不考虑重复,以及格式问题

2.1定义导入的实体类

自定义一个导入的实体类,@Data注解作用就是创建这些类的Getter、Setter和构造方法。
如果需要使用这个注解需要导入lombok依赖;如果使用这个注解,就自己创建Getter、Setter和构造方法。

<properties>
     <lombok.version>1.18.8</lombok.version>
</properties>
<!--lombok依赖-->
<dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <version>${lombok.version}</version>
</dependency>

实体类:
导入的字段都需要加上@Excel注解,name= excel表格内的名称(最好与字段名相同)。

@Data
public class ExcelInputObj {
        /**
         * id
         */
        @Excel(name = "id")
        private String id;
        /**
         * 身份证号
         */
        @Excel(name = "身份证号")
        private String partyMemberIdnumber;
        /**
         * 姓名
         */
        @Excel(name = "姓名")
        private String partyMemberName;
        /**
         * 电话
         */
        @Excel(name = "电话")
        private String partyMemberPhone;
        /**
         * 入党日期
         */
        @Excel(name = "入党日期")
        private Date partyMemberTime;

        private static final long serialVersionUID = 1L;

2.2导入源码

这里需要注意表头的行数设置一定要正确!否则集合数据将无法读取。一定要区分表头与标题的区别,表头是列名称,标题是表头上面的文字,示例文件中没有标题,所以setTitleRows为0
在这里插入图片描述

 @RequestMapping(value = "/input")
    public void excelInput(@RequestParam("file") MultipartFile multipartFile) throws Exception {
        ImportParams params = new ImportParams();
        // 表头设置为2行
        params.setHeadRows(2);
        // 标题行设置为0行,默认是0,可以不设置
        params.setTitleRows(0);
        // 开启Excel校验
        params.setNeedVerify(true);
        params.setVerifyHandler(excelRepetitionApi);
        ExcelImportResult<PartyMemberInfo> result = ExcelImportUtil.importExcelMore(multipartFile.getInputStream(),
                PartyMemberInfo.class, params);
        System.out.println("是否校验失败: " + result.isVerfiyFail());
        System.out.println("校验失败的集合:" + JSONObject.toJSONString(result.getFailList()));
        System.out.println("校验通过的集合:" + JSONObject.toJSONString(result.getList()));
        for (PartyMemberInfo entity : result.getFailList()) {
            int line = entity.getRowNum() + 1;
            String msg = "第" + line + "行的错误是:" + entity.getErrorMsg();
            System.out.println(msg);
        }
    }

2.3导入测试

如下图所示,测试成功
在这里插入图片描述

获取到要插入到数据库中的数据,再使用批量插入方法,将集合插入到数据库中
在这里插入图片描述
在dao层创建批量插入方法:

int insertPartyInfoList(@Param("excelInputObjs") List<ExcelInputObj> excelInputObjs);

sql语句:(根据自己的数据库字段进行修改)

<insert id="insertPartyInfoList">
      insert into party_member_info(party_member_Idnumber, id, party_member_name, party_member_phone,
      party_member_time) values
      <foreach collection="excelInputObjs" separator="," index="index" item="item">
        (#{item.partyMemberIdnumber},#{item.id},#{item.partyMemberName},#{item.partyMemberPhone},#{item.partyMemberTime})
      </foreach>
    </insert>

在service层批量添加创建接口:

int insertPartyInfoList(List<ExcelInputObj> excelInputObj);

实现类:

@Override
    public int insertPartyInfoList(List<ExcelInputObj> excelInputObj) {
        return partyMemberInfoMapper.insertPartyInfoList(excelInputObj);
    }

在controller层的那个类中加入批量添加的方法

int i =partyMemberInfoService.insertPartyInfoList(results);

最终返回结果:
在这里插入图片描述
看看数据库有没有成功添加
原先数据库
在这里插入图片描述
添加后的数据库
在这里插入图片描述
其他字段可以根据自己实体类的字段进行添加

EasyPoi简单的导入导出就到这啦!!!!

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值