文章目录

  • 前言
  • 一、EasyExcel导出
    • 1.关键代码
    • 2.测试
    • 3.导出结果展示
  • 总结

前言

提示:以下是本篇文章正文内容,下面案例可供参考
自定义表头导出excel,并在同sheet中进行分页

一、EasyExcel导出

1.关键代码

代码如下(示例):

EasyExcelUtils

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.merge.LoopMergeStrategy;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.WriteTable;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
import com.alibaba.excel.write.style.row.SimpleRowHeightStyleStrategy;
import org.apache.poi.ss.usermodel.*;import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** @description: easyexcel 实现自定义表头并在同一个 sheet 中分页* easyexcel 引用的是 3.1.1 版本*/
public class EasyExcelUtils {/*** 下载 excel** @param response* @param list 主体表格数据* @throws Exception*/public static void download(HttpServletResponse response, List<?> list) throws Exception {// 总共 8 列int columnTotal = 8;// 首行标题List<List<String>> titleData = new ArrayList<>();List<String> title = Arrays.asList("这是标题");titleData.add(title);// 中间抬头部分List<List<String>> secondData = new ArrayList<>();// 合并前3列, 合并后5列List<String> second1 = Arrays.asList("这是抬头1", "", "", "抬头1的内容");List<String> second2 = Arrays.asList("这是抬头2", "", "", "抬头2的内容");secondData.add(second1);secondData.add(second2);// 末尾合计List<List<String>> totalData = new ArrayList<>();List<String> total = new ArrayList<>();for (int i = 1; i <= columnTotal; i++) {if (i == 1) {total.add("合计");continue;}if (i == columnTotal) {total.add("这是合计总数");continue;}total.add("");}totalData.add(total);excelCreate(response, list, columnTotal, titleData, secondData, totalData);}/*** excel 表格生成** @param response* @param list 主体表格数据* @param columnTotal 总列数* @param titleData 表头数据* @param secondData 第二部分抬头数据* @param totalData 合计数据* @throws Exception*/private static void excelCreate(HttpServletResponse response, List<?> list, int columnTotal, List<List<String>> titleData,List<List<String>> secondData, List<List<String>> totalData) throws Exception {response.setContentType("application/octet-stream");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode("Excel文件名称" + DateTimeFormatter.BASIC_ISO_DATE.format(LocalDate.now()), "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build()) {WriteSheet sheet = EasyExcel.writerSheet("sheetName").build();// 按每5行数据进行分页int pageNum = (int) Math.ceil(list.size() / 5d);if (pageNum == 0) {pageNum = 1;}for (int i = 1; i <= pageNum; i++) {WriteTable titleTable = titleTableCreate(columnTotal);WriteTable secondTable = secondTableCreate(columnTotal);WriteTable headTable = headTableCreate(i + 1);WriteTable totalTable = totalTableCreate(pageNum + 2);excelWriter.write(titleData, sheet, titleTable);excelWriter.write(secondData, sheet, secondTable);int startIndex = (i -1) * 5;int endIndex = Math.min(startIndex + 5, list.size());excelWriter.write(list.subList(startIndex, endIndex), sheet, headTable);excelWriter.write(totalData, sheet, totalTable);}}}/*** 生成标题表格** @param columnTotal* @return*/private static WriteTable titleTableCreate(int columnTotal) {// 合并单元格LoopMergeStrategy loopMergeStrategy = new LoopMergeStrategy(1, columnTotal, 0);// 样式WriteCellStyle titleStyle = new WriteCellStyle();// 水平居中titleStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 垂直居中titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 设置白色背景titleStyle.setFillForegroundColor(IndexedColors.WHITE1.getIndex());// 设置字体格式WriteFont font = new WriteFont();font.setBold(Boolean.TRUE);font.setFontHeightInPoints((short)14);font.setFontName("宋体");titleStyle.setWriteFont(font);HorizontalCellStyleStrategy titleStyleStrategy = new HorizontalCellStyleStrategy(titleStyle, titleStyle);// 生成表格WriteTable titleTable = EasyExcel.writerTable(0).registerWriteHandler(new SimpleRowHeightStyleStrategy((short)25, (short)25)).registerWriteHandler(loopMergeStrategy).registerWriteHandler(titleStyleStrategy).needHead(Boolean.FALSE).build();return titleTable;}/*** 生成抬头表格** @param columnTotal* @return*/private static WriteTable secondTableCreate(int columnTotal) {// 合并单元格LoopMergeStrategy loopMergeStrategy1 = new LoopMergeStrategy(1, 3, 0);LoopMergeStrategy loopMergeStrategy2 = new LoopMergeStrategy(1, columnTotal - 3, 3);// 样式WriteCellStyle secondStyle = new WriteCellStyle();// 水平居中secondStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 垂直居中secondStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 设置白色背景secondStyle.setFillForegroundColor(IndexedColors.WHITE1.getIndex());// 设置字体格式WriteFont font = new WriteFont();font.setBold(Boolean.FALSE);font.setFontHeightInPoints((short)12);font.setFontName("宋体");secondStyle.setWriteFont(font);HorizontalCellStyleStrategy secondStyleStrategy = new HorizontalCellStyleStrategy(secondStyle, secondStyle);// 生成表格WriteTable secondTable = EasyExcel.writerTable(1).registerWriteHandler(new SimpleRowHeightStyleStrategy((short)25, (short)25)).registerWriteHandler(loopMergeStrategy1).registerWriteHandler(loopMergeStrategy2).registerWriteHandler(secondStyleStrategy).needHead(Boolean.FALSE).build();return secondTable;}/*** 生成主体数据表格** @param tableNum* @return*/private static WriteTable headTableCreate(int tableNum) {List<List<String>> head = new ArrayList<>();List<String> headList = Arrays.asList("姓名", "性别", "年龄", "身份证号", "地址", "工作单位");List<String> subList = Arrays.asList("名称", "工号", "地址");headList.forEach(title -> {if ("工作单位".equals(title)) {subList.forEach(sub -> head.add(Arrays.asList(title, sub)));return;}head.add(Arrays.asList(title, title));});HorizontalCellStyleStrategy headStyleStrategy = headStyleStrategy();// 生成表格WriteTable titleTable = EasyExcel.writerTable(tableNum).registerWriteHandler(new AbstractColumnWidthStyleStrategy() {// 设置指定列的宽度@Overrideprotected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {Sheet sheet = writeSheetHolder.getSheet();int columnIndex = cell.getColumnIndex();if (columnIndex == 3 || columnIndex == 4 || columnIndex == 7) {sheet.setColumnWidth(columnIndex, 7000);} else {sheet.setColumnWidth(columnIndex, 3600);}}}).registerWriteHandler(new SimpleRowHeightStyleStrategy((short)25, (short)25)).registerWriteHandler(headStyleStrategy).head(head).needHead(Boolean.TRUE).build();return titleTable;}/*** 主体表格样式** @return*/private static HorizontalCellStyleStrategy headStyleStrategy() {// 主体表头样式WriteCellStyle headStyle = new WriteCellStyle();// 水平居中headStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 垂直居中headStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 设置灰色背景headStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());// 设置字体格式WriteFont font = new WriteFont();font.setBold(Boolean.FALSE);font.setFontHeightInPoints((short)12);font.setFontName("宋体");headStyle.setWriteFont(font);// 设置边框headStyle.setBorderLeft(BorderStyle.THIN);headStyle.setBorderRight(BorderStyle.THIN);headStyle.setBorderTop(BorderStyle.THIN);headStyle.setBorderBottom(BorderStyle.THIN);// 主题内容样式WriteCellStyle contentStyle = new WriteCellStyle();// 水平居中contentStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 垂直居中contentStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 设置灰色背景contentStyle.setFillForegroundColor(IndexedColors.WHITE1.getIndex());// 自动换行contentStyle.setWrapped(true);// 设置字体格式font = new WriteFont();font.setBold(Boolean.FALSE);font.setFontHeightInPoints((short)10);font.setFontName("宋体");contentStyle.setWriteFont(font);// 设置边框contentStyle.setBorderLeft(BorderStyle.THIN);contentStyle.setBorderRight(BorderStyle.THIN);contentStyle.setBorderTop(BorderStyle.THIN);contentStyle.setBorderBottom(BorderStyle.THIN);HorizontalCellStyleStrategy headStyleStrategy = new HorizontalCellStyleStrategy(headStyle, contentStyle);return headStyleStrategy;}/*** 生成合计表格** @param tableNum* @return*/private static WriteTable totalTableCreate(int tableNum) {// 样式WriteCellStyle totalStyle = new WriteCellStyle();// 水平靠左totalStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);// 垂直居中totalStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 设置灰色背景totalStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);totalStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());// 自动换行totalStyle.setWrapped(true);// 设置字体格式WriteFont font = new WriteFont();font.setBold(Boolean.FALSE);font.setFontHeightInPoints((short)10);font.setFontName("宋体");totalStyle.setWriteFont(font);HorizontalCellStyleStrategy totalStrategy = new HorizontalCellStyleStrategy(null, totalStyle);// 生成表格WriteTable titleTable = EasyExcel.writerTable(tableNum).registerWriteHandler(new SimpleRowHeightStyleStrategy((short)25, (short)25)).registerWriteHandler(totalStrategy).needHead(Boolean.FALSE).build();return titleTable;}
}

UserInfo:

/*** @description: 用户信息*/
public class UserInfo {private String name;private String sex;private Integer age;private String cardNo;private String address;private String companyName;private String workNo;private String companyAddress;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getCardNo() {return cardNo;}public void setCardNo(String cardNo) {this.cardNo = cardNo;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getCompanyName() {return companyName;}public void setCompanyName(String companyName) {this.companyName = companyName;}public String getWorkNo() {return workNo;}public void setWorkNo(String workNo) {this.workNo = workNo;}public String getCompanyAddress() {return companyAddress;}public void setCompanyAddress(String companyAddress) {this.companyAddress = companyAddress;}
}

2.测试

代码如下(示例):

