
EasyExcel多行复杂表头(所有表头可全部自定义)
easyexcel
快速、简洁、解决大文件内存溢出的java处理Excel工具
项目地址:https://gitcode.com/gh_mirrors/ea/easyexcel
·
我用的是最新版的,因为3.2.1+版本优化了读取Excel的速度
<!-- easy excel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.3</version>
</dependency>
// 因为我要动态获取日期dateList是日期
EasyExcelUtils.writeExcel(response,
fileName, sheetName, head(dateList), fillData(dateList, bedsInfos));
逻辑很简单就是一列一列的拼接List<Stirng>
private List<List<String>> head(List<LocalDate> dateList) {
List<List<String>> headTitles = Lists.newArrayList();
// 固定title
String billPeriodHead = "自定义日期区间";
headTitles.add(Lists.newArrayList(billPeriodHead, "序号", "序号"));
headTitles.add(Lists.newArrayList(billPeriodHead, "船号", "船号"));
headTitles.add(Lists.newArrayList(billPeriodHead, "持证人", "持证人"));
List<String> paymentTitles = Lists.newArrayList("上午", "下午");
for (LocalDate localDate : dateList) {
for (String paymentTitle : paymentTitles) {
headTitles.add(Lists.newArrayList(billPeriodHead, String.valueOf(localDate.getDayOfMonth()) + "日",
paymentTitle));
}
}
return headTitles;
}
一列一列进行拼接

效果图:

EasyExcelUtils .writeExcel直接就是导出excel了,下面的是样式
package com.shunsheng.admin.utils;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.shunsheng.common.converter.LocalDateConverter;
import com.shunsheng.common.converter.LocalDateTimeConverter;
import com.shunsheng.common.exception.CustomException;
import com.shunsheng.common.exception.code.CustomCode;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
* @author MaoM
* @description EasyExcel工具类
* @date 2024/03/05
*/
@Slf4j
public class EasyExcelUtils {
/**
* excel导出方法
* @param response http请求
* @param filename 文件名
* @param sheetName Excel sheet名
* @param head 表头
* @param data 数据
*/
public static <T> void writeExcel(HttpServletResponse response, String filename, String sheetName,
List<List<String>> head, List<T> data) {
try {
response.setHeader("Content-disposition", "attachment;filename*=" + URLEncoder.encode(filename,
StandardCharsets.UTF_8.name()) + ".xlsx");
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
response.setContentType("application/vnd.ms-excel");
// 在此处开放Content-Disposition权限,前端代码才能获取到表名
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
EasyExcel.write(response.getOutputStream())
.autoCloseStream(Boolean.FALSE)
.sheet(sheetName)
.head(head)
// 自适应列宽
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
.registerWriteHandler(getStyleStrategy())
.registerConverter(new LocalDateConverter()).registerConverter(new LocalDateTimeConverter())
.doWrite(data);
} catch (Exception e) {
log.error("导出信息失败: [{}]", e.getLocalizedMessage());
e.printStackTrace();
throw new CustomException(CustomCode.FILE_EXPORT_ERROR);
}
}
public static HorizontalCellStyleStrategy getStyleStrategy() {
// 头的策略 样式调整
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
// 水平对齐方式
headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
// 垂直对齐方式
headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
// 内容的策略
WriteCellStyle contentStyle = new WriteCellStyle();
// 设置 水平居中
contentStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
// 设置细边框
contentStyle.setBorderBottom(BorderStyle.THIN);
contentStyle.setBorderLeft(BorderStyle.THIN);
contentStyle.setBorderRight(BorderStyle.THIN);
contentStyle.setBorderTop(BorderStyle.THIN);
// 设置边框颜色 25级灰度
contentStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
contentStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
contentStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
contentStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
// 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
return new HorizontalCellStyleStrategy(headWriteCellStyle, contentStyle);
}
}
因为版本提高了所以转换器也发生了改变
Date转换器
package com.shunsheng.common.converter;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.alibaba.excel.util.StringUtils;
import java.text.ParseException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
/**
* @author MaoM
* @description Date转换器
* @date 2023/12/21
*/
public class LocalDateConverter implements Converter<LocalDate> {
private final static String DATE_FORMAT = "yyyy-MM-dd";
@Override
public Class<LocalDate> supportJavaTypeKey() {
return LocalDate.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public LocalDate convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty,
GlobalConfiguration globalConfiguration) throws ParseException {
String value = cellData.getStringValue();
if (StringUtils.isNotBlank(value)) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT);
return LocalDate.parse(value, formatter);
}
return null;
}
@Override
public WriteCellData<?> convertToExcelData(LocalDate localDate, ExcelContentProperty excelContentProperty,
GlobalConfiguration globalConfiguration) {
if (localDate != null) {
return new WriteCellData<>(DateTimeFormatter.ofPattern(DATE_FORMAT).format(localDate));
}
return null;
}
}
LocalDateTime时间转换器
package com.shunsheng.common.converter;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* @author MaoM
* @description LocalDateTime时间转换器
* @date 2023/12/21
*/
public class LocalDateTimeConverter implements Converter<LocalDateTime> {
private final static String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
@Override
public Class<LocalDateTime> supportJavaTypeKey() {
return LocalDateTime.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
@Override
public LocalDateTime convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty excelContentProperty,
GlobalConfiguration globalConfiguration) {
String value = cellData.getStringValue();
if (StringUtils.isNotBlank(value)) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT);
return LocalDateTime.parse(value, formatter);
}
return null;
}
@Override
public WriteCellData<String> convertToExcelData(LocalDateTime localDateTime,
ExcelContentProperty excelContentProperty
, GlobalConfiguration globalConfiguration) {
if (localDateTime != null) {
return new WriteCellData<>(DateTimeFormatter.ofPattern(DATE_FORMAT).format(localDateTime));
}
return null;
}
}
快速、简洁、解决大文件内存溢出的java处理Excel工具
最近提交(Master分支:3 个月前 )
c42183df
Bugfix 3 个月前
efa7dff6 * 重新加回 `commons-io`
3 个月前
更多推荐

所有评论(0)