easypoi大数据导出之自定义模板入参Map集合

需求

自定义导出模板表头入参map集合、出参数据为:List Map 渲染到excel当中

整体代码如下

//列名
List<ExcelExportEntity> headList = new ArrayList<>();
// 自定义样式
ExportParams params = new ExportParams();
params.setType(ExcelType.XSSF);
// 表头map集合
List<Map<String, Object>> listmap =  userDao.findListMap();
// 遍历表头
for (Map<String, Object> objectMap : listmap) {
            String name =(String) objectMap.get("name");
            Object key = objectMap.get("index");
            ExcelExportEntity exportEntity = new ExcelExportEntity(name,key);
            headList.add(exportEntity);
        }
        // 工作薄
Workbook workbook = BigDataExcelUtil.exportBigExcel(params, headList, poolAssetDetailExcelExportServer, dto);
ServletOutputStream outputStream = response.getOutputStream();

//导出
MyWebUtils.setDownloadResponse(absAssetPool.getAssetPoolName()+"资产池详细.xlsx", response);
        workbook.write(outputStream);//将数据输出
        //关闭流
        workbook.close();
        outputStream.close();

分析代码过程

自定义表头

来装excel每一列表头对象
List<ExcelExportEntity> headList = new ArrayList<>();
数据库查询过来的表头对象
List<Map<String, Object>> listmap =  userDao.findListMap();
渲染每一个表头列的中文名与对应的code(方便再导出数据的时候做字段映射)
for (Map<String, Object> objectMap : listmap) {
            String name =(String) objectMap.get("name");
            Object key = objectMap.get("index");
            ExcelExportEntity exportEntity = new ExcelExportEntity(name,key);
            // 放入列明
            headList.add(exportEntity);
        }

ExcelExportUtil

 /**
     * 大数据量导出
     *
     * @param entity
     * @param excelParams
     * @param server      查询数据的接口
     * @param queryParams 查询数据的参数
     * @return
     */
    public static Workbook exportBigExcel(ExportParams entity, List<ExcelExportEntity> excelParams,
                                          IExcelExportServer server, Object queryParams) {
        ExcelBatchExportService batchServer = new ExcelBatchExportService();
        batchServer.init(entity, excelParams);
        return batchServer.exportBigExcel(server, queryParams);
    }
   
    public Workbook exportBigExcel(IExcelExportServer server, Object queryParams) {
        int page = 1;
        List<Object> list = server
                .selectListForExcelExport(queryParams, page++);
        while (list != null && list.size() > 0) {
            write(list);
            list = server.selectListForExcelExport(queryParams, page++);
        }
        return close();
    }

以上开源源码很明显不满足出参为ListMap格式数据。我们需要重写cn.afterturn.easypoi.excel.export.ExcelBatchExportService#exportBigExcel 。一旦不支持我们也需要重写:cn.afterturn.easypoi.excel.ExcelExportUtil#exportBigExcel(cn.afterturn.easypoi.excel.entity.ExportParams, java.util.List<cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity>, cn.afterturn.easypoi.handler.inter.IExcelExportServer, java.lang.Object)

重写代码如下
ExcelExportUtil------>BigDataExcelUtil
/**
 * 功能描述:
 *
 * @author Songxianyang
 * @date 2023-06-02 15:01
 */
public final class BigDataExcelUtil {

    /**
     * 大数据量导出
     *
     * @param entity
     * @param excelParams
     * @param server      查询数据的接口
     * @param queryParams 查询数据的参数
     * @return
     */
    public static Workbook exportBigExcel(ExportParams entity, List<ExcelExportEntity> excelParams,
                                          IExcelExportServer server, Object queryParams) {
        AssetExcelBatchExportService batchServer = new AssetExcelBatchExportService();
        batchServer.init(entity, excelParams);
        return batchServer.exportBigExcel(server, queryParams);
    }
}
ExcelBatchExportService ------> UserExcelBatchExportService
/**
 * 功能描述:  资产大数据导出服务
 * 提供批次插入服务
 *
 * @author Songxianyang
 * @date 2023-06-02 15:04
 */
public class UserExcelBatchExportService extends ExcelBatchExportService {
    public Workbook exportBigExcel(IExcelExportServer server, Object queryParams) {
        int page = 1;
        List<Object> list = server
                .selectListForExcelExport(queryParams, page++);
        while (list != null && list.size() > 0) {
        //获取元素第一条数据
            write((Collection) list.get(0));
            list = server.selectListForExcelExport(queryParams, page++);
        }
        return close();
    }
}

查询出来的数据如何渲染到excel当中(关键代码)

思想就是:分批处理 一批一批的写入。如果为null 及跳出循环

/**
 * 功能描述:
 *
 * @author Songxianyang
 * @date 2023-06-02 10:17
 */
@Component
public class UserDetailExcelExportServer implements IExcelExportServer {
    @Autowired
    private UserDetailService userDetailService;
    @Override
    public List<Object> selectListForExcelExport(Object queryParams, int page) {
    // 外界查询数据库入参
        UserDetailDto params = (UserDetailDto) queryParams;
        
        Page pageTemp = new Page(page, 10000);
        
        List<Map> rows = userDetailService.selectList();
        // 这个地方 注意一下欧 (可以这么写)如果没查到  就不在往excel写入
        if (CommUtil.isEmpty(rows)) {
            return null;
        }
        // 他会把查询出来的数据放在 一个子集里面做返回。举个例子:
       // List= [1,2,3,4]  Collections.singletonList 转换成 List=List(0): [1,2,3,4] 。变成第一个元素的子集。
        return Collections.singletonList(rows);
    }
}
这个地方 注意一下欧 (可以这么写)如果没查到 就不在往excel写入 看一下官方源码怎么写的
while (list != null && list.size() > 0) {
        //获取元素第一条数据
            write((Collection) list.get(0));
            list = server.selectListForExcelExport(queryParams, page++);
        }
       

初衷:能帮到更多人!也为在做下一次相同需求时方便查阅。

涉及到公司数据在这里我就不导出给大家看了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SteveCode.

永远年轻,永远热泪盈眶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值