    @GetMapping("/export")public void downExcel(HttpServletResponse response){try {List<UserInfo> userInfos = buildUserInfos();EasyExcelUtils.download(response, userInfos);} catch (Exception e) {e.printStackTrace();}}private List<UserInfo> buildUserInfos() {List<UserInfo> userInfos = new ArrayList<>();for (int i = 0; i < 20; i++) {UserInfo userInfo = new UserInfo();userInfo.setName("姓名" + i);userInfo.setSex("男");userInfo.setAge(17 + i);userInfo.setCardNo("身份证号" + i);userInfo.setAddress("住址" + i);userInfo.setCompanyName("公司名称" + i);userInfo.setWorkNo("工号" + i);userInfo.setCompanyAddress("公司地址" + i);userInfos.add(userInfo);}return userInfos;}

3.导出结果展示


总结

因为业务场景的不同,需要不同样式的导出模板,自定义表头的灵活性更高,可以根据这个进行扩展,不同格式按不同 table 划分,然后组装,以满足更多场景下的导出

EasyExcel自定义复杂的表头并在同sheet中实现分页相关推荐

  1. EasyExcel自定义表头导出模板并封装数据下拉选择

    EasyExcel自定义表头导出模板 首先查询可变数据 动态数据Controller 表头封装 定义导出模板时的下拉数据 最终结果 首先查询可变数据 动态数据Controller @ApiOperat ...

