fei
2026-01-05 6f0797731657022e9812b92fb4d78bcf56a65c1d
修改了对应代码
6个文件已修改
1个文件已添加
428 ■■■■ 已修改文件
archiveManager/src/main/java/com/ruoyi/domain/dto/searSigAnn.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
archiveManager/src/main/java/com/ruoyi/service/impl/DocumentMaterialsServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/archive/ArchiveRecordsController.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/archive/DocumentMaterialsController.java 197 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-druid.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application.yml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtilManySheetFour.java 174 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
archiveManager/src/main/java/com/ruoyi/domain/dto/searSigAnn.java
New file
@@ -0,0 +1,12 @@
package com.ruoyi.domain.dto;
import lombok.Data;
@Data
public class searSigAnn {
    private String[] selectedAnnotations;
    private String[] selectedSignatures;
    private Long recordId;
    private Boolean includeQrCode;
}
archiveManager/src/main/java/com/ruoyi/service/impl/DocumentMaterialsServiceImpl.java
@@ -473,6 +473,8 @@
                    newRecord.setFileSize(null);
                    newRecord.setFormat(null);
                    newRecord.setUrl(null);
                    newRecord.setVisible(0);
                    // 添加到中间记录列表
                    middleRecords.add(newRecord);
                }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/archive/ArchiveRecordsController.java
@@ -2,6 +2,7 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
@@ -16,11 +17,13 @@
import com.ruoyi.common.utils.poi.ExcelUtilManySheetFour;
import com.ruoyi.domain.ArchiveRecords;
import com.ruoyi.domain.DocumentMaterials;
import com.ruoyi.domain.dto.searSigAnn;
import com.ruoyi.domain.vo.*;
import com.ruoyi.framework.config.ServerConfig;
import com.ruoyi.service.IArchiveRecordsService;
import com.ruoyi.service.IDocumentMaterialsService;
import com.ruoyi.service.impl.BarcodeService;
import com.ruoyi.service.impl.pdfGenerateService;
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
@@ -51,6 +54,9 @@
    private IArchiveRecordsService archiveRecordsService;
    @Autowired
    private BarcodeService barcodeService;
    @Autowired
    private pdfGenerateService pdfGenerateService;
    @Autowired
    private IDocumentMaterialsService iDocumentMaterialsService;
