EasyExcel复杂导出

javascript 复制代码
  /**
   * 导出明细Excel
   */
  exportDtl: async (data: any) => {
    return request({
      url: '/qua/packing/inspect-cp-release-sh-dtl/exportDtl',
      method: 'POST',
      data: data, // 直接传递数据
      responseType: 'blob', // 放在这里,不是data里面
      headers: {
        "Content-Type": "application/json;charset=UTF-8"
      },
    })
  },
java 复制代码
package com.yunjin.matyl.domain.po.pbms;

import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.HeadFontStyle;
import com.alibaba.excel.annotation.write.style.HeadStyle;
import com.alibaba.excel.enums.BooleanEnum;
import com.alibaba.excel.enums.poi.FillPatternTypeEnum;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.yunjin.framework.support.domain.po.BasePo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

/**
 * .
 * 原料质检明细表实体类
 *
 * @author 自动生成
 * @since 2024-01-13
 */
@EqualsAndHashCode(callSuper = true)
@Data
@HeadStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 9) // 白色背景
@HeadFontStyle(fontHeightInPoints = 10, bold = BooleanEnum.TRUE, fontName = "宋体") // 表头字体:12磅,加粗,宋体
@TableName(value = "pbms.t_mat_yl_qc_detail", excludeProperty = {"isdel", "isused", "creationdate"})
@ExcelIgnoreUnannotated // 只导出带有@ExcelProperty注解的字段
public class MatYlQcDetailNew extends BasePo implements Serializable {

    private static final long serialVersionUID = 1L;



    /** . 主键 */
    @TableId(type = IdType.ASSIGN_ID, value = "pid")
    @ApiModelProperty("主键")
    private Long pid;

    /** . 原料质检表ID(关联pbms.t_mat_yl_qc) */
    @ApiModelProperty("原料质检表ID")
    private Long ylqcid;

    /** . 物料ID(关联表pub.t_pb_material) */
    @ApiModelProperty("物料ID")
    private Long materialid;

    /** . 物料SKU表ID(关联表pub.t_pb_materialsku) */
    @ApiModelProperty("物料SKU表ID")
    private Long materialskuid;

    /** . 条码类型(关联公共参数表pub.t_pb_basedata取参数ID) */
    @ApiModelProperty("条码类型ID")
    private Long codetype;

    /** . 物料条码 */
    @ApiModelProperty("物料条码")
    private String barcode;

    /** . 短条码(识别码) */
    @ApiModelProperty("短条码")
    private String barcodeshort;

    /** . 生产日期 */
    @ApiModelProperty("生产日期")
    private Date prodate;

    /** . 取样量 */
    @ApiModelProperty("取样量")
    private BigDecimal sampleweight;

    /** . 计量单位(关联表pub.t_pb_measureunit默认公斤) */
    @ApiModelProperty("计量单位ID")
    private Long unitid;

    /** . 扫码时间 */
    @ApiModelProperty("扫码时间")
    private Date scantime;

    /** . 货位(备用) */
    @ApiModelProperty("货位")
    private String locationid;

    /** . 箱号 */
    @ApiModelProperty("箱号")
    @ExcelProperty(value = "箱号", index = 1)
    private String boxnumber;

    /** . 重量(kg) */
    @ApiModelProperty("重量")
    @ExcelProperty(value = "重量", index = 3)
    private BigDecimal itemweight;

    /** . 水份(%) */
    @ApiModelProperty("水份")
    @ExcelProperty(value = "水份", index = 4)
    private BigDecimal itemwater;

    /** . 外观 */
    @ApiModelProperty("外观")
    @ExcelProperty(value = "外观", index = 2)
    private String itemappearance;

    /** . 虫情 */
    @ApiModelProperty("虫情")
    @ExcelProperty(value = "虫情", index = 5)
    private String iteminsect;

    /** . 异味 */
    @ApiModelProperty("异味")
    @ExcelProperty(value = "异味", index = 6)
    private String itemodor;

