记录一个开发过程中遇到的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(