@@ -225,23 +231,22 @@
        return AjaxResult.success( archiveRecordsService.whether(recordId));
    }
    @PostMapping(value={"/recordFileList/{includeQrCode}/{selectedSignatures}/{selectedAnnotations}", "/recordFileList/{includeQrCode}", "/recordFileList/{includeQrCode}/{selectedSignatures}","/recordFileList/{includeQrCode}/{selectedAnnotations}"})
    @PostMapping("/recordFileList")
    //导出excle
    public void getSpecialArchiveInfo(HttpServletResponse response, @RequestParam("recordId")Long recordId, @PathVariable(name = "includeQrCode",required = false) boolean includeQrCode, @PathVariable(name = "selectedSignatures",required = false) int[] selectedSignatures, @PathVariable(name = "selectedAnnotations",required = false) int[] selectedAnnotations) throws IOException {
    public void getSpecialArchiveInfo(HttpServletResponse response, @RequestBody searSigAnn searSigAnn) throws IOException {
        System.out.println("uuuuuuuuuuuuuuuuuuusssss88888888888888");
//        System.out.println(selectedSignatures[0]);
//        System.out.println(selectedAnnotations[0]);
        System.out.println(includeQrCode);
        //二维码是否生成
        //System.out.println(includeQrCode);
        //生成二维码
        String code = "2024050000029250";
        byte [] bt = barcodeService.generateBarcodeImage(code);
      //  System.out.println(Arrays.toString(selectedSignatures));
        //签名选择
        String [] sig = {"业务科室移交人:","审批科移交人:","档案整理公司:"};
        List<String> arrLis = new ArrayList<>();
        if(selectedSignatures!=null){
            for(int si: selectedSignatures)
        if(searSigAnn.getSelectedSignatures()!=null){
            for(String si: searSigAnn.getSelectedSignatures())
            {
                arrLis.add(sig[si]);
                arrLis.add(sig[Integer.parseInt(si)]);
            }
        }
        //注选择
@@ -251,15 +256,15 @@
                "保管期限:30年或永久",
                "页号按照正式录入页码为准"};
        List<String> arrAn = new ArrayList<>();
        if(selectedAnnotations!=null) {
            for (int ar : selectedAnnotations) {
                arrAn.add(ann[ar]);
        if(searSigAnn.getSelectedAnnotations()!=null) {
            for (String ar : searSigAnn.getSelectedAnnotations()) {
                arrAn.add(ann[Integer.parseInt(ar)]);
            }
        }
        List<DocumentMaterialsFileList> arsi = new ArrayList<>();
//        DocumentMaterials documentMaterials = new DocumentMaterials();
//        documentMaterials.setRecordId(recordId);
        List<DocumentMaterialsFileList> lst = iDocumentMaterialsService.selectDocumentMaterialsFileList(recordId);
        List<DocumentMaterialsFileList> lst = iDocumentMaterialsService.selectDocumentMaterialsFileList(searSigAnn.getRecordId());
@@ -288,6 +293,9 @@
            inquiryNumber = arsi.get(0).getInquiryNumber();
            caseTitle = arsi.get(0).getCaseTitle();
        }
        util3.exportExcelManySheet(response, mysheet1, includeQrCode,bt, arrLis, arrAn, inquiryNumber, caseTitle);
        util3.exportExcelManySheet(response, mysheet1, searSigAnn.getIncludeQrCode(), bt, arrLis, arrAn, inquiryNumber, caseTitle);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/archive/DocumentMaterialsController.java
@@ -68,6 +68,7 @@
import static com.ruoyi.common.core.page.TableSupport.PAGE_NUM;
import static com.ruoyi.common.core.page.TableSupport.PAGE_SIZE;
import static com.ruoyi.framework.datasource.DynamicDataSourceContextHolder.log;
/**
 * 【文件材料综合信息】Controller
@@ -92,6 +93,11 @@
    @Autowired
    private IArchiveRecordsService iArchiveRecordsService;
    /**
     * 文件分隔符
     */
    private static final String FILE_DELIMETER = ",";
    /**
     * 判断PageNumber是否连续
     */
@@ -179,41 +185,47 @@
    @PostMapping("/exportDir")
    public void exportDir(HttpServletResponse response, DocumentMaterials documentMaterials, @RequestParam(value = "ids", required = false) Long[] ids)
    {
        List<DocumentMaterials> list;
        System.out.println(ids);
        // 如果提供了ids参数,则根据ids导出指定记录
        if (ids != null && ids.length > 0) {
            list = documentMaterialsService.selectDocumentMaterialsByIds(ids);
        } else {
            list = documentMaterialsService.selectDocumentMaterialsList(documentMaterials);
        }
        // 根据visible字段筛选,只保留visible为1的记录
        List<DocumentMaterials> filteredList = list.stream()
                .filter(doc -> doc.getVisible() != null && doc.getVisible() == 1 && !Objects.equals(doc.getFileStyle(), "其他材料"))
                .collect(Collectors.toList());
        List<DocumentMaterialsVo> dsvs = documentMaterialsService.findArchMInfo(documentMaterials.getRecordId().toString());
        
        // 使用AtomicLong实现序号的递增
        AtomicLong nm = new AtomicLong(1L);
        // 将筛选后的DocumentMaterials转换为DocumentMaterialsVo
        List<DocumentMaterialsVoSmall> list1 = filteredList.stream().map(doc -> {
            DocumentMaterialsVoSmall vo = new DocumentMaterialsVoSmall();
            // 手动映射字段,使用getAndIncrement()方法获取当前值并递增
            vo.setNum(nm.getAndIncrement());
        List<DocumentMaterialsVoSmall> list2 = dsvs.stream().map(res1 -> new DocumentMaterialsVoSmall(res1.getNum(), res1.getDocumentNumber(),res1.getCreator(),
                res1.getTitle(), res1.getDate(), res1.getPageNumberFormatted(), res1.getRemarks())).collect(Collectors.toList());
            vo.setDocumentNumber(doc.getDocumentNumber());
            vo.setCreator(doc.getCreator());
            vo.setTitle(doc.getTitle());
            vo.setDate(doc.getDate());
            vo.setPageNumberFormatted(doc.getPageNumber().toString());
            vo.setRemarks(doc.getRemarks());
//            vo.setRecordId(doc.getRecordId() != null ? doc.getRecordId().toString() : null);
//            vo.setPublicity(doc.getPublicity());
            return vo;
        }).collect(Collectors.toList());
//        List<DocumentMaterials> list;
//        System.out.println(ids);
//        // 如果提供了ids参数,则根据ids导出指定记录
//        if (ids != null && ids.length > 0) {
//            list = documentMaterialsService.selectDocumentMaterialsByIds(ids);
//        } else {
//            list = documentMaterialsService.selectDocumentMaterialsList(documentMaterials);
//
//        }
//        // 根据visible字段筛选,只保留visible为1的记录
//        List<DocumentMaterials> filteredList = list.stream()
//                .filter(doc -> doc.getVisible() != null && doc.getVisible() == 1 && !Objects.equals(doc.getFileStyle(), "其他材料"))
//                .collect(Collectors.toList());
//
//        // 使用AtomicLong实现序号的递增
//        AtomicLong nm = new AtomicLong(1L);
//        // 将筛选后的DocumentMaterials转换为DocumentMaterialsVo
//        List<DocumentMaterialsVoSmall> list1 = filteredList.stream().map(doc -> {
//            DocumentMaterialsVoSmall vo = new DocumentMaterialsVoSmall();
//            // 手动映射字段,使用getAndIncrement()方法获取当前值并递增
//            vo.setNum(nm.getAndIncrement());
//
//            vo.setDocumentNumber(doc.getDocumentNumber());
//            vo.setCreator(doc.getCreator());
//            vo.setTitle(doc.getTitle());
//            vo.setDate(doc.getDate());
//            vo.setPageNumberFormatted(doc.getPageNumber().toString());
//            vo.setRemarks(doc.getRemarks());
////            vo.setRecordId(doc.getRecordId() != null ? doc.getRecordId().toString() : null);
////            vo.setPublicity(doc.getPublicity());
//            return vo;
//        }).collect(Collectors.toList());
        
        ExcelUtil<DocumentMaterialsVoSmall> util = new ExcelUtil<DocumentMaterialsVoSmall>(DocumentMaterialsVoSmall.class);
        util.exportExcel(response, list1, "卷内目录");
        util.exportExcel(response, list2, "卷内目录");
    }
   // List<DocumentMaterialsVo> dsvs = documentMaterialsService.findArchMInfo(id.toString());
@@ -656,4 +668,129 @@
    }
    @PostMapping("/uploads/{recordId}")
    public AjaxResult uploadFiles(List<MultipartFile> files, @PathVariable Long recordId) throws Exception {
        try {
            // 上传文件路径
            String filePath = RuoYiConfig.getUploadPath();
            List<String> urls = new ArrayList<>();
            List<String> fileNames = new ArrayList<>();
            List<String> newFileNames = new ArrayList<>();
            List<String> originalFilenames = new ArrayList<>();
            // 批量处理文件上传
            for (MultipartFile file : files) {
                // 根据文件名称,然后修改对应数据的url
                String fname = file.getOriginalFilename();
                if (StringUtils.isBlank(fname)) {
                    continue;
                }
                // 上传并返回新文件名称
                String fileName = FileUploadUtils.upload(filePath, file);
                String url = serverConfig.getUrl() + fileName;
                // 分割文件名
                String[] nams = fname.split("\\.");
                if (nams.length < 2) {
                    continue;
                }
                Long nam = Long.parseLong(nams[0]);
                // 根据页号拿到案卷的详细信息
                DocumentMaterials doc = documentMaterialsService.selectByPageNumber(nam, Math.toIntExact(recordId));
                if (doc != null) {
                    if (doc.getSecurityLevel() != null && doc.getSecurityLevel().equals("该页另存")) {
                        // 替换为了准备好的图像
                        String fp = filePath + "\\glc.jpg";
                        Path path = Paths.get(fp);
                        // 拿到图像属性
                        BufferedImage bufferedImage = ImageIO.read(Files.newInputStream(path));
                        int wid = bufferedImage.getWidth();
                        int hei = bufferedImage.getHeight();
                        double sz = Double.parseDouble(String.format("%.2f", Files.size(path) * 1.0 / 1024));
                        // 拿到图像的dpi信息
                        ImageInfo info = Imaging.getImageInfo(Files.readAllBytes(path));
                        int wdpi = info.getPhysicalWidthDpi();
                        int hdpi = info.getPhysicalHeightDpi();
                        // 计算fileNumber
                        Long fileNumber = documentMaterialsService.getFiNum(nam, recordId);
                        // 计算sizeType
                        String sizeType = getPageSize(wid * hei);
                        Graphics2D g2d = bufferedImage.createGraphics();
                        g2d.setFont(new Font("Arial", Font.BOLD, 80));
                        g2d.setColor(Color.black);
                        String pageNumber = doc.getPageNumber() + "";
                        int fontHeight = g2d.getFontMetrics().getHeight();
                        int x = bufferedImage.getWidth() - g2d.getFontMetrics().stringWidth(pageNumber) - 80;
                        int y = bufferedImage.getHeight() - fontHeight / 2 - 100;
                        g2d.drawString(pageNumber, x, y);
                        g2d.dispose();
                        // 将BufferedImage转换为MultipartFile
                        MultipartFile multipartFile = null;
                        ByteArrayOutputStream os = new ByteArrayOutputStream();
                        ImageIO.write(bufferedImage, "jpg", os);
                        InputStream input = new ByteArrayInputStream(os.toByteArray());
                        multipartFile = new MockMultipartFile(pageNumber, pageNumber + ".jpg", "text/plain", input);
                        // 上传并返回新文件名称
                        String fileName1 = FileUploadUtils.upload(filePath, multipartFile);
                        // 更新数据库
                        documentMaterialsService.updateByPageNumber(nam, sizeType, fileNumber, wid, hei, wdpi, hdpi, sz, fileName1, "jpg", recordId);
                        urls.add(serverConfig.getUrl() + fileName1);
                        fileNames.add(fileName1);
                        newFileNames.add(FileUtils.getName(fileName1));
                        originalFilenames.add(pageNumber + ".jpg");
                    } else {
                        // 文件名称
                        String pname = nams[1];
                        // 拿到图像属性
                        BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
                        int wid = bufferedImage.getWidth();
                        int hei = bufferedImage.getHeight();
                        double sz = Double.parseDouble(String.format("%.2f", file.getSize() * 1.0 / 1024));
                        // 拿到图像的dpi信息
                        ImageInfo info = Imaging.getImageInfo(file.getBytes());
                        int wdpi = info.getPhysicalWidthDpi();
                        int hdpi = info.getPhysicalHeightDpi();
                        // 计算fileNumber
                        Long fileNumber = documentMaterialsService.getFiNum(nam, recordId);
                        // 计算sizeType
                        String sizeType = getPageSize(wid * hei);
                        // 更新数据库
                        documentMaterialsService.updateByPageNumber(nam, sizeType, fileNumber, wid, hei, wdpi, hdpi, sz, fileName, pname, recordId);
                        urls.add(url);
                        fileNames.add(fileName);
                        newFileNames.add(FileUtils.getName(fileName));
                        originalFilenames.add(fname);
                    }
                }
            }
            AjaxResult ajax = AjaxResult.success();
            ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER));
            ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER));
            ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER));
            ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER));
            return ajax;
        } catch (Exception e) {
            log.error("批量上传文件失败", e);
            return AjaxResult.error(e.getMessage());
        }
    }
}
ruoyi-admin/src/main/resources/application-druid.yml
@@ -20,7 +20,7 @@
            # 最小连接池数量
            minIdle: 10
            # 最大连接池数量
            maxActive: 20
            maxActive: 140
            # 配置获取连接等待超时的时间
            maxWait: 60000
            # 配置连接超时时间
