EasyExcel合并单元格策略样例

运行示例

处理前:

处理后:

说明

本次使用的是一次性绝对合并策略: List<OnceAbsoluteMergeStrategy> mergeStrategyList = new ArrayList<>();

OnceAbsoluteMergeStrategy四个参数:合并开始行,合并结束行,合并开始列,合并结束列

添加策略:builder.registerWriteHandler(strategy);

代码

1、模型层

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;import java.io.Serializable;
import java.math.BigDecimal;/*** @author CC* @description 工时导出excel实体对象* @className RespManHoursVO* @date 2022/6/21 14:21*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ContentRowHeight(18) //内容行高
@HeadRowHeight(25) //标题行高
public class RespManHoursVO implements Serializable {@ExcelProperty(value = {"项目名称"},index = 0)@ColumnWidth(18)private String project;@ExcelProperty(value = {"姓名"},index = 1)@ColumnWidth(7)private String name;@ExcelProperty(value = {"工时占比"},index = 2)@ColumnWidth(12)private BigDecimal manHour;@ExcelProperty(value = {"所属部门"},index = 3)@ColumnWidth(19)private String dept;@ExcelProperty(value = {"是否实习"},index = 4)@ColumnWidth(12)private String isIntern;
}

2、服务层

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
import com.alibaba.excel.write.merge.OnceAbsoluteMergeStrategy;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.meb.imis.fiscal.api.IHrUserArchiveService;
import com.meb.imis.fiscal.pojo.vo.resp.RespManHoursVO;
import com.meb.imis.fiscal.service.FileExportService;
import com.meb.imis.framework.api.workteam.service.IWorkTeamService;
import lombok.SneakyThrows;
import lombok.extern.log4j.Log4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.*;/*** @author CC* @description 文件导出服务实现类* @className FileExportServiceImpl* @date 2022/6/21 14:25*/
@Log4j
@Service
public class FileExportServiceImpl implements FileExportService {@Resourceprivate IWorkTeamService workTeamService;@Resourceprivate IHrUserArchiveService hrUserArchiveService;@Override@SneakyThrowspublic void exportWorkTime(String date, HttpServletResponse response) {// 初始化数据List<RespManHoursVO> sheet = new ArrayList<RespManHoursVO>(); // 导出列表DateTime dateTime = DateUtil.parse(date, "yyyy-MM"); // 格式化日期// 获取sheet/***    略,自行生成数据*    eg:*    RespManHoursVO raw1 = new RespManHoursVO();*   raw1.setProject("项目1");*  raw1.setName("张三");*  ...*    sheet.add(raw1);*/// 设置response参数response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode( date.substring(0,7)+ "月数据", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");// 生成合并策略List<OnceAbsoluteMergeStrategy> mergeStrategyList = new ArrayList<>(); // 合并策略int position = 0; // 需合并列(project)下标int index = 0; // 遍历下标int curStartRowNum = 1; // 开始合并行int rowNum = 0; // 合并行数String tempProject = null; // 临时项目名boolean curMerge = false; // 当前行是否合并结束for (RespManHoursVO manHours : sheet) {if(index == 0){ // 第一次遍历tempProject = manHours.getProject();}else{if (tempProject.equals(manHours.getProject())){ // 当前项目名同上一行项目名相等rowNum++;if (index == sheet.size()-1){ // 最后一行curMerge = true;}}else{if(rowNum > 0){curMerge = true; // 开始合并}else {curStartRowNum = index+1; // 无需合并,且更新开始合并行}}tempProject = manHours.getProject(); // 更新临时项目名}// 以项目名为单位的合并单元格if (curMerge) {// OnceAbsoluteMergeStrategy参数:合并开始行,结束行,开始列,结束列
//                log.info("cc log======>合并策略坐标: "+"【"+curStartRowNum+","+(curStartRowNum + rowNum)+"】");OnceAbsoluteMergeStrategy strategyByName = new OnceAbsoluteMergeStrategy(curStartRowNum, curStartRowNum + rowNum, position, position);mergeStrategyList.add(strategyByName);curMerge = false; // 合并结束rowNum = 0 ;curStartRowNum = index+1;}index++;}// 生成excelExcelWriterSheetBuilder builder = EasyExcel.write(response.getOutputStream(), RespManHoursVO.class).sheet("sheet1");if (CollectionUtils.isNotEmpty(mergeStrategyList)) { // 添加策略for (OnceAbsoluteMergeStrategy strategy : mergeStrategyList) {builder.registerWriteHandler(strategy);}}builder.doWrite(sheet); // 写入数据生成excel}
}

3、控制层

import com.meb.imis.fiscal.service.FileExportService;
import io.swagger.annotations.ApiOperation;
import lombok.SneakyThrows;
import lombok.extern.log4j.Log4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;/*** @author CC* @description 导出文件* @className FileExportController* @date 2022/6/21 10:02*/
@Log4j
@RestController
@RequestMapping("export")
public class FileExportController {@Resourceprivate FileExportService fileExportService;/*** 内部结算项目管理界面导出人员工时功能* @param date* @param response*/@GetMapping("exportWorkTime")@ApiOperation("导出")@SneakyThrowspublic void exportWorkTime(@RequestParam(value = "date") String date, HttpServletResponse response){// 调用服务层生成excelfileExportService.exportWorkTime(date,response);}
}

EasyExcel合并单元格策略样例相关推荐

