1、优化导出任务树

2、getTaskTree转换执行规范名称
This commit is contained in:
2025-12-17 09:22:35 +08:00
parent c29ad0f00e
commit b2b0153e66
11 changed files with 314 additions and 9 deletions

View File

@@ -0,0 +1,10 @@
package com.sdm.common.entity.req.data;
import lombok.Data;
import java.util.List;
@Data
public class QueryFileReq {
List<Long> fileIdList;
}

View File

@@ -24,4 +24,14 @@ public class TaskTreeExportExcelParam {
*/
private List<String> taskIdList;
/**
* 合并单元格的起始索引
*/
private Integer startIndex;
/**
* 合并单元格的结束索引
*/
private Integer endIndex;
}

View File

@@ -194,4 +194,18 @@ public class DataClientFeignClientImpl implements IDataFeignClient {
return SdmResponse.failed("权限更新失败");
}
}
@Override
public SdmResponse<List<FileMetadataInfoResp>> queryFileListByIdList(QueryFileReq queryFileReq) {
SdmResponse response;
try {
response = dataClient.queryFileListByIdList(queryFileReq);
log.info("查询文件列表成功:"+ response);
return response;
} catch (Exception e) {
log.error("查询文件列表失败:", e);
return SdmResponse.failed("查询文件列表失败");
}
}
}

View File

@@ -73,4 +73,7 @@ public interface IDataFeignClient {
@PostMapping("/data/updatePermission")
SdmResponse updatePermission(@RequestBody UpdatePermissionReq req);
@PostMapping("/data/queryFileListByIdList")
SdmResponse<List<FileMetadataInfoResp>> queryFileListByIdList(@RequestBody QueryFileReq queryFileReq);
}

View File

@@ -5,6 +5,7 @@ import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.sdm.common.entity.ExportExcelFormat;
import com.sdm.common.entity.req.task.TaskTreeExportExcelParam;
import io.micrometer.common.util.StringUtils;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
@@ -12,7 +13,6 @@ import org.apache.commons.lang3.ObjectUtils;
import org.apache.poi.ss.formula.functions.T;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;
@@ -214,6 +214,10 @@ public class ExcelUtil {
style.setBorderTop(borderStyle);
style.setBorderRight(borderStyle);
style.setFont(font);
// 水平居中
style.setAlignment(HorizontalAlignment.CENTER);
// 垂直居中
style.setVerticalAlignment(VerticalAlignment.CENTER);
return style;
}
/**
@@ -584,4 +588,172 @@ public class ExcelUtil {
exportExcel(excelSheets,response);
}
/**
* 导出excel按任务维度进行合并单元格
* @param dataArray
* @param exportExcelFormats
*/
public static void exportExcelOneDimensional(JSONArray dataArray,List<ExportExcelFormat> exportExcelFormats,HttpServletResponse response,List<TaskTreeExportExcelParam> paramList)
{
ExcelSheet excelSheet = new ExcelSheet();
excelSheet.setSheetName("export sheet1");
//获取excel表头
List<HeadVO> excelHeader = getExcelHeader(exportExcelFormats,null);
excelSheet.setHeads(excelHeader);
//获取excel表行数据
for(int index=0;index<dataArray.size();index++)
{
JSONObject rowObj = dataArray.getJSONObject(index);
RowValue rowValue = new RowValue();
for (ExportExcelFormat exportExcelFormat : exportExcelFormats)
{
ExcelCellValue cellValue = new ExcelCellValue();
String value = rowObj.getString(exportExcelFormat.getKey());
if(value != null && !"null".equalsIgnoreCase(value)) {
JSONObject dictData = exportExcelFormat.getDictData();
if(ObjectUtils.isNotEmpty(dictData))
{
if (StringUtils.isNotBlank(dictData.getString(value))) {
value = dictData.getString(value);
}
}
cellValue.setValue(value);
}
rowValue.getCells().add(cellValue);
}
excelSheet.getRowValues().add(rowValue);
}
List<ExcelSheet> excelSheets = new ArrayList<>();
excelSheets.add(excelSheet);
exportExcelOneDimensional(excelSheets,response,paramList);
}
/**
* 导出excel
* @param sheets
* @param response
*/
public static void exportExcelOneDimensional(List<ExcelSheet> sheets, HttpServletResponse response,List<TaskTreeExportExcelParam> paramList) {
try {
Workbook workBook = new XSSFWorkbook();
for (ExcelSheet sheetData : sheets) {
Sheet sheet = workBook.createSheet(sheetData.getSheetName());
List<ColumnMergeInfo> columnMergeInfos = writeSheetHeader(workBook,sheet, sheetData.getHeads());
writeSheetRowsOneDimensional(workBook,sheet, sheetData.getRowValues(), columnMergeInfos,sheetData.getHeads(),paramList);
autoSizeColumnWidth(sheet);
}
workBook.write(response.getOutputStream());
workBook.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* 写入excel行数据
* @param sheet
* @param rowValues
*/
private static void writeSheetRowsOneDimensional(Workbook workbook,Sheet sheet,List<RowValue> rowValues,List<ColumnMergeInfo> columnMergeInfos,List<HeadVO> headers,List<TaskTreeExportExcelParam> paramList)
{
int rowIndex = 1;
Font cellFont = makeFont(workbook,"宋体",false,(short) 11,IndexedColors.BLACK.getIndex());
CellStyle cellStyle = makeStyle(workbook,cellFont,BorderStyle.THIN);
for(RowValue rowValue : rowValues)
{
Row row = sheet.createRow(rowIndex);
int columnIndex = 0;
for(ExcelCellValue cellValue : rowValue.getCells())
{
HeadVO headVO = headers.get(columnIndex);
if(!headVO.getExcelHeaderInfo().isBShow()) {
columnIndex++;
continue;
}
Cell cell = row.createCell(columnIndex);
cell.setCellStyle(cellStyle);
cell.setCellValue(String.valueOf(cellValue.getValue()));
columnIndex++;
}
rowIndex++;
}
Integer startIndex;
Integer endIndex;
for (TaskTreeExportExcelParam taskTreeExportExcelParam : paramList) {
startIndex = taskTreeExportExcelParam.getStartIndex();
endIndex = taskTreeExportExcelParam.getEndIndex();
if (!Objects.equals(startIndex, endIndex)) {
for (int i = 0; i < 8; i++) {
sheet.addMergedRegion(new CellRangeAddress(startIndex, endIndex, i, i));
}
}
}
}
/**
* 自动设置列宽为当前列最长文本宽度
* @param sheet Excel工作表
*/
public static void autoSizeColumnWidth(Sheet sheet) {
// 存储每列的最大字符数
Map<Integer, Integer> columnMaxLength = new HashMap<>();
// 1. 遍历所有行,统计每列最大字符数
for (Row row : sheet) {
for (Cell cell : row) {
int columnIndex = cell.getColumnIndex();
String cellValue = getCellStringValue(cell);
int currentLength = cellValue.length();
// 更新当前列的最大长度
columnMaxLength.put(columnIndex,
Math.max(columnMaxLength.getOrDefault(columnIndex, 0), currentLength));
}
}
// 2. 遍历列,设置适配宽度
for (Map.Entry<Integer, Integer> entry : columnMaxLength.entrySet()) {
int columnIndex = entry.getKey();
int maxLength = entry.getValue();
// 计算列宽:字符数 × 256POI列宽单位 + 边距2000
// 256 = 1个字符宽度2000 = 边距(可根据需求调整)
int columnWidth = Math.min(maxLength * 256 + 2000, 65535); // 最大列宽不超过65535
sheet.setColumnWidth(columnIndex, columnWidth);
}
}
/**
* 获取单元格的字符串值(兼容不同单元格类型)
* @param cell 单元格
* @return 字符串值
*/
private static String getCellStringValue(Cell cell) {
if (cell == null) {
return "";
}
switch (cell.getCellType()) {
case STRING:
return cell.getStringCellValue().trim();
case NUMERIC:
// 处理数字(避免科学计数法)
return String.valueOf((long) cell.getNumericCellValue()).trim();
case BOOLEAN:
return String.valueOf(cell.getBooleanCellValue()).trim();
case FORMULA:
// 计算公式结果
try {
return String.valueOf(cell.getNumericCellValue()).trim();
} catch (Exception e) {
return cell.getStringCellValue().trim();
}
default:
return "";
}
}
}