官网文档:https://www.hutool.cn/docs/#/poi/Excel%E7%94%9F%E6%88%90-ExcelWriter
代码如下(示例):
<!--糊涂工具包-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.16</version>
</dependency>
2、代码如下(示例):
package com.hnxh.business.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.poi.excel.BigExcelWriter;
import cn.hutool.poi.excel.ExcelUtil;
import com.hnxh.business.domain.dto.excel.DynamicHeader;
import java.util.*;
/**
* @author Kite
*/
public class Demo {
public static void main(String[] args) {
Map<String, Object> row1 = new LinkedHashMap<>();
row1.put("姓名", "张三");
row1.put("年龄", 23);
row1.put("成绩", 88.32);
row1.put("是否合格", true);
row1.put("考试日期", DateUtil.date());
row1.put("成绩公布日期", DateUtil.date());
Map<String, Object> row2 = new LinkedHashMap<>();
row2.put("姓名", "李四");
row2.put("年龄", 33);
row2.put("成绩", 59.50);
row2.put("是否合格", false);
row2.put("考试日期", DateUtil.date()); //日期格式显示#### 列宽不足
row2.put("成绩公布日期", DateUtil.date());
ArrayList<Map<String, Object>> rows = CollUtil.newArrayList(row1, row2);
List<DynamicHeader> dynamicHeaders1 = new ArrayList<>(2);
dynamicHeaders1.add(new DynamicHeader(3, "一级表头列合并3列"));
dynamicHeaders1.add(new DynamicHeader(2, "一级表头列合并2列"));
List<DynamicHeader> dynamicHeaders2 = new ArrayList<>(2);
dynamicHeaders2.add(new DynamicHeader(2, "二级表头列合并2列"));
dynamicHeaders2.add(new DynamicHeader(3, "二级表头列合并3列"));
setExcelHeader(rows, Arrays.asList("多级行合并"), 2, dynamicHeaders1, dynamicHeaders2);
}
/**
* 组装Excel多级表头 不处理基础表头
* @param rows 导出内容 包涵基础表头
* @param fixedHeader 固定表头
* @param hierarchy 层级 (如:三级表头传 2 处理基础表头以上的表头)
* @param dynamicHeaders 动态表头 (如:二级表头 传入两个可变参数 占用行数 occupiedColumn 必须大于1 ;等于 1 数据走 固定表头 )
*/
private static void setExcelHeader(ArrayList<Map<String, Object>> rows,
List<String> fixedHeader,
Integer hierarchy,
List<DynamicHeader>... dynamicHeaders) {
//按时间戳生成随机数
String fileName = IdUtil.randomUUID() + ".xlsx";
// 通过工具类创建writer
BigExcelWriter writer = ExcelUtil.getBigWriter("d:/" + fileName);
//生成空表头
for (int i = 0; i < hierarchy; i++) {
//创建一行空表头占位置
writer.writeHeadRow(new LinkedList());
}
//合并固定表头
for (int i = 0; i < fixedHeader.size(); i++) {
// 合并单元格后的标题行,使用默认标题样式
writer.merge(0, hierarchy, i, i, fixedHeader.get(i), true);
}
//合并动态表格
for (int i = 0; i < hierarchy; i++) {
//动态表格开始列
int startCol = fixedHeader.size();
for (int j = 0; j < dynamicHeaders[i].size(); j++) {
DynamicHeader dynamicHeader = dynamicHeaders[i].get(j);
//开始合并行
Integer firstColumn = startCol;
//结束合并行
Integer lastColumn = (startCol + dynamicHeader.getOccupiedColumn()) - 1;
if (firstColumn.equals(lastColumn)) {
//写入单元格值 未找到指定行列的单元格内容方法
}else {
//合并单元格后的标题行,使用默认标题样式
writer.merge(i, i, firstColumn, lastColumn, dynamicHeader.getContent(), true);
}
startCol += dynamicHeader.getOccupiedColumn();
}
}
//设置列宽度 非必须
for (int i = 0; i < rows.get(0).size(); i++) {
writer.setColumnWidth(i,30);
}
// 一次性写出内容,使用默认样式,强制输出标题
writer.write(rows, true);
// 关闭writer,释放内存
writer.close();
}
}
package com.hnxh.business.domain.dto.excel;
import lombok.Data;
/**
* 动态表头
*
* @author Kite
* @date 2022/4/28
*/
@Data
public class DynamicHeader {
/**
* 占用列数
*/
private Integer occupiedColumn;
/**
* 内容
*/
private String content;
public DynamicHeader(Integer occupiedColumn, String content) {
this.occupiedColumn = occupiedColumn;
this.content = content;
}
}
官方:https://www.hutool.cn/docs/#/poi/Excel%E7%94%9F%E6%88%90-ExcelWriter
相关文档:https://www.cnblogs.com/likun10579/p/14488063.html