    /** . 霉变 */
    @ApiModelProperty("霉变")
    @ExcelProperty(value = "霉变", index = 7)
    private String itemmildew;

    /** . 包温 */
    @ApiModelProperty("包温")
    @ExcelProperty(value = "包温", index = 8)
    private String itemtemperature;

    /** . 抽检位置 */
    @ApiModelProperty("抽检位置")
    private String itemplace;

    /** . 打湿 */
    @ApiModelProperty("打湿")
    private String itemwet;

    /** . 杂物 */
    @ApiModelProperty("杂物")
    private String itemsundries;

    /** . 详情说明 */
    @ApiModelProperty("详情说明")
    private String checkdesc;

    /** . 检验时间 */
    @ApiModelProperty("检验时间")
    private Date checktime;

    /** . 是否合格 */
    @ApiModelProperty("是否合格(1合格,0不合格)")
    private Integer isqualified;

    /** . 检验人(关联人员表id) */
    @ApiModelProperty("检验人ID")
    private Long checkperson;

    /** . 扩展1 */
    @ApiModelProperty("扩展字段1")
    private String extd1;

    /** . 扩展2 */
    @ApiModelProperty("扩展字段2")
    private String extd2;

    /** . 扩展3 */
    @ApiModelProperty("扩展字段3")
    private String extd3;

    /** . 扩展4 */
    @ApiModelProperty("扩展字段4")
    private String extd4;

    /** . 添加方式(关联公共参数表pub.t_pb_basedata取类型为添加方式的参数ID) */
    @ApiModelProperty("添加方式ID")
    private Long addtype;


    /** . 创建时间 */
    @ApiModelProperty("创建时间")
    private Date createtime;


    /** . 备注 */
    @ApiModelProperty("备注")
    private String remark;


    /** . tid标识 */
    @TableField("t_id")
    @ApiModelProperty("tid标识")
    private String tid;


    /** *. 导出序号 */
    @TableField(exist = false)
    @ExcelProperty(value = "序号", index = 0)
    private Integer seq;

}
java 复制代码
    /**
     * .
     * 入库导出明细Excel
     *
     * @param response 响应对象
     * @param dto      查询条件
     * @throws IOException 抛出IO异常
     */
    @ApiOperation("入库导出明细Excel")
    @PostMapping("/exportDtl")
    public void exportDtl(HttpServletResponse response, @RequestBody MatYlQcDetailNewDto dto) throws IOException {


        // 查询 主表内容
        MatYlQcNewVo mainVo = matQcNewMapper.selectMainVoById(dto.getYlqcid());

        // 查询 t_ba_qua表 获取 判定规则  和备注
        MatYlQcNewVo matYlQcNewVo = matQcNewMapper.selBaQuaByPid(mainVo.getYlqcbusitype());


        // 查询审核明细数据,用于填充Excel
        List<MatYlQcDetailNew> dtlVoList = matQcDetailNewService.list(
                new LambdaQueryWrapper<MatYlQcDetailNew>()
                        .eq(MatYlQcDetailNew::getYlqcid, dto.getYlqcid()));
        if (dtlVoList.isEmpty()) {
            throw new DefinitionException(Constants.ERROR_CODE, "无明细数据");
        }

        for (Integer i = 1; i <= dtlVoList.size(); i++) {
            dtlVoList.get(i-1).setSeq(i);
        }

        //设置响应头信息
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        String fileName = URLEncoder.encode("入库质量抽检单", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");


        //内容样式策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); //设置垂直居中
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); //设置居中
        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN); //设置上下左右边框
        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
        contentWriteCellStyle.setWrapped(false); //设置 自动换行

        //字体策略
        WriteFont contentWriteFont = new WriteFont(); // 字体策略
        contentWriteFont.setFontHeightInPoints((short) 10); // 字体大小
        contentWriteCellStyle.setWriteFont(contentWriteFont);

        //头策略使用默认
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();

        EasyExcel.write(response.getOutputStream(), MatYlQcDetailNew.class)
                .excelType(ExcelTypeEnum.XLSX) //设置输出excel版本,不设置默认为xlsx
                .head(MatYlQcDetailNew.class)
                //设置拦截器或自定义样式,传值进去,也可以不传
                .registerWriteHandler(new MatYlQcNewSheetWriteHandler(mainVo, matYlQcNewVo))
                .registerWriteHandler(new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle))
                .sheet("入库质量抽检单")
                //设置默认样式及写入头信息开始的行数
                .useDefaultStyle(true).relativeHeadRowIndex(6)
                .doWrite(dtlVoList);
    }