ruoyi-admin/src/main/resources/application.yml
@@ -57,9 +57,9 @@
  servlet:
    multipart:
      # 单个文件大小
      max-file-size: 10MB
      max-file-size: 200MB
      # 设置总上传的文件大小
      max-request-size: 20MB
      max-request-size: 1000MB
  # 服务模块
  devtools:
    restart:
@@ -134,3 +134,4 @@
  excludes: /system/notice
  # 匹配链接
  urlPatterns: /system/*,/monitor/*,/tool/*
ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtilManySheetFour.java
@@ -12,17 +12,16 @@
import com.ruoyi.common.utils.file.FileTypeUtils;
import com.ruoyi.common.utils.file.ImageUtils;
import com.ruoyi.common.utils.reflect.ReflectUtils;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFDataValidation;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFDataValidation;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFDataValidation;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFDataValidation;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -260,8 +259,11 @@
     * @throws IOException
     */
    public void exportExcel(HttpServletResponse response, List<T> list, String sheetName) throws IOException {
        response.setContentType("application/vnd.ms-excel");
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 设置文件名
        String fileName = UUID.randomUUID() + "_"  + ".xlsx";
        response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
        this.init(list, sheetName, Excel.Type.EXPORT);
        exportExcel(response.getOutputStream());
    }
@@ -274,10 +276,21 @@
     * @return 结果
     * @throws IOException
     */
    /**
     * 对list数据源将其里面的数据导入到excel表单
     *
     * @param response  返回数据
     * @param list      导出数据集合
     * @return 结果
     * @throws IOException
     */
    public void exportExcelManySheet(HttpServletResponse response, List<ExcelExp> list, boolean includeQrCode, byte[] bt,
                                     List<String> sigArr, List<String> arrAn, String inquiryNumber, String caseTitle) throws IOException {
        //  response.setContentType("application/vnd.ms-excel");
        //  response.setCharacterEncoding("utf-8");
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 设置文件名
        String fileName = UUID.randomUUID() + "_" + ".xlsx";
        response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
        try {
            createWorkbook();
@@ -296,18 +309,33 @@
                    // 合并第一行的前5个单元格
                    sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 8));
                    // 必须先设置为true
                    // 页面布局设置
                    sheet.setAutobreaks(true);
                    sheet.setFitToPage(true);
                    // 获取打印设置
                    PrintSetup printSetup = sheet.getPrintSetup();
                    // 设置为1页宽度
                    printSetup.setFitWidth((short) 1);   // 宽度调整为1页
                    printSetup.setFitHeight((short) 0);  // 高度不限制
                    // 其他打印设置
                    printSetup.setPaperSize(PrintSetup.A4_PAPERSIZE);  // A4纸
                    printSetup.setLandscape(false);  // 纵向打印
                    // 创建行并设置高度
                    row = sheet.createRow(firow);
                    row.setHeight((short)(40 * 40));
                    //生成二维码
                    if(includeQrCode)
                    {
                        Cell cell = row.createCell(6);
                        row.setHeight((short)(40 * 40));
                        Cell cell = row.createCell(6);
                        // 设置图片大小和位置
                        ClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) (cell.getColumnIndex()+1), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() +2),
                        ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) (cell.getColumnIndex()+1), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() +2),
                                cell.getRow().getRowNum() + 1);
                        // 计算居中位置
//                    int col1 = 0; // 中间列
@@ -318,20 +346,23 @@
//                    anchor.setDy1(0);
//                    anchor.setDx2(255); // 宽度
//                    anchor.setDy2(255); // 高度
                        anchor.setRow1(1);
                        anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
                        // 计算居中位置
                        int col1 = 3; // 中间列
                        int col2 = col1 + 3;
                        anchor.setCol1(col1);
                        anchor.setCol2(col2);
                        anchor.setRow1(0);
                        anchor.setRow2(1);
                        byte[] data = bt;
                        anchor.setDx1(2400000);
                        anchor.setDy1(-10);
                        anchor.setDy2(-800000);
                        // 获取图片原始尺寸
                        BufferedImage image = ImageIO.read(new ByteArrayInputStream(data));
                        double widthInEMU = image.getWidth() * 9525 * 0.2;
                        double heightInEMU = image.getHeight() * 9525;
                        // 设置图片原始尺寸
                        anchor.setDx2(-100000); // 原始宽度
                    //    anchor.setDx2(-100000); // 原始宽度
                        //   anchor.setDy2((int)heightInEMU); // 原始高度
//anchor.setCol1(5); // 从第6列开始显示
//anchor.setCol2(10); // 到第11列结束
@@ -345,6 +376,9 @@
                        firow = firow + 1;
                        row = sheet.createRow(firow);
                    }
                    else
                        row.setHeight((short)(20 * 20));
                    //  sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 7));
                    if(firow==1)
                    {
@@ -364,16 +398,67 @@
                    titleCell.setCellStyle(style);
                    firow = firow + 1;
                    row = sheet.createRow(firow);
                    // 将固定行高改为自动行高,以便内容能完整显示在合并区域
                    row.setHeight((short)(50*20));
                    //
                    row.createCell(0).setCellValue("发文号:");
                    sheet.addMergedRegion(new CellRangeAddress(firow, firow, 1, 3));
                    row.createCell(1).setCellValue(inquiryNumber);
                    row.createCell(4).setCellValue("案卷题名:");
                    sheet.addMergedRegion(new CellRangeAddress(firow, firow, 5, 9));
                    CellStyle style1 = wb.createCellStyle();
                    style1.setAlignment(HorizontalAlignment.LEFT);
                    Cell cell2 = row.createCell(0);
                    cell2.setCellValue("发文号:");
                    cell2.setCellStyle(style1);
                    //   row.createCell(4).setCellValue("档号:");
                    //拿到档号
                    row.createCell(5).setCellValue(caseTitle);
                    // 合并第1-3列
                    int startCol1 = 1;
                    int endCol1 = 3;
                    sheet.addMergedRegion(new CellRangeAddress(firow, firow, startCol1, endCol1));
                    // 设置所有合并单元格的样式
                    for (int col = startCol1; col <= endCol1; col++) {
                        Cell mergedCell = row.createCell(col);
                        mergedCell.setCellStyle(style1);
                    }
                    // 只在起始单元格设置数据
                    Cell inquiryCell = row.getCell(startCol1);
                    inquiryCell.setCellValue(inquiryNumber);
                    Cell cell1 = row.createCell(4);
                    cell1.setCellValue("案卷题名:");
                    cell1.setCellStyle(style1);
                    // 创建一个新的样式用于案卷题名合并单元格
                    CellStyle mergedCellStyle = wb.createCellStyle();
                    mergedCellStyle.cloneStyleFrom(style1); // 继承原有样式
                    mergedCellStyle.setAlignment(HorizontalAlignment.LEFT); // 改为左对齐
                    mergedCellStyle.setWrapText(true); // 启用自动换行
                    //mergedCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中
                    // 合并第5-8列
                    int startCol = 5;
                    int endCol = 8;
                    // 先创建所有需要的单元格并设置样式
                    for (int col = startCol; col <= endCol; col++) {
                        Cell mergedCell = row.createCell(col);
                        mergedCell.setCellStyle(mergedCellStyle);
                    }
                    // 然后执行合并操作
                    sheet.addMergedRegion(new CellRangeAddress(firow, firow, startCol, endCol));
                    // 只在起始单元格设置数据
                    Cell getCas = row.getCell(startCol);
                    getCas.setCellStyle(mergedCellStyle);
                    getCas.setCellValue(caseTitle);
                    // 只在起始单元格设置数据
                    //ces.setCellValue(caseTitle);
                    // 设置自动换行
//                    row = sheet.createRow(2);
//                    row.createCell(0).setCellValue("案卷题名:");
                    // 设置自动换行
//                    row = sheet.createRow(2);
//                    row.createCell(0).setCellValue("案卷题名:");
                    firow = firow + 1;
@@ -447,8 +532,11 @@
     * @return 结果
     */
    public void importTemplateExcel(HttpServletResponse response, String sheetName) throws IOException {
        response.setContentType("application/vnd.ms-excel");
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");
        // 设置文件名
        String fileName = UUID.randomUUID() + "_"  + ".xlsx";
        response.setHeader("Content-Disposition", "attachment; filename=" );
        this.init(null, sheetName, Excel.Type.IMPORT);
        exportExcel(response.getOutputStream());
    }
@@ -647,7 +735,7 @@
        } else if (Excel.ColumnType.NUMERIC == attr.cellType()) {
            cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value));
        } else if (Excel.ColumnType.IMAGE == attr.cellType()) {
            ClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1),
            ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1),
                    cell.getRow().getRowNum() + 1);
            String imagePath = Convert.toStr(value);
            if (StringUtils.isNotEmpty(imagePath)) {
@@ -694,12 +782,12 @@
        // 如果设置了提示信息则鼠标放上去提示.
        if (StringUtils.isNotEmpty(attr.prompt())) {
            // 这里默认设了2-101列提示.
            setHSSFPrompt(sheet, "", attr.prompt(), 1, 100, column, column);
            setCellPrompt(sheet, "", attr.prompt(), 1, 100, column, column);
        }
        // 如果设置了combo属性则本列只能选择不能输入
        if (attr.combo().length > 0) {
            // 这里默认设了2-101列只能选择不能输入.
            setHSSFValidation(sheet, attr.combo(), 1, 100, column, column);
            setCellValidation(sheet, attr.combo(), 1, 100, column, column);
        }
    }
@@ -751,7 +839,7 @@
    }
    /**
     * 设置 POI HSSFSheet 单元格提示
     * 设置单元格提示
     *
     * @param sheet         表单
     * @param promptTitle   提示标题
@@ -761,7 +849,7 @@
     * @param firstCol      开始列
     * @param endCol        结束列
     */
    public void setHSSFPrompt(Sheet sheet, String promptTitle, String promptContent, int firstRow, int endRow,
    public void setCellPrompt(Sheet sheet, String promptTitle, String promptContent, int firstRow, int endRow,
                              int firstCol, int endCol) {
        DataValidationHelper helper = sheet.getDataValidationHelper();
        DataValidationConstraint constraint = helper.createCustomConstraint("DD1");
@@ -783,7 +871,7 @@
     * @param endCol   结束列
     * @return 设置好的sheet.
     */
    public void setHSSFValidation(Sheet sheet, String[] textlist, int firstRow, int endRow, int firstCol, int endCol) {
    public void setCellValidation(Sheet sheet, String[] textlist, int firstRow, int endRow, int firstCol, int endCol) {
        DataValidationHelper helper = sheet.getDataValidationHelper();
        // 加载下拉列表内容
        DataValidationConstraint constraint = helper.createExplicitListConstraint(textlist);
@@ -792,7 +880,7 @@
        // 数据有效性对象
        DataValidation dataValidation = helper.createValidation(constraint, regions);
        // 处理Excel兼容性问题
        if (dataValidation instanceof HSSFDataValidation) {
        if (dataValidation instanceof XSSFDataValidation) {
            dataValidation.setSuppressDropDownArrow(false);
            dataValidation.setShowErrorBox(true);
        }
@@ -991,7 +1079,7 @@
     * 创建一个工作簿
     */
    public void createWorkbook() {
        this.wb = new HSSFWorkbook();
        this.wb = new XSSFWorkbook();
    }
    /**
@@ -1061,3 +1149,17 @@
        return val;
    }
}