商品导出

This commit is contained in:
gong
2026-01-30 14:13:02 +08:00
parent 73929aaac5
commit 496c931678
5 changed files with 318 additions and 148 deletions

View File

@@ -1,9 +1,12 @@
package com.czg.excel;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
@@ -248,54 +251,66 @@ public class ExcelExportUtil {
}
/**
* 带合并单元格的商品导出到Response
* 带合并单元格的导出到Response
* 多sheet导出到response
*
* @param data 数据列表
* @param sheetDataList 数据列表
* @param fileName 文件名
* @param response HttpServletResponse
* @param <T> 数据类型
*/
public static <T> void exportProductWithMergeToResponse(List<T> data, Class<T> clazz,
String fileName,
HttpServletResponse response, List<SheetWriteHandler> handlers) {
if (data == null) {
data = Collections.emptyList();
public static void exportMultipleSheetsToResponse(List<SheetData> sheetDataList,
String fileName,
HttpServletResponse response) {
if (CollectionUtil.isEmpty(sheetDataList)) {
throw new CzgException("数据列表不能为空");
}
setResponseHeader(response, fileName, DEFAULT_CONFIG);
try (OutputStream outputStream = response.getOutputStream()) {
// 创建样式策略 - 设置表头和内容都居中
// 创建样式策略
WriteCellStyle headStyle = new WriteCellStyle();
headStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
headStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
headStyle.setVerticalAlignment(VerticalAlignment.CENTER);
WriteCellStyle contentStyle = new WriteCellStyle();
contentStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
contentStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
contentStyle.setVerticalAlignment(VerticalAlignment.CENTER);
HorizontalCellStyleStrategy styleStrategy = new HorizontalCellStyleStrategy(headStyle, contentStyle);
// 创建写入器 - 必须指定clazz
ExcelWriterBuilder builder = EasyExcel.write(outputStream, clazz)
// 创建ExcelWriter
ExcelWriterBuilder builder = EasyExcel.write(outputStream)
.autoCloseStream(true)
.registerConverter(new LocalTimeConverter())
.registerWriteHandler(styleStrategy);
if (handlers != null && !handlers.isEmpty()) {
for (SheetWriteHandler h : handlers) {
builder.registerWriteHandler(h);
}
}
ExcelWriter excelWriter = builder.build();
WriteSheet writeSheet = EasyExcel.writerSheet(DEFAULT_CONFIG.getDefaultSheetName()).build();
// 逐个写入sheet
for (int i = 0; i < sheetDataList.size(); i++) {
SheetData sheetData = sheetDataList.get(i);
String sheetName = StrUtil.isNotBlank(sheetData.getSheetName())
? sheetData.getSheetName()
: DEFAULT_CONFIG.getDefaultSheetName() + (i + 1);
ExcelWriterSheetBuilder sheetBuilder = EasyExcel.writerSheet(sheetName);
// 注册该sheet的合并处理器
if (sheetData.getHandlers() != null && !sheetData.getHandlers().isEmpty()) {
for (SheetWriteHandler handler : sheetData.getHandlers()) {
sheetBuilder.registerWriteHandler(handler);
}
}
WriteSheet writeSheet = sheetBuilder.head(sheetData.getClazz()).build();
excelWriter.write(sheetData.getData(), writeSheet);
}
excelWriter.write(data, writeSheet);
excelWriter.finish();
log.info("带合并单元格的商品Excel导出成功文件名{},数据量:{}", fileName, data.size());
log.info("多sheet商品Excel导出成功文件名{},共{}个sheet", fileName, sheetDataList.size());
} catch (IOException e) {
log.error("带合并单元格的商品Excel导出失败", e);
log.error("多sheet商品Excel导出失败", e);
throw new CzgException("Excel导出失败", e);
}
}

View File

@@ -0,0 +1,21 @@
package com.czg.excel;
import com.alibaba.excel.write.handler.SheetWriteHandler;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
/**
* 多sheet导出数据封装类
* @author yjjie
* @date 2026/1/30 10:53
*/
@Data
@Accessors(chain = true)
public class SheetData {
private List<?> data;
private Class<?> clazz;
private String sheetName;
private List<SheetWriteHandler> handlers;
}