java 复制代码
package com.yunjin.matyl.domain.dto.pbms;

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.handler.WorkbookWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import com.yunjin.matyl.domain.vo.pbms.MatYlQcNewVo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.jetbrains.annotations.NotNull;

import java.text.SimpleDateFormat;

/**.
 * 处理单元格类
 *
 * @author ck
 * @since 2025-10-11
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MatYlQcNewSheetWriteHandler implements SheetWriteHandler, WorkbookWriteHandler {


    /**.
     * 不固定内容的单元格,定义变量
     */
    private MatYlQcNewVo mainVo;

    /**.
     * 不固定内容的单元格,定义变量
     */
    private MatYlQcNewVo matYlQcNewVo;

    /**
     * .
     * 设置表头样式
     *
     * @param workbook 工作薄
     * @return 样式对象
     */
    private static @NotNull CellStyle getTitleCellStyle(Workbook workbook) {
        CellStyle titleCellStyle = workbook.createCellStyle(); 
        titleCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); 
        titleCellStyle.setBorderLeft(BorderStyle.THIN); 
        titleCellStyle.setBorderTop(BorderStyle.THIN);
        titleCellStyle.setBorderRight(BorderStyle.THIN);
        titleCellStyle.setBorderBottom(BorderStyle.THIN);
        titleCellStyle.setAlignment(HorizontalAlignment.CENTER); 


        Font titleFont = workbook.createFont(); // 创建字体样式
        titleFont.setBold(true); 
        titleFont.setFontHeightInPoints((short) 10);  // 使用磅值(points)设置,常规大小
        titleCellStyle.setFont(titleFont); // 设置单元格样式
        return titleCellStyle;
    }

    // 在创建工作簿之前,在创建工作表之前执行
    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {

    }

    // 在创建工作簿之后,在创建工作表之前执行
    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {

        Workbook workbook = writeWorkbookHolder.getWorkbook();

        // 创建SHEET页
        Sheet sheet = workbook.getSheetAt(0);
        setSheetColWeight(sheet); //设置每列列宽

        CellStyle cellStyle = workbook.createCellStyle();
        buildCellStyle(cellStyle);


        Font font = workbook.createFont(); // 创建字体样式
        font.setBold(true); 
        font.setFontHeightInPoints((short) 10);  // 使用磅值(points)设置,常规大小
        cellStyle.setFont(font); // 设置单元格样式

        CellStyle cellStyle2 = workbook.createCellStyle();
        buildCellStyle2(cellStyle2);

        Font font2 = workbook.createFont(); // 创建字体样式
        font2.setBold(false); 
        font.setFontHeightInPoints((short) 10);  // 使用磅值(points)设置,常规大小
        cellStyle2.setFont(font2); // 设置单元格样式

        buildOneToTherrCol(sheet, workbook, cellStyle, cellStyle2); //创建 1-3列
        buildFourToSixCol(sheet, cellStyle, cellStyle2); //创建 4-6列


    }

    /**.
     * 创建 1-3列
     * @param sheet sheet
     * @param cellStyle cellStyle
     * @param cellStyle2 cellStyle2
     */
    private void buildFourToSixCol(Sheet sheet, CellStyle cellStyle, CellStyle cellStyle2) {
        // ---   【第四行】  ---
        Row row4 = sheet.createRow(3);

        // 1-2列
        Cell cell41 = row4.createCell(0);
        cell41.setCellValue("库位");
        cell41.setCellStyle(cellStyle);
        sheet.addMergedRegion(new CellRangeAddress(3, 3, 0, 1));
        setBorderForMergedRegion(sheet, new CellRangeAddress(3, 3, 0, 1), BorderStyle.THIN);
        // 3列
        Cell cell43 = row4.createCell(2);
        cell43.setCellValue(mainVo.getWareHouseName());
        cell43.setCellStyle(cellStyle2);


        // 4列
        Cell cell44 = row4.createCell(3);
        cell44.setCellValue("皮重(kg)");
        cell44.setCellStyle(cellStyle);
        // 5列
        Cell cell45 = row4.createCell(4);
        cell45.setCellValue(mainVo.getAvgweight().doubleValue()-200);
        cell45.setCellStyle(cellStyle2);


        // 6列
        Cell cell46 = row4.createCell(5);
        cell46.setCellValue("尾箱");
        cell46.setCellStyle(cellStyle);
        // 7列
        Cell cell47 = row4.createCell(6);
        cell47.setCellValue(mainVo.getTrunk()==1?"有":"无");
        cell47.setCellStyle(cellStyle2);

        // 8列
        Cell cell48 = row4.createCell(7);
        cell48.setCellValue("烟叶结构");
        cell48.setCellStyle(cellStyle);
        // 9列
        Cell cell49 = row4.createCell(8);
        cell49.setCellValue(mainVo.getLeafNotch());
        cell49.setCellStyle(cellStyle2);
        // ---   【第五行】  ---
        Row row5 = sheet.createRow(4);
        Cell cell51 = row5.createCell(0);
        cell51.setCellValue("来料类型");
        cell51.setCellStyle(cellStyle);
        sheet.addMergedRegion(new CellRangeAddress(4, 4, 0, 1));
        setBorderForMergedRegion(sheet, new CellRangeAddress(4, 4, 0, 1), BorderStyle.THIN);
        Cell cell53 = row5.createCell(2);
        cell53.setCellValue(mainVo.getYlarrivalbusitypeName());
        cell53.setCellStyle(cellStyle2);
        sheet.addMergedRegion(new CellRangeAddress(4, 4, 2, 3));
        setBorderForMergedRegion(sheet, new CellRangeAddress(4, 4, 2, 3), BorderStyle.THIN);
        Cell cell54 = row5.createCell(4);
        cell54.setCellValue("加工单位");
        cell54.setCellStyle(cellStyle);
        Cell cell55 = row5.createCell(5);
        cell55.setCellValue(mainVo.getSuppliername());
        cell55.setCellStyle(cellStyle2);
        sheet.addMergedRegion(new CellRangeAddress(4, 4, 5, 6));
        setBorderForMergedRegion(sheet, new CellRangeAddress(4, 4, 5, 6), BorderStyle.THIN);
        // 4列
        Cell cell57 = row5.createCell(7);
        cell57.setCellValue("内衬膜");
        cell57.setCellStyle(cellStyle);
        // 5列
        Cell cell58 = row5.createCell(8);
        cell58.setCellValue(mainVo.getInsidebag() == 1 ? "有" : "无");
        cell58.setCellStyle(cellStyle2);
        // ---   【第六行】  ---
        Row row6 = sheet.createRow(5);
        Cell cell61 = row6.createCell(0);
        cell61.setCellValue("到货时间");
        cell61.setCellStyle(cellStyle);
        sheet.addMergedRegion(new CellRangeAddress(5, 5, 0, 1));
        setBorderForMergedRegion(sheet, new CellRangeAddress(5, 5, 0, 1), BorderStyle.THIN);
        Cell cell63 = row6.createCell(2);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String formattedDate = mainVo.getArrivalstartdate() != null
                ?
                sdf.format(mainVo.getArrivalstartdate()) : "";
        cell63.setCellValue(formattedDate);
        cell63.setCellStyle(cellStyle2);
        sheet.addMergedRegion(new CellRangeAddress(5, 5, 2, 3));
        setBorderForMergedRegion(sheet, new CellRangeAddress(5, 5, 2, 3), BorderStyle.THIN);
        Cell cell64 = row6.createCell(4);
        cell64.setCellValue("检验时间");
        cell64.setCellStyle(cellStyle);
        Cell cell65 = row6.createCell(5);
        String formattedDate2 = mainVo.getCheckdate() != null
                ?
                sdf.format(mainVo.getCheckdate()) : "";
        cell65.setCellValue(formattedDate2);
        cell65.setCellStyle(cellStyle2);
        sheet.addMergedRegion(new CellRangeAddress(5, 5, 5, 6));
        setBorderForMergedRegion(sheet, new CellRangeAddress(5, 5, 5, 6), BorderStyle.THIN);
        // 4列
        Cell cell67 = row6.createCell(7);
        cell67.setCellValue("到货数量");
        cell67.setCellStyle(cellStyle);
        // 5列
        Cell cell68 = row6.createCell(8);
        cell68.setCellValue(mainVo.getArrivalcount().doubleValue());
        cell68.setCellStyle(cellStyle2);
    }

    /**.
     * 创建 4-6列
     * @param sheet sheet
     * @param cellStyle cellStyle
     * @param workbook workbook
     * @param cellStyle2 cellStyle2
     */
    private void buildOneToTherrCol(Sheet sheet, Workbook workbook, CellStyle cellStyle, CellStyle cellStyle2) {
        // ---   【第一行】  ---
        Row row1 = sheet.createRow(0); //创建第一行-空行
        row1.setHeight((short) 500); //设置行高为500
        Cell cell = row1.createCell(0);
        cell.setCellValue(""); //设置单元格内容

        // ---   【第二行】  ---
        Row row2 = sheet.createRow(1);  // 创建第二行
        row2.setHeight((short) 500); //设置行高
        Cell cell1 = row2.createCell(0); // 创建单元格
        cell1.setCellValue("烟叶入库质量抽检单"); // 设置标题内容

        CellStyle titleCellStyle = getTitleCellStyle(workbook);
        cell1.setCellStyle(titleCellStyle);
        sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 8));
        setBorderForMergedRegion(sheet, new CellRangeAddress(1, 1, 0, 8), BorderStyle.THIN);


        // ---   【第三行】  ---
        Row row3 = sheet.createRow(2); // 创建第三行


        // 1-2列
        Cell cell3 = row3.createCell(0); // 在第3行的第1列创建单元格并设置内容
        cell3.setCellValue("产地");
        cell3.setCellStyle(cellStyle);
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 0, 1));
        setBorderForMergedRegion(sheet, new CellRangeAddress(2, 2, 0, 1), BorderStyle.THIN);
        // 3列
        Cell cell4 = row3.createCell(2);
        cell4.setCellValue(mainVo.getTobacOrig());
        cell4.setCellStyle(cellStyle2);


        // 4列
        Cell cell5 = row3.createCell(3);
        cell5.setCellValue("等级");
        cell5.setCellStyle(cellStyle);
        // 5列
        Cell cell6 = row3.createCell(4);
        cell6.setCellValue(mainVo.getTobacLevel());
        cell6.setCellStyle(cellStyle2);


        // 6列
        Cell cell7 = row3.createCell(5);
        cell7.setCellValue("年份");
        cell7.setCellStyle(cellStyle);
        // 7列
        Cell cell8 = row3.createCell(6);
        cell8.setCellValue(mainVo.getTobacYear());
        cell8.setCellStyle(cellStyle2);

        // 8列
        Cell cell9 = row3.createCell(7);
        cell9.setCellValue("烟叶类型");
        cell9.setCellStyle(cellStyle);
        // 9列
        Cell cell10 = row3.createCell(8);
        cell10.setCellValue(mainVo.getTobacType());
        cell10.setCellStyle(cellStyle2);
    }

    /**.
     * 创建样式2
     * @param cellStyle2 cellStyle2
     */
    private static void buildCellStyle2(CellStyle cellStyle2) {
        cellStyle2.setBorderLeft(BorderStyle.THIN);
        cellStyle2.setBorderTop(BorderStyle.THIN);
        cellStyle2.setBorderRight(BorderStyle.THIN);
        cellStyle2.setBorderBottom(BorderStyle.THIN);
        cellStyle2.setVerticalAlignment(VerticalAlignment.CENTER);
        cellStyle2.setAlignment(HorizontalAlignment.CENTER);
    }

    /**.
     * 创建样式1
     * @param cellStyle cellStyle1
     */
    private static void buildCellStyle(CellStyle cellStyle) {
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        cellStyle.setBorderLeft(BorderStyle.THIN);
        cellStyle.setBorderTop(BorderStyle.THIN);
        cellStyle.setBorderRight(BorderStyle.THIN);
        cellStyle.setBorderBottom(BorderStyle.THIN);
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
    }

    /**.
     * 设置列宽
     * @param sheet  sheet
     */
    private static void setSheetColWeight(Sheet sheet) {
        sheet.setColumnWidth(0, 5 * 256);  // 第1列:15个字符宽度
        sheet.setColumnWidth(1, 5 * 256);  // 第2列:15个字符宽度
        sheet.setColumnWidth(2, 8 * 256);  // 第3列:20个字符宽度
        sheet.setColumnWidth(3, 9 * 256);  // 第4列:10个字符宽度
        sheet.setColumnWidth(4, 8 * 256);  // 第5列:20个字符宽度
        sheet.setColumnWidth(5, 8 * 256);  // 第6列:10个字符宽度
        sheet.setColumnWidth(6, 6 * 256);  // 第7列:15个字符宽度
        sheet.setColumnWidth(7, 9 * 256);  // 第8列:12个字符宽度
        sheet.setColumnWidth(8, 6 * 256);  // 第9列:20个字符宽度
    }

    // 工作簿处理完毕后调用
    @Override
    public void afterWorkbookDispose(WriteWorkbookHolder writeWorkbookHolder) {

        Workbook workbook = writeWorkbookHolder.getWorkbook();
        Sheet sheet = workbook.getSheetAt(0);

        // ---   【备注行】  ---

        // 创建用于备注的单元格样式(左对齐)
        CellStyle style1 = workbook.createCellStyle();
        style1.setBorderLeft(BorderStyle.THIN); 
        style1.setBorderTop(BorderStyle.THIN);
        style1.setBorderRight(BorderStyle.THIN);
        style1.setBorderBottom(BorderStyle.THIN);
        style1.setVerticalAlignment(VerticalAlignment.CENTER);
        style1.setAlignment(HorizontalAlignment.LEFT);
        style1.setWrapText(true);


        // 在数据后添加备注行
        int lastRowNum = sheet.getLastRowNum();

        Row avgRow = sheet.createRow(lastRowNum + 1);
        //avgRow.setHeight((short) 800);

        Cell avgCell1 = avgRow.createCell(0);
        avgCell1.setCellValue("平均值:");
        avgCell1.setCellStyle(style1);
        sheet.addMergedRegion(new CellRangeAddress(lastRowNum + 1, lastRowNum + 1, 0, 2));
        setBorderForMergedRegion(sheet, new CellRangeAddress(lastRowNum + 1, lastRowNum + 1, 0, 2), BorderStyle.THIN);

        Cell avgCell2 = avgRow.createCell(3);
        avgCell2.setCellValue(mainVo.getAvgweight().doubleValue());
        avgCell2.setCellStyle(style1);

        Cell avgCell3 = avgRow.createCell(4);
        avgCell3.setCellValue(mainVo.getAvgwater().doubleValue());
        avgCell3.setCellStyle(style1);


        Cell checkPersonCell1 = avgRow.createCell(5);
        checkPersonCell1.setCellValue("检查人:");
        checkPersonCell1.setCellStyle(style1);
        sheet.addMergedRegion(new CellRangeAddress(lastRowNum + 1, lastRowNum + 1, 5, 6));
        setBorderForMergedRegion(sheet, new CellRangeAddress(lastRowNum + 1, lastRowNum + 1, 5, 6), BorderStyle.THIN);


        Cell checkPersonCell2 = avgRow.createCell(7);
        checkPersonCell2.setCellValue(mainVo.getCheckPersonName());
        checkPersonCell2.setCellStyle(style1);
        sheet.addMergedRegion(new CellRangeAddress(lastRowNum + 1, lastRowNum + 1, 7, 8));
        setBorderForMergedRegion(sheet, new CellRangeAddress(lastRowNum + 1, lastRowNum + 1, 7, 8), BorderStyle.THIN);


        Row zhuRow = sheet.createRow(lastRowNum + 2);
        zhuRow.setHeight((short) 600);

        Cell zhuCell1 = zhuRow.createCell(0);
        zhuCell1.setCellValue("注");
        zhuCell1.setCellStyle(style1);

        Cell zhuCell2 = zhuRow.createCell(1);
        zhuCell2.setCellValue(matYlQcNewVo.getJudgerule());
        zhuCell2.setCellStyle(style1);
        // 合并单元格区域(跨0-38列,占3行)
        sheet.addMergedRegion(new CellRangeAddress(lastRowNum + 2, lastRowNum + 2, 1, 8));
        setBorderForMergedRegion(sheet, new CellRangeAddress(lastRowNum + 2, lastRowNum + 2, 1, 8), BorderStyle.THIN);


        // ---   【最后一行】  ---
        Row row4 = sheet.createRow(lastRowNum + 3); // 创建第三行

        CellStyle cellStyle = workbook.createCellStyle();
        cellStyle.setVerticalAlignment(VerticalAlignment.TOP);
        cellStyle.setAlignment(HorizontalAlignment.LEFT);

        Font font = workbook.createFont();
        font.setBold(false);
        font.setFontHeightInPoints((short) 10);  // 使用磅值(points)设置,常规大小
        cellStyle.setFont(font);


        Cell cell13 = row4.createCell(0);
        cell13.setCellValue("备注:");
        cell13.setCellStyle(cellStyle);
        sheet.addMergedRegion(new CellRangeAddress(lastRowNum + 3, lastRowNum + 4, 0, 8));
        setBorderForMergedRegion(sheet, new CellRangeAddress(lastRowNum + 3, lastRowNum + 4, 0, 8), BorderStyle.THIN);

    }


    /**.
     * 为合并区域设置完整边框
     * @param sheet  sheet
     * @param region region
     * @param borderStyle borderStyle
     */
    private void setBorderForMergedRegion(Sheet sheet, CellRangeAddress region, BorderStyle borderStyle) {
        for (int row = region.getFirstRow(); row <= region.getLastRow(); row++) {
            Row rowObj = sheet.getRow(row);
            if (rowObj == null) {
                rowObj = sheet.createRow(row);
            }

            for (int col = region.getFirstColumn(); col <= region.getLastColumn(); col++) {
                Cell cell = rowObj.getCell(col);
                if (cell == null) {
                    cell = rowObj.createCell(col);
                }

                // 获取或创建单元格样式
                CellStyle style = cell.getCellStyle();
                if (style == null) {
                    style = sheet.getWorkbook().createCellStyle();
                } else {
                    // 复制现有样式
                    CellStyle newStyle = sheet.getWorkbook().createCellStyle();
                    newStyle.cloneStyleFrom(style);
                    style = newStyle;
                }

                // 设置上边框(只有最上面的行)
                if (row == region.getFirstRow()) {
                    style.setBorderTop(borderStyle);
                }

                // 设置下边框(只有最下面的行)
                if (row == region.getLastRow()) {
                    style.setBorderBottom(borderStyle);
                }

                // 设置左边框(只有最左边的列)
                if (col == region.getFirstColumn()) {
                    style.setBorderLeft(borderStyle);
                }

                // 设置右边框(只有最右边的列)
                if (col == region.getLastColumn()) {
                    style.setBorderRight(borderStyle);
                }

                cell.setCellStyle(style);
            }
        }
    }

}
相关推荐
寻星探路7 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
崔庆才丨静觅8 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
曹牧9 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
passerby60619 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了9 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅9 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅9 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
爬山算法10 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty72510 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai