Java使用poi导出excel表格如何合并相同内容的行

本文介绍了一种使用POI导出Excel时,解决日期列行合并问题的方法。通过数据库查询、数据按日期排序及分组,再利用Java Stream API进行数据处理,最终实现了动态的行合并功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录一个开发过程中遇到的poi导出excel问题

一般的poi导出格式为以下这种
在这里插入图片描述
这种实现起来也简单, 只需要配置好格式, 写好标题, 将数据循环导出到excel就行了 , 可是下面这种就比较难搞了
在这里插入图片描述
由于第一列需要根据日期合并行, 而且行数不是固定的, 是需要根据上面的筛选条件, 查询出来, 将结果按照日期分组合并, 所以左边第一列需要合并的行是灵活多变的, 不能简单按照合并列那样。
下面是我的解决方案, 如有意见, 请多多指教
这是数据库里的数据
在这里插入图片描述

实现逻辑和代码

1. 首先应该将数据按照日期排序, 查询出来

mapper.xml

    <select id="getDetail" resultType="com.XXX.pojo.dto.data.ActivityAnalysisDTO">
        select
        aa.*,
        cp.name as platform_name
        from activity_analysis aa
        left join cplatform cp on cp.cid = aa.platform_id
        <include refid="searchActivity"/>
        order by aa.create_time asc,aa.platform_id asc
    </select>
<sql id="searchActivity">
        <where>
            1=1
            <if test="startTime!=null and endTime!=null">
                and aa.create_time between #{startTime} and #{endTime}
            </if>
            <if test="activityId!=null">
                and aa.activity_id = #{activityId}
            </if>
            <if test="typeId!=null">
                and aa.type_id = #{typeId}
            </if>
            <if test="platformId!=null">
                and aa.platform_id = #{platformId}
            </if>
        </where>
    </sql>

我这里直接使用的查询这个活动数据的接口
这里主要是想和活动详情使用同样的接口, 日后修改起来, 也方便些(也可使用单独查询列表的接口)
service
由于HashMap集合中key是无序的, 所以, 在这里我将HashMap转为LinkedHashMap, 有序

public Map<String, List<ActivityAnalysisDTO>> getDetail(SearchActivityArgs args) {
   
        //1.查找活动详情
        List<ActivityAnalysisDTO> activityAnalysisDTOList = activityAnalysisMapper.getDetail(args);
        Map<String, List<ActivityAnalysisDTO>> mapStrKey = new HashMap<>();
        //将Date类型的key转化为String 类型的key, 将数据按照创建日期分组, 构建
        if (CollectionUtils.isNotEmpty(activityAnalysisDTOList)) {
   
            Map<Date, List<ActivityAnalysisDTO>> listMap = activityAnalysisDTOList.stream().collect(Collectors.groupingBy(o -> o.getCreateTime()));
            for (Date date : listMap.keySet()) {
   
                mapStrKey.put(DateUtils.getStringFromDate(date, "yyyy-MM-dd"), listMap.get(date));
            }
        }
        LinkedHashMap<String, List<ActivityAnalysisDTO>> sortMap = this.sortKeyMap(mapStrKey);
        return sortMap;
    }

    /**
     * 给map集合按照key排序
     *
     * @param oriMap
     * @return
     */
    private LinkedHashMap<String, List<ActivityAnalysisDTO>> sortKeyMap(Map<String, List<ActivityAnalysisDTO>> oriMap) {
   
        LinkedHashMap<String, List<ActivityAnalysisDTO>> sortKeyMap = new LinkedHashMap<>();
        if (oriMap != null) {
   
            Set<String> set = oriMap.keySet();
            Object[] array = set.toArray(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

意田天

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值