  1. easyExcel合并单元格策略

    合并行: import com.alibaba.excel.metadata.CellData; import com.alibaba.excel.metadata.Head; import com. ...

  2. Web中的EasyExcel导出Excel(不创建对象且自定义合并单元格策略)

    Web中的EasyExcel导出Excel(不创建对象且自定义合并单元格策略) 适用于多张表(只查单表数据就用创建对象那种方法) Controller @RequestMapping(value = ...

  3. EasyExcel合并单元格,通过注解方式实现自定义合并策略

    EasyExcel合并单元格,通过注解方式实现自定义合并策略 简介 今天博主探讨如何实现EasyExcel自定义实现单元格合并策略,考虑需要抽象代码.适用于更多的业务场景,提供了两个工具类,参考过很多 ...

  4. easyexcel 合并单元格

    easyexcel 合并单元格 ********************* 相关注解 ContentLoopMerge:标注在字段上 @Target({ElementType.FIELD}) @Ret ...

  5. EasyExcel合并单元格(同列相同数据合并)

    合并后效果如下: 合并策略代码: public class CustomMergeStrategy extends AbstractMergeStrategy {/*** 分组,每几行合并一次*/pr ...

  6. EasyExcel合并单元格

    文章目录 需求 思考 实现 需求 EasyExcel默认情况下写Excel是一行一行的,单元格不会自动合并,现在需求是合并这几列中相同的数据 思考 开始自己也不想做过多改动代码,经过阅读EasyExc ...

  7. EasyExcel合并单元格(一)

    前言 导出excel,介绍如何使用LoopMergeStrategy实现简单的合并 效果 每隔2行,合并一次 横向合并 横向和纵向合并 实现 导入依赖 <!-- https://mvnrepos ...

  8. 阿里开源 Easy-Excel合并单元格数据

    最终效果图 废话不多说,直接上代码 导入阿里云依赖jar包 封装实体类: 开始编写合并单元格: 组装数据的方法: 打完收工...欢迎大家来交流

  9. easyexcel 列头合并_2020-05-19:EasyExcel自定义合并单元格

    public static void writeExcelWithHeadAndData(OutputStream outputStream, List> head, List> body ...

最新文章

  1. python并发与并行_python多进程,多线程分别是并行还是并发
  2. Pidgin Portable 使用点滴
  3. js 获取字符串中最后一个斜杠前面/后面的内容
  4. Java第八天听课总结--jar 包的使用(1)
  5. 理解并取证:DLS网络架构和PPPOE数据帧
  6. android 判断ip地址合法
  7. 支持向量机的近邻理解:图像二分类为例(3)
  8. python交换数组中的两个元素_[Python]华为面试题,交换两个数组的元素使之总和的差值最小。...
  9. 大数据学习笔记07:分布式文件系统HDFS
  10. 【前端框架之Bootstrap 02】布局与导航
  11. ARM64 Linux 内核页表的块映射
  12. Mysql 时间格式默认空串 ‘0000-00-00 00:00:00‘ select抛出异常的解决方法
  13. Gentoo解决Windows系统txt文本中文乱码问题
  14. Android UI设计--ListView Item的OnItemLongClickListener同时监听两种事件
  15. php过滤多空格_php如何去除多余空格
  16. java面试的职业规划怎么说_java面试技巧-职业规划有技巧
  17. 运动世界校园显示服务器异常,运动世界校园跑完是异常成绩,计入有效成绩里吗?...
  18. 【Java】Red5服务器搭建(实现在线直播,流媒体视频播放)
  19. 区块链知识转载博文1: 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)
  20. 阿里云 mysql 创建数据库 账户密码 外网连接等

热门文章

  1. 交通灯管理系统视频学习
  2. 投身开源,需要持之以恒的热爱与贡献 —— Apache Spark Committer 姜逸坤
  3. 《袁老师访谈录》第十一期|宗福季教授/香港科大(广州)信息枢纽署理院长【问诊未来·院长系列:拥抱数字化转型】...
  4. springboot+英语在线学习系统 毕业设计-附源码211714
  5. 慧尔视:以CRM为抓手,打造用数据说话的企业
  6. (java)2的幂次方
  7. 微信公众帐号消息帐号
  8. 考研学姐经验:英语92分学姐的考研备考经验分享
  9. 端游开发用什么技术可以让用户更短时间内体验游戏?端游分发...
  10. 离职原因该怎么说才比较好 ?