使用easypoi优雅进行数据导出到excel

       最近公司有好几个需求都是关于导出统计报表到excel,并发送邮件到对应负责人,纠缠了一番之后,也对导出数据到excel有了一定经验,不至于每做一个导出功能就要写一大堆重复代码。以下是最近几天对easypoi的一些使用经验和心得。

      首先是依赖的问题,我们需要添加以下三个easypoi的包,具体的作用也就见名思意了,不做解释。

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

在使用之前先来介绍一下相关的easypoi注解:

  1. @Excel  作用在bean的属性上面,可以定义属性的排列顺序,列宽,行高,格式化等。
  2. @ExcelTarget  作用在bean上面,可以定义行高,文字的大小,主要是用来针对一个bean做不同的导出逻辑。
  3. @ExcelEntity  表示可以继续深入导出这个对象的相关字段。
  4. @ExcelIgnore  看名字就清楚什么意思了
  5. @ExcelCollection  表示一个集合,导出一对多的关系。

 

其中上面我使用最多的就是@Excel,接下来就是详细介绍一下这个注解要如何使用,先来看到这个注解里面可以使用属性:

属性类型默认值功能
nameStringnull列名,支持name_id
needMergebooleanfasle是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row)
orderNumString"0"列的排序,支持name_id
replaceString[]{}值的替换 导出是{0男,1女} 导入反过来
savePathString"upload"导入文件保存路径
typeint1导出类型: 1 是文本 2 是图片,3 是函数,10 是数字 默认是文本
widthdouble10列宽
heightdouble10列高,后期会统一使用@ExcelTarget的height
isStatisticsbooleanfasle自动统计数据,再追加一行统计
isHyperlinkbooleanfalse超链接,如果是需要实现接口返回对象
isImportFieldbooleantrue校验字段,看看这个字段是不是导入的Excel中有,如果没有说明是错误的Excel,读取失败,支持name_id
exportFormatString""导出的时间格式,以这个是否为空来判断是否需要格式化日期
importFormatString""导入的时间格式,以这个是否为空来判断是否需要格式化日期
formatString""时间格式,相当于同时设置了exportFormat 和 importFormat
databaseFormatString"yyyyMMddHHmmss"导出时间设置,如果字段是Date类型则不需要设置 数据库如果是string 类型,这个需要设置这个数据库格式,用以转换时间格式输出
numFormatString""数字格式化,参数是Pattern,使用的对象是DecimalFormat
imageTypeint1导出类型 1 从file读取 2 是从数据库中读取 默认是文件 同样导入也是一样的
suffixString""文字后缀,如"¥" 9 变成9¥
isWrapbooleantrue是否换行 即支持\n
mergeRelyint[]{}合并单元格依赖关系,比如第二列合并是基于第一列 则{0}就可以了
mergeVerticalbooleanfasle纵向合并内容相同的单元格
fixedIndexint-1对应excel的列,忽略名字
isColumnHiddenbooleanfalse导出隐藏列

其余几个注解暂不做解释,先来进行实操,首先看到我们需要导出数据效果,如图:

然后我们看到对应的对象Bean,如下,这里需要注意第一列和第二列,首先needMerge和mergeVertical都是需要改为true,如果第二列需要在第一列的基础上进行合并就添加mergeRely={0},0就是第一列的意思。

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

import java.io.Serializable;

@Data
@Accessors(chain = true)
public class ExportProductShiftItemDetailDTO implements Serializable {
    @Excel(name = "FBOX or SFT",width = 30, orderNum = "0",needMerge = true,mergeVertical = true)
    private String productShitItemCode;

    @Excel(name = "运输方式",width = 12, orderNum = "1",needMerge = true,mergeVertical = true, mergeRely = {0})
    private String shipType;

    @Excel(name = "分箱号",width = 20, orderNum = "2")
    private String productShiftBoxCode;

    @Excel(name = "SKU/POA",width = 12, orderNum = "3",height = 15.0D)
    private String productCode;

    @Excel(name = "三方条码",width = 20, orderNum = "4")
    private String amazonCustomerLabel;

    @Excel(name = "店铺",width = 15, orderNum = "5")
    private String amazonShop;

    @Excel(name = "每箱数量",width = 12, orderNum = "6")
    private String quantity;

    @Excel(name = "体积",width = 20, orderNum = "7")
    private String volume;

    @Excel(name = "重量",width = 12, orderNum = "8")
    private String weight;
}

然后就是导出数据到excel部分,这里做一下封装,用起来就得心应手,看自己需要,先把数据组装成ExportParams

/**
*@title  表格的顶头标题
*@sheetName  表脚
*@dataList    数据源
*@tClass     数据源的bean模式
*/
public static <T> Map<String, Object> getExcelSheetParam(String title, String sheetName, List<T> dataList, Class<T> tClass) throws SkbException {
   Map<String, Object> excelParam = new HashMap<>();
   ExportParams params = new ExportParams();
   if(StringUtils.isNotBlank(title)){
       params.setTitle(title);
   }
   params.setSheetName(sheetName);
   params.setType(ExcelType.XSSF);
   excelParam.put("title", params);
   excelParam.put("entity", tClass);
   excelParam.put("data", dataList);
   return excelParam;
}

导出到workbook并输出到response

/**
     *
     * @param list   数据集
     * @param excelType  文件类型ExcelType.HSSF/XSSF
     * @return
     * @throws SkbException
     */
    public static void exportExcel(List<Map<String, Object>> list, ExcelType excelType, String fileName, HttpServletResponse response) throws SkbException{
        try {
            //设置响应
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", "UTF-8"));
            response.setContentType("application/vnd.ms-excel");
            Workbook workbook = ExcelExportUtil.exportExcel(list, excelType);
            if (workbook != null) {
                // 打开流
                OutputStream outputStream = response.getOutputStream();
                list.clear();
                workbook.write(outputStream);
                // 刷新流
                outputStream.flush();
                // 关闭流
                outputStream.close();
            }
        }catch (IOException e){
            throw new SkbException("导出表格数据失败");
        }
    }

最后是调用部分

public void exportProductShiftBoxDetail(List<Integer> productShiftItemIdList, HttpServletResponse response) throws SkbException {
        List<ExportProductShiftItemDetailDTO> result = productShiftItemMapper.exportProductShiftBoxDetail(productShiftItemIdList);
        if(org.apache.commons.collections.CollectionUtils.isNotEmpty(result)){
            List<Map<String, Object>> excelParamList = new ArrayList<>();
            excelParamList.add(ExportExcelUtil.getExcelSheetParam("调拨装箱信息","sheet1", result, ExportProductShiftItemDetailDTO.class));
            ExportExcelUtil.exportExcel(excelParamList, ExcelType.XSSF, "调拨装箱明细", response);
        }else {
            AssertUtils.success(Boolean.FALSE,"没有要导出的数据");
        }
    }

打完收工,你们也赶紧去试一下吧。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值