From 64506eaa6977059a8b2c3e43d138342b696c5a72 Mon Sep 17 00:00:00 2001 From: haomingming Date: Sun, 4 Jan 2026 12:18:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=87=BA=E5=A4=A7=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CaseplatformCaseExcelController.java | 60 +++++++++++++++---- 1 file changed, 48 insertions(+), 12 deletions(-) diff --git a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/controller/CaseplatformCaseExcelController.java b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/controller/CaseplatformCaseExcelController.java index f73f1b5..8f4c0f7 100644 --- a/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/controller/CaseplatformCaseExcelController.java +++ b/sa-admin/src/main/java/net/lab1024/sa/admin/module/business/caseplatformcase/controller/CaseplatformCaseExcelController.java @@ -146,29 +146,65 @@ public class CaseplatformCaseExcelController { contentStyle.setBorderRight(BorderStyle.THIN); // ExcelWriter writer = EasyExcel.write(outputStream, ExportExpertCaseExcelVo.class) +// ExcelWriter writer = EasyExcel.write(response.getOutputStream(), ExportExpertCaseExcelVo.class) +// .head(head) +// .excelType(ExcelTypeEnum.XLSX) +// .registerWriteHandler(new HorizontalCellStyleStrategy(headStyle, contentStyle)) +// .build(); +// +// WriteSheet writeSheet = EasyExcel.writerSheet("劳务费明细") +// .needHead(true) +// .relativeHeadRowIndex(1) // 数据从第3行开始,前2行为标题 +// .build(); +// +// // 写数据 +// writer.write(processedList, writeSheet); +// +// // 合并大标题 +// Workbook workbook = (Workbook) writer.writeContext().writeWorkbookHolder().getWorkbook(); +// Sheet sheet = workbook.getSheetAt(0); +// sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, head.size() - 1)); +// //Row titleRow = sheet.createRow(0); +// Row titleRow = sheet.getRow(0); +// if (titleRow == null) { +// titleRow = sheet.createRow(0); +// } + + // 1. 构建ExcelWriter(先不写入数据,先处理大标题行) ExcelWriter writer = EasyExcel.write(response.getOutputStream(), ExportExpertCaseExcelVo.class) .head(head) .excelType(ExcelTypeEnum.XLSX) .registerWriteHandler(new HorizontalCellStyleStrategy(headStyle, contentStyle)) + // 关键:禁用EasyExcel自动创建表头行(后续手动控制行号) + .needHead(false) .build(); - WriteSheet writeSheet = EasyExcel.writerSheet("劳务费明细") - .needHead(true) - .relativeHeadRowIndex(1) // 数据从第3行开始,前2行为标题 - .build(); - - // 写数据 - writer.write(processedList, writeSheet); - - // 合并大标题 + // 2. 先获取Workbook和Sheet,手动创建大标题行(行0),此时行未刷盘 Workbook workbook = (Workbook) writer.writeContext().writeWorkbookHolder().getWorkbook(); Sheet sheet = workbook.getSheetAt(0); - sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, head.size() - 1)); - //Row titleRow = sheet.createRow(0); + if (sheet == null) { + sheet = workbook.createSheet("劳务费明细"); + } + + // 3. 手动创建行0(大标题行),此时行在内存中,未刷盘 Row titleRow = sheet.getRow(0); if (titleRow == null) { titleRow = sheet.createRow(0); } + + // 合并大标题行(0行0列 到 0行最后一列) + sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, head.size() - 1)); + + + // 4. 构建WriteSheet:表头从行1开始,数据从行2开始(对应relativeHeadRowIndex(1)) + WriteSheet writeSheet = EasyExcel.writerSheet("劳务费明细") + .needHead(true) // 重新开启表头,表头写入行1 + .relativeHeadRowIndex(1) // 数据从行2开始(表头行1 + 1) + .build(); + + // 5. 最后写入数据(行号递增:行0→行1→行2+,无回头修改) + writer.write(processedList, writeSheet); + titleRow.setHeightInPoints(30); // 设置标题行高 Cell titleCell = titleRow.createCell(0); titleCell.setCellValue("人工肝诊疗病例征集项目专家劳务费表"); @@ -251,7 +287,7 @@ public class CaseplatformCaseExcelController { response.setContentType("multipart/form-data"); response.setCharacterEncoding("utf-8"); writer.finish(); - + response.getOutputStream().flush(); outputStream.close(); } catch (Exception e) {