feat(wms/report): 新增自定义导出列顺序功能并优化导出弹窗布局

1. 在ExcelUtil工具类中新增exportExcelOrdered方法,支持按指定顺序的列动态生成表头和数据行进行导出
2. 重构接收报表页面的自定义导出弹窗:将布局拆分为左侧可选列面板和右侧导出顺序面板,支持拖拽排序
3. 新增后端/exportCustomOrdered接口,接收有序字段列表并调用新的导出方法
4. 优化弹窗样式:调整宽度、间距、滚动区域,新增顺序序号和移除按钮
5. 移除原有的/exportCustom接口,统一使用新的有序导出逻辑
This commit is contained in:
2026-06-01 15:14:34 +08:00
parent 285775c733
commit 8b1d7ed280
3 changed files with 277 additions and 53 deletions

View File

@@ -26,10 +26,15 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* Excel相关处理
@@ -353,4 +358,67 @@ public class ExcelUtil {
return IdUtil.fastSimpleUUID() + "_" + filename + ".xlsx";
}
/**
* 导出excel按指定顺序的列导出使用动态表头
*
* @param list 导出数据集合
* @param sheetName 工作表的名称
* @param orderedFields 按导出顺序排列的Java字段名列表
* @param fieldLabelMap Java字段名 -> Excel列头中文名 映射
* @param response 响应体
*/
public static <T> void exportExcelOrdered(List<T> list, String sheetName,
List<String> orderedFields,
Map<String, String> fieldLabelMap,
HttpServletResponse response) {
if (orderedFields == null || orderedFields.isEmpty()) {
throw new IllegalArgumentException("导出列不能为空");
}
// 构建动态表头
List<List<String>> heads = orderedFields.stream()
.map(f -> Collections.singletonList(fieldLabelMap.getOrDefault(f, f)))
.collect(Collectors.toList());
// 构建数据行
List<List<Object>> data = new ArrayList<>(list.size());
if (!list.isEmpty()) {
Map<String, Field> fieldCache = new HashMap<>();
Class<?> clazz = list.get(0).getClass();
for (T vo : list) {
List<Object> row = new ArrayList<>(orderedFields.size());
for (String fieldName : orderedFields) {
Field field = fieldCache.computeIfAbsent(fieldName, k -> {
try {
Field f = clazz.getDeclaredField(k);
f.setAccessible(true);
return f;
} catch (NoSuchFieldException e) {
return null;
}
});
try {
row.add(field != null ? field.get(vo) : null);
} catch (IllegalAccessException e) {
row.add(null);
}
}
data.add(row);
}
}
try {
resetResponse(sheetName, response);
ServletOutputStream os = response.getOutputStream();
EasyExcel.write(os)
.head(heads)
.autoCloseStream(false)
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
.registerConverter(new ExcelBigNumberConvert())
.sheet(sheetName)
.doWrite(data);
} catch (IOException e) {
throw new RuntimeException("导出Excel异常", e);
}
}
}