  2. Java开发日志 - EasyExcel自定义类型转换、Excel表头字段问题

    1. EasyExcel自定义数据转换 EasyExcel 是阿里的一个用来读取和写入excel的库, 因为项目需要, 所以我需要从前端上传excel文件, 然后导入到数据库中 1.1 自定义转换类 ...

  3. EasyExcel解析简易动态表头列及其简用

    前言 项目组祖传的POI代码,是基于entity实体类来固定格式解析,对应EXCEL是多少表头展示解析多少表头,需要改祖传代码,比较麻烦,时间不够.故用二次封装POI的EasyExcel来进行简易实现 ...

  4. 【Easyexcel】使用easyexcel导出带有固定表头的excel代码,并且有合并单元格操作

    以下是一个使用EasyExcel导出带有固定表头并且带有合并单元格的Excel代码示例: //创建excel对象 ExcelWriter writer = EasyExcel.write(" ...

  5. 打印设置自定义表尾_教大家Excel2013表格中如何打印固定的表头和表尾

    近日有关于Excel2013表格中如何打印固定的表头和表尾的问题受到了很多网友们的关注,大多数网友都想要知道Excel2013表格中如何打印固定的表头和表尾的具体情况,那么关于到Excel2013表格 ...

  6. EasyExcel动态导出多级表头

    EasyExcel动态导出多级表头 工具类 /*** 特殊表头导出方法* @param response* @param fileName* @param sheetName* @param list ...

  7. elementui 表格表头竖着显示_Vue+Element自定义纵向表格表头教程

    如下所示: 代码如下: {{ item.key }} {{ item.value }} 绑定的是 statDatas 属性是一个 json数组,由key value组成的json,如果需要多列就直接增 ...

  8. easyExcel下载多个标题,多个sheet页Excel的案例

    1.前一段时间使用Eaexcel做了一个下载EXCEL的功能,发现网上有很多的分享不是很全面,我是查询后结合了很多的案例和博客,开发了这个功能,现将其分享给大家, (1)废话不多说,上代码:先看Esb ...

  9. (二)Easyexcel 的使用(读取数据到map集合中)

    前面讲述了使用实体类的方式绑定excel表头的方式进行读取和写入操作,是比较简单的,那么由于表头可能会变,那么就不能使用绑定实体类的方式进行了,于是搜索百度一番,借鉴别人的博客,使用map集合的方式进 ...

最新文章

  1. showModalDialog 传值及刷新
  2. 了解linux服务器,教你快速了解一台Linux系统服务器的方法
  3. CentOS7部署Flask+Gunicorn+Nginx+Supervisor
  4. 一口气管理几十个中断不是问题
  5. android fragment addtobackstack,Android Fragment Back Stack的问题
  6. BAPI_SALESDOCU_CREATEFROMDATA1--VA01
  7. 风险模型—VaR模型2
  8. P1192 台阶问题
  9. 家里蹲太孤单?来用python画一只单身狗吧
  10. OTU/ASV/Feature tabel 表格 过滤 相对丰度 微生物
  11. 混合现实在医学领域的应用学习日志
  12. 通过 ICMP 协议实现 Ping Tunnel 建立可穿透网络隧道
  13. 什么是平台架构?平台架构的用处有哪些?
  14. 挂站服务器什么意思?挂站服务器可以挂多少网站?
  15. 二叉树的遍历 中序线索二叉树
  16. 中国大茴香行业利润及销量增长情况报告(新版)2021-2026年
  17. 中文分词软件包的使用
  18. php调用相册其他的图片代码,远程调用163网易相册的代码PHP版本
  19. 这恐怕是学习Frida最详细的笔记了
  20. 微信小程序开发之——mpvue开发小程序

热门文章

  1. CSS学习笔记一 ——详细附图、入门必看
  2. 搞一下整车以太网技术 | 04 CBS基于信用整形
  3. opencv3-编程入门学习笔记
  4. 试题 算法训练 翻转旋转变换
  5. 【记录贴】AD21将元素复制到KeepOutLayer层的方法
  6. 提高转化率的 3 个客户引导最佳实践
  7. 常用的几款交互设计软件
  8. 2020,我不想奋斗了
  9. 多表联查时的条件筛选
  10. 莫纳什大学计算机工程,莫纳什大学计算机系统工程专业本科.pdf