archiveManager/src/main/java/com/ruoyi/domain/dto/searSigAnn.java
New file @@ -0,0 +1,15 @@ package com.ruoyi.domain.dto; import lombok.Data; @Data public class searSigAnn { private String[] selectedAnnotations; private String[] selectedSignatures; private Long recordId; private Boolean includeQrCode; private String menu; } archiveManager/src/main/java/com/ruoyi/domain/vo/DocumentMaterialsFileList.java
@@ -18,27 +18,27 @@ private String inquiryNumber; private String caseTitle; @Excel(name="序号", headerColor = IndexedColors.BLACK) @Excel(name="序号", width = 7.89, headerColor = IndexedColors.BLACK) private Long num; @Excel(name = "文件编号", headerColor = IndexedColors.BLACK) @Excel(name = "文号 (卷内文件号)", width = 16.89,headerColor = IndexedColors.BLACK) private String documentNumber; @Excel(name = "文件题名", headerColor = IndexedColors.BLACK) @Excel(name = "文件题名",width = 39.22, headerColor = IndexedColors.BLACK) private String title; @Excel(name = "页号", headerColor = IndexedColors.BLACK) @Excel(name = "页号",width = 10.33, headerColor = IndexedColors.BLACK) private Long pageNumber; @Excel(name = "是否有其他介质", headerColor = IndexedColors.BLACK) @Excel(name = "是否有其他介质", width = 10.11, headerColor = IndexedColors.BLACK) private String fileStyle1; @Excel(name = "文件类型", headerColor = IndexedColors.BLACK) @Excel(name = "文件类型", width = 11.22, headerColor = IndexedColors.BLACK) private String fileStyle; @Excel(name = "保管期限", headerColor = IndexedColors.BLACK) @Excel(name = "保管期限", width = 8.67, headerColor = IndexedColors.BLACK) private String retentionPeriod; @Excel(name = "公开属性", headerColor = IndexedColors.BLACK) @Excel(name = "公开属性",width = 10.11, headerColor = IndexedColors.BLACK) private String publicity; @Excel(name = "备注", headerColor = IndexedColors.BLACK) @Excel(name = "备注", width = 11.67, headerColor = IndexedColors.BLACK) private String remarks; } 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; @@ -45,22 +48,24 @@ */ @RestController @RequestMapping("/system/records") public class ArchiveRecordsController extends BaseController { public class ArchiveRecordsController extends BaseController { @Autowired private IArchiveRecordsService archiveRecordsService; @Autowired private BarcodeService barcodeService; @Autowired private pdfGenerateService pdfGenerateService; @Autowired private IDocumentMaterialsService iDocumentMaterialsService; /** * 查询档案完成情况 */ @PreAuthorize("@ss.hasPermi('system:records:list')") @GetMapping("/analysisRes") public AjaxResult analysis() { public AjaxResult analysis() { System.out.println("009099"); return new AjaxResult(200, "查询成功", archiveRecordsService.statisticAya()); } @@ -68,8 +73,7 @@ @PreAuthorize("@ss.hasPermi('system:records:export')") @Log(title = "档案分析结果导出", businessType = BusinessType.EXPORT) @PostMapping("/exportAllStatis") public void exportAllStatis(HttpServletResponse response) { public void exportAllStatis(HttpServletResponse response) { List<AnalysisResult> list = archiveRecordsService.statisticAya(); ExcelUtil<AnalysisResult> util = new ExcelUtil<AnalysisResult>(AnalysisResult.class); util.exportExcel(response, list, "案卷目录"); @@ -80,31 +84,30 @@ */ @PreAuthorize("@ss.hasPermi('system:records:list')") @GetMapping("/list") public AjaxResult list(ArchiveRecords archiveRecords) { public AjaxResult list(ArchiveRecords archiveRecords) { Integer pageNum = Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1); Integer pageSize = Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10); return archiveRecordsService.selectDataList(archiveRecords, pageNum, pageSize); } /** * 拿到最大id */ @PreAuthorize("@ss.hasPermi('system:records:list')") @GetMapping("/getMaxId") public AjaxResult getMaxId() { return success(archiveRecordsService.getMaxId()+1); public AjaxResult getMaxId() { return success(archiveRecordsService.getMaxId() + 1); } /** * 导出档案记录列表 */ @PreAuthorize("@ss.hasPermi('system:records:export')") @Log(title = "档案记录", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, ArchiveRecords archiveRecords, @RequestParam(value = "ids", required = false) Long[] ids) { public void export(HttpServletResponse response, ArchiveRecords archiveRecords, @RequestParam(value = "ids", required = false) Long[] ids) { List<ArchiveRecords> list; System.out.println(ids); // 如果提供了ids参数,则根据ids导出指定记录 @@ -123,11 +126,10 @@ */ @PreAuthorize("@ss.hasPermi('system:records:query')") @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") Long id) { public AjaxResult getInfo(@PathVariable("id") Long id) { ArchiveRecords records = archiveRecordsService.selectArchiveRecordsById(id); if(records!=null) if (records != null) return new AjaxResult(200, "查询成功", records); else return new AjaxResult(201, "查询失败!"); @@ -139,16 +141,14 @@ @PreAuthorize("@ss.hasPermi('system:records:add')") @Log(title = "档案记录", businessType = BusinessType.INSERT) @PostMapping public AjaxResult add(@RequestBody ArchiveRecords archiveRecords) { public AjaxResult add(@RequestBody ArchiveRecords archiveRecords) { int res = archiveRecordsService.insertArchiveRecords(archiveRecords); System.out.println(res); if(res==0) { if (res == 0) { System.out.println(res); return new AjaxResult(0, "档案号已经存在了!"); } else } else return new AjaxResult(200, "添加成功了!"); @@ -160,34 +160,33 @@ @PreAuthorize("@ss.hasPermi('system:records:edit')") @Log(title = "档案记录", businessType = BusinessType.UPDATE) @PutMapping public AjaxResult edit(@RequestBody ArchiveRecords archiveRecords) { public AjaxResult edit(@RequestBody ArchiveRecords archiveRecords) { return toAjax(archiveRecordsService.updateArchiveRecords(archiveRecords)); } @PreAuthorize("@ss.hasPermi('system:records:edit')") @Log(title = "档案记录", businessType = BusinessType.UPDATE) @PostMapping(value = "/updateSByIds") public AjaxResult updateStatusByIds(@RequestBody Long[] ids) { public AjaxResult updateStatusByIds(@RequestBody Long[] ids) { System.out.println(ids); System.out.println("090sdfsdf"); return new AjaxResult(0, archiveRecordsService.updateStatusByIds(ids)+""); return new AjaxResult(0, archiveRecordsService.updateStatusByIds(ids) + ""); } /** * 删除档案记录 */ @PreAuthorize("@ss.hasPermi('system:records:remove')") @Log(title = "档案记录", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) { @DeleteMapping("/{ids}") public AjaxResult remove(@PathVariable Long[] ids) { return toAjax(archiveRecordsService.deleteArchiveRecordsByIds(ids)); } @PreAuthorize("@ss.hasPermi('system:records:edit')") @Log(title = "档案记录导入", businessType = BusinessType.IMPORT) @PostMapping("/importData") public AjaxResult importData(@RequestParam("excelImport") MultipartFile file) throws Exception { public AjaxResult importData(@RequestParam("excelImport") MultipartFile file) throws Exception { return archiveRecordsService.importExcel(file); } @@ -195,99 +194,128 @@ @PreAuthorize("@ss.hasPermi('system:records:edit')") @Log(title = "修改状态", businessType = BusinessType.IMPORT) @GetMapping(value = "/updateStatusById/{status}/{id}") public AjaxResult updateStatusById(@PathVariable("status") String status,@PathVariable("id") String id) { return new AjaxResult(200, archiveRecordsService.updateArchiveById(status, Long.parseLong(id))+""); public AjaxResult updateStatusById(@PathVariable("status") String status, @PathVariable("id") String id) { return new AjaxResult(200, archiveRecordsService.updateArchiveById(status, Long.parseLong(id)) + ""); } @PostMapping("/model") public void getExportModel(HttpServletResponse response){ public void getExportModel(HttpServletResponse response) { List<ArchiveRecordModelExp> list = Collections.singletonList(new ArchiveRecordModelExp()); ExcelUtil<ArchiveRecordModelExp> util = new ExcelUtil<>(ArchiveRecordModelExp.class); util.exportExcel(response,list,"档案信息导入模板"); util.exportExcel(response, list, "档案信息导入模板"); } @PostMapping("/modelOther") public void getExportModelOther(HttpServletResponse response){ public void getExportModelOther(HttpServletResponse response) { List<ArchiveRecordModelOther> list = Collections.singletonList(new ArchiveRecordModelOther()); ExcelUtil<ArchiveRecordModelOther> util = new ExcelUtil<>(ArchiveRecordModelOther.class); util.exportExcel(response,list,"档案信息导入模板"); util.exportExcel(response, list, "档案信息导入模板"); } @PreAuthorize("@ss.hasPermi('system:records:list')") @Log(title = "是否允许提交", businessType = BusinessType.IMPORT) @GetMapping(value = "/whether/{recordId}") public AjaxResult whether(@PathVariable("recordId") Long recordId) { return AjaxResult.success( archiveRecordsService.whether(recordId)); public AjaxResult whether(@PathVariable("recordId") Long recordId) { 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); byte[] bt = barcodeService.generateBarcodeImage(code); // System.out.println(Arrays.toString(selectedSignatures)); //签名选择 String [] sig = {"业务科室移交人:","审批科移交人:","档案整理公司:"}; String[] sig = {"业务科室移交人:", "审批科移交人:", "档案整理公司:"}; List<String> arrLis = new ArrayList<>(); if(selectedSignatures!=null){ for(int si: selectedSignatures) { arrLis.add(sig[si]); if (searSigAnn.getSelectedSignatures() != null) { for (String si : searSigAnn.getSelectedSignatures()) { arrLis.add(sig[Integer.parseInt(si)]); System.out.println(sig[Integer.parseInt(si)]); } } //注选择 String [] ann = { "本清单由档案形成部门完成", String[] ann = {"本清单由档案形成部门完成", "文件类型必须录入,包括结论材料、过程材料、申请材料,其他材料", "公开属性必须录入,主动公开、依申请公开、免予公开", "保管期限:30年或永久", "页号按照正式录入页码为准"}; List<String> arrAn = new ArrayList<>(); if(selectedAnnotations!=null) { for (int ar : selectedAnnotations) { arrAn.add(ann[ar]); } // 1. 对索引进行排序(从小到大) int[] sortedIndices = convertToIntArray(searSigAnn.getSelectedAnnotations()).clone(); Arrays.sort(sortedIndices); // String[] result = new String[sortedIndices.length]; for (int sortedIndex : sortedIndices) { arrAn.add(ann[sortedIndex]); } 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()); // 复制属性到SmallObject列表 for (DocumentMaterialsFileList bigObject : lst) { DocumentMaterialsFileList smallObject = new DocumentMaterialsFileList(); BeanUtil.copyProperties(bigObject, smallObject); // 复制属性 System.out.println(bigObject); if(bigObject.getFileStyle()!=null&& ((bigObject.getFileStyle().equals("其它材料")) ||bigObject.getFileStyle().equals("光盘") ||bigObject.getFileStyle().equals("U盘"))) smallObject.setFileStyle1("是"); else smallObject.setFileStyle1("否"); arsi.add(smallObject); } // arsi.add(aIV); ExcelExp e3 = new ExcelExp("文件材料移交目录清单",arsi, DocumentMaterialsFileList.class); // ExcelExp e4 = new ExcelExp("案卷封面", arsi, recordId1, imgr1,sedcode, ArchiveInfoVo.class); // System.out.println(arsi.toString()); // arsi.add(aIV); ExcelExp e3 = new ExcelExp("文件材料移交目录清单", arsi, DocumentMaterialsFileList.class); // ExcelExp e4 = new ExcelExp("案卷封面", arsi, recordId1, imgr1,sedcode, ArchiveInfoVo.class); List<ExcelExp> mysheet1 = new ArrayList<ExcelExp>(); mysheet1.add(e3); // mysheet1.add(e4); // mysheet1.add(e4); //ByteOutputStream bos2 = new ByteOutputStream(); // if(searSigAnn.getMenu().equals("")) ExcelUtilManySheetFour<List<ExcelExp>> util3 = new ExcelUtilManySheetFour<List<ExcelExp>>(mysheet1); //拿到caseTitle和inquiryNumber String inquiryNumber = ""; String caseTitle = ""; if(!arsi.isEmpty()) { if (!arsi.isEmpty()) { 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); } public static int[] convertToIntArray(String[] source) { int[] result = new int[source.length]; for (int i = 0; i < source.length; i++) { try { result[i] = Integer.parseInt(source[i].trim()); } catch (NumberFormatException e) { System.out.println("错误: 索引 " + i + " 的值 '" + source[i] + "' 不是有效整数"); result[i] = 0; // 或者使用默认值 } } return result; } } 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()); // 使用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<DocumentMaterialsVo> dsvs = documentMaterialsService.findArchMInfo(documentMaterials.getRecordId().toString()); 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<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()); // 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/ExcelUtilManySheetFive.java
New file @@ -0,0 +1,1163 @@ package com.ruoyi.common.utils.poi; import com.ruoyi.common.annotation.Excel; import com.ruoyi.common.annotation.Excels; import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; 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.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddressList; import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFDataValidation; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Field; import java.math.BigDecimal; import java.text.DecimalFormat; import java.util.*; import java.util.stream.Collectors; /** * Excel相关处理 * * @author ruoyi */ public class ExcelUtilManySheetFive<T> { private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); /** * Excel sheet最大行数,默认65536 */ public static final int sheetSize = 65536; /** * 工作表名称 */ private String sheetName; /** * 导出类型(EXPORT:导出数据;IMPORT:导入模板) */ private Excel.Type type; /** * 工作薄对象 */ private Workbook wb; /** * 工作表对象 */ private Sheet sheet; /** * 样式列表 */ private Map<String, CellStyle> styles; /** * 导入导出数据列表 */ private List<T> list; /** * 注解列表 */ private List<Object[]> fields; /** * 最大高度 */ private short maxHeight; /** * 统计列表 */ private Map<Integer, Double> statistics = new HashMap<Integer, Double>(); /** * 数字格式 */ private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); /** * 实体对象 */ public Class<T> clazz; public List<ExcelExp> clazzlist; public ExcelUtilManySheetFive(List<ExcelExp> clazzlist) { this.clazzlist = clazzlist; } public void init(List<T> list, String sheetName, Excel.Type type) { if (list == null) { list = new ArrayList<T>(); } this.list = list; this.sheetName = sheetName; this.type = type; createExcelField(); } /** * 对excel表单默认第一个索引名转换成list * * @param is 输入流 * @return 转换后集合 */ public List<T> importExcel(InputStream is) throws Exception { return importExcel(StringUtils.EMPTY, is); } /** * 对excel表单指定表格索引名转换成list * * @param sheetName 表格索引名 * @param is 输入流 * @return 转换后集合 */ public List<T> importExcel(String sheetName, InputStream is) throws Exception { this.type = Excel.Type.IMPORT; this.wb = WorkbookFactory.create(is); List<T> list = new ArrayList<T>(); Sheet sheet = null; if (StringUtils.isNotEmpty(sheetName)) { // 如果指定sheet名,则取指定sheet中的内容. sheet = wb.getSheet(sheetName); } else { // 如果传入的sheet名不存在则默认指向第1个sheet. sheet = wb.getSheetAt(0); } if (sheet == null) { throw new IOException("文件sheet不存在"); } int rows = sheet.getPhysicalNumberOfRows(); if (rows > 0) { // 定义一个map用于存放excel列的序号和field. Map<String, Integer> cellMap = new HashMap<String, Integer>(); // 获取表头 Row heard = sheet.getRow(0); for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) { Cell cell = heard.getCell(i); if (StringUtils.isNotNull(cell)) { String value = this.getCellValue(heard, i).toString(); cellMap.put(value, i); } else { cellMap.put(null, i); } } // 有数据时才处理 得到类的所有field. Field[] allFields = clazz.getDeclaredFields(); // 定义一个map用于存放列的序号和field. Map<Integer, Field> fieldsMap = new HashMap<Integer, Field>(); for (int col = 0; col < allFields.length; col++) { Field field = allFields[col]; Excel attr = field.getAnnotation(Excel.class); if (attr != null && (attr.type() == Excel.Type.ALL || attr.type() == type)) { // 设置类的私有字段属性可访问. field.setAccessible(true); Integer column = cellMap.get(attr.name()); if (column != null) { fieldsMap.put(column, field); } } } for (int i = 1; i < rows; i++) { // 从第2行开始取数据,默认第一行是表头. Row row = sheet.getRow(i); T entity = null; for (Map.Entry<Integer, Field> entry : fieldsMap.entrySet()) { Object val = this.getCellValue(row, entry.getKey()); // 如果不存在实例则新建. entity = (entity == null ? clazz.newInstance() : entity); // 从map中得到对应列的field. Field field = fieldsMap.get(entry.getKey()); // 取得类型,并根据对象类型设置值. Class<?> fieldType = field.getType(); if (String.class == fieldType) { String s = Convert.toStr(val); if (StringUtils.endsWith(s, ".0")) { val = StringUtils.substringBefore(s, ".0"); } else { String dateFormat = field.getAnnotation(Excel.class).dateFormat(); if (StringUtils.isNotEmpty(dateFormat)) { val = DateUtils.parseDateToStr(dateFormat, (Date) val); } else { val = Convert.toStr(val); } } } else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) { val = Convert.toInt(val); } else if (Long.TYPE == fieldType || Long.class == fieldType) { val = Convert.toLong(val); } else if (Double.TYPE == fieldType || Double.class == fieldType) { val = Convert.toDouble(val); } else if (Float.TYPE == fieldType || Float.class == fieldType) { val = Convert.toFloat(val); } else if (BigDecimal.class == fieldType) { val = Convert.toBigDecimal(val); } else if (Date.class == fieldType) { if (val instanceof String) { val = DateUtils.parseDate(val); } else if (val instanceof Double) { val = DateUtil.getJavaDate((Double) val); } } else if (Boolean.TYPE == fieldType || Boolean.class == fieldType) { val = Convert.toBool(val, false); } if (StringUtils.isNotNull(fieldType)) { Excel attr = field.getAnnotation(Excel.class); String propertyName = field.getName(); if (StringUtils.isNotEmpty(attr.targetAttr())) { propertyName = field.getName() + "." + attr.targetAttr(); } else if (StringUtils.isNotEmpty(attr.readConverterExp())) { val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator()); } ReflectUtils.invokeSetter(entity, propertyName, val); } } list.add(entity); } } return list; } /** * 对list数据源将其里面的数据导入到excel表单 * * @param response 返回数据 * @param list 导出数据集合 * @param sheetName 工作表的名称 * @return 结果 * @throws IOException */ public void exportExcel(HttpServletResponse response, List<T> list, String sheetName) throws IOException { 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()); } /** * 对list数据源将其里面的数据导入到excel表单 * * @param * @param list 导出数据集合 * @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.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); // 设置文件名 String fileName = UUID.randomUUID() + "_" + ".xlsx"; response.setHeader("Content-Disposition", "attachment; filename=" + fileName); try { createWorkbook(); for (int index = 0; index <list.size(); index++) { this.clazz = list.get(index).getClazz(); this.init(list.get(index).getDataset(), list.get(index).getFileName(), Excel.Type.EXPORT); // 取出一共有多少个sheet. // double sheetNo = Math.ceil(list.size() / sheetSize); createSheetManySheet(index); Row row; int firow = 0; int column = 0; if(index == 0) { // 合并第一行的前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); //生成二维码 if(includeQrCode) { row.setHeight((short)(40 * 40)); Cell cell = row.createCell(6); // 设置图片大小和位置 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; // 中间列 // int col2 = col1 + 2; // anchor.setCol1(col1); // anchor.setCol2(col2); // anchor.setDx1(100); // anchor.setDy1(0); // anchor.setDx2(255); // 宽度 // anchor.setDy2(255); // 高度 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; // 获取图片原始尺寸 BufferedImage image = ImageIO.read(new ByteArrayInputStream(data)); double widthInEMU = image.getWidth() * 9525 * 0.2; double heightInEMU = image.getHeight() * 9525; // 设置图片原始尺寸 // anchor.setDx2(-100000); // 原始宽度 // anchor.setDy2((int)heightInEMU); // 原始高度 //anchor.setCol1(5); // 从第6列开始显示 //anchor.setCol2(10); // 到第11列结束 //Files.readAllBytes(Paths.get(RuoYiConfig.getProfile() + "/upload/2025/08/14/30_20250814212128A031.jpg")); // // // System.out.println(data.length); getDrawingPatriarch(cell.getSheet()).createPicture(anchor, cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); firow = firow + 1; row = sheet.createRow(firow); } else row.setHeight((short)(20 * 20)); // sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 7)); if(firow==1) { sheet.addMergedRegion(new CellRangeAddress(firow, firow, 0, 8)); // 创建行并设置高度 row.setHeight((short)(20 * 20)); } Cell titleCell = row.createCell(0); titleCell.setCellValue("文件材料移交目录清单(卷内级)"); // 设置加粗和居中样式 CellStyle style = wb.createCellStyle(); Font font = wb.createFont(); font.setBold(true); font.setFontName("宋体"); style.setFont(font); style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); titleCell.setCellStyle(style); firow = firow + 1; row = sheet.createRow(firow); // 将固定行高改为自动行高,以便内容能完整显示在合并区域 row.setHeight((short)(50*20)); // CellStyle style1 = wb.createCellStyle(); style1.setAlignment(HorizontalAlignment.LEFT); style1.setVerticalAlignment(VerticalAlignment.CENTER); style1.setWrapText(true); Cell cell2 = row.createCell(0); cell2.setCellValue("发文号:"); cell2.setCellStyle(style1); // 合并第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; row = sheet.createRow(firow); System.out.println("++++++++++++++++++++++++++---------++++++++++++"); System.out.println(firow); column = 0; } else { // 普通sheet处理 // recordId = (DocumentMaterialsVo)list.get(0) row = sheet.createRow(0); column = 0; } // // 产生一行 // 写入各个字段的列头名称 for (Object[] os : fields) { Excel excel = (Excel) os[1]; this.createCell(excel, row, column++); } if (Excel.Type.EXPORT.equals(type)) { fillExcelData(index, row, firow); addStatisticsRow(); } //写入签名 System.out.println(list.get(0).getDataset().size()+"aaaaaaaaaaaaaaaaaaa0999"); row = sheet.createRow(list.get(0).getDataset().size()+4); // int in = 0 ; for(int i = 0; i < sigArr.size(); i++) { row.createCell(in).setCellValue(sigArr.get(i)); in = in + 3; } //写入注释 for(int i = 0; i < arrAn.size();i++) { row = sheet.createRow(list.get(0).getDataset().size() + 5+i); int ri = list.get(0).getDataset().size() + 5+i; sheet.addMergedRegion(new CellRangeAddress(ri, ri, 0, 3)); row.createCell(0).setCellValue(i+1+"、"+arrAn.get(i)); } } wb.write(response.getOutputStream()); } catch (IOException e) { log.error("导出Excel异常{}", e.getMessage()); } finally { if (wb != null) { try { wb.close(); } catch (IOException e1) { e1.printStackTrace(); } } // if (response.getOutputStream() != null) { // try { // response.getOutputStream().close(); // } catch (IOException e1) { // e1.printStackTrace(); // } // } } // exportExcel(response.getOutputStream()); } /** * 对list数据源将其里面的数据导入到excel表单 * * @param sheetName 工作表的名称 * @return 结果 */ public void importTemplateExcel(HttpServletResponse response, String sheetName) throws IOException { 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()); } /** * 对list数据源将其里面的数据导入到excel表单 * * @return 结果 */ public void exportExcel(OutputStream outputStream) { try { // 取出一共有多少个sheet. double sheetNo = Math.ceil(list.size() / sheetSize); for (int index = 0; index <= sheetNo; index++) { createSheet(sheetNo, index); // 产生一行 Row row = sheet.createRow(0); int column = 0; // 写入各个字段的列头名称 for (Object[] os : fields) { Excel excel = (Excel) os[1]; this.createCell(excel, row, column++); } if (Excel.Type.EXPORT.equals(type)) { fillExcelData(index, row, 0); addStatisticsRow(); } } wb.write(outputStream); } catch (Exception e) { log.error("导出Excel异常{}", e.getMessage()); } finally { if (wb != null) { try { wb.close(); } catch (IOException e1) { e1.printStackTrace(); } } if (outputStream != null) { try { outputStream.close(); } catch (IOException e1) { e1.printStackTrace(); } } } } /** * 填充excel数据 * * @param index 序号 * @param row 单元格行 */ public void fillExcelData(int index, Row row, int firRow) { // int startNo = index * sheetSize; // int endNo = Math.min(startNo + sheetSize, list.size()); for (int i = 0; i < list.size(); i++) { if(index==0) row = sheet.createRow(i + firRow + 1); else row = sheet.createRow(i + 1 ); // 得到导出对象. T vo = (T) list.get(i); int column = 0; for (Object[] os : fields) { Field field = (Field) os[0]; Excel excel = (Excel) os[1]; // 设置实体类私有属性可访问 field.setAccessible(true); this.addCell(excel, row, vo, field, column++); } } } /** * 创建表格样式 * * @param wb 工作薄对象 * @return 样式列表 */ private Map<String, CellStyle> createStyles(Workbook wb) { // 写入各条记录,每条记录对应excel表中的一行 Map<String, CellStyle> styles = new HashMap<String, CellStyle>(); CellStyle style = wb.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); // 设置单元格内容自动换行 style.setWrapText(true); style.setBorderRight(BorderStyle.THIN); style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); style.setBorderLeft(BorderStyle.THIN); style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); style.setBorderTop(BorderStyle.THIN); style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); style.setBorderBottom(BorderStyle.THIN); style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); Font dataFont = wb.createFont(); dataFont.setFontName("Arial"); dataFont.setFontHeightInPoints((short) 10); style.setFont(dataFont); styles.put("data", style); // 创建表头样式映射,根据Excel注解动态生成 Map<String, CellStyle> headerStyles = new HashMap<String, CellStyle>(); for (Object[] os : fields) { Excel excel = (Excel) os[1]; String key = StringUtils.format("header_{}_{}", excel.headerColor(), excel.headerBackgroundColor()); if (!headerStyles.containsKey(key)) { style = wb.createCellStyle(); style.cloneStyleFrom(styles.get("data")); style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); // 设置单元格内容自动换行 style.setWrapText(true); // 根据注解设置表头背景色 - 已注释,表头不显示背景色 /*if (excel.headerBackgroundColor() != IndexedColors.WHITE) { style.setFillForegroundColor(excel.headerBackgroundColor().index); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); }*/ Font headerFont = wb.createFont(); headerFont.setFontName("Arial"); headerFont.setFontHeightInPoints((short) 10); headerFont.setBold(false); headerFont.setColor(excel.headerColor().index); style.setFont(headerFont); headerStyles.put(key, style); } } styles.putAll(headerStyles); style = wb.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); // 设置单元格内容自动换行 style.setWrapText(true); Font totalFont = wb.createFont(); totalFont.setFontName("Arial"); totalFont.setFontHeightInPoints((short) 10); style.setFont(totalFont); styles.put("total", style); style = wb.createCellStyle(); style.cloneStyleFrom(styles.get("data")); style.setAlignment(HorizontalAlignment.LEFT); // 设置单元格内容自动换行 style.setWrapText(true); styles.put("data1", style); style = wb.createCellStyle(); style.cloneStyleFrom(styles.get("data")); style.setAlignment(HorizontalAlignment.CENTER); // 设置单元格内容自动换行 style.setWrapText(true); styles.put("data2", style); style = wb.createCellStyle(); style.cloneStyleFrom(styles.get("data")); style.setAlignment(HorizontalAlignment.RIGHT); // 设置单元格内容自动换行 style.setWrapText(true); styles.put("data3", style); return styles; } /** * 创建单元格 */ public Cell createCell(Excel attr, Row row, int column) { // 创建列 Cell cell = row.createCell(column); // 写入列信息 cell.setCellValue(attr.name()); setDataValidation(attr, row, column); // 根据Excel注解动态选择表头样式 String key = StringUtils.format("header_{}_{}", attr.headerColor(), attr.headerBackgroundColor()); cell.setCellStyle(styles.get(key)); return cell; } /** * 设置单元格信息 * * @param value 单元格值 * @param attr 注解相关 * @param cell 单元格信息 */ public void setCellVo(Object value, Excel attr, Cell cell) { if (Excel.ColumnType.STRING == attr.cellType()) { cell.setCellValue(StringUtils.isNull(value) ? attr.defaultValue() : value + attr.suffix()); } 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 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)) { byte[] data = ImageUtils.getImage(imagePath); getDrawingPatriarch(cell.getSheet()).createPicture(anchor, cell.getSheet().getWorkbook().addPicture(data, getImageType(data))); } } } /** * 获取画布 */ public static Drawing<?> getDrawingPatriarch(Sheet sheet) { if (sheet.getDrawingPatriarch() == null) { sheet.createDrawingPatriarch(); } return sheet.getDrawingPatriarch(); } /** * 获取图片类型,设置图片插入类型 */ public int getImageType(byte[] value) { String type = FileTypeUtils.getFileExtendName(value); if ("JPG".equalsIgnoreCase(type)) { return Workbook.PICTURE_TYPE_JPEG; } else if ("PNG".equalsIgnoreCase(type)) { return Workbook.PICTURE_TYPE_PNG; } return Workbook.PICTURE_TYPE_JPEG; } /** * 创建表格样式 */ public void setDataValidation(Excel attr, Row row, int column) { if (attr.name().indexOf("注:") >= 0) { sheet.setColumnWidth(column, 6000); } else { // 设置列宽 sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); } // 如果设置了提示信息则鼠标放上去提示. if (StringUtils.isNotEmpty(attr.prompt())) { // 这里默认设了2-101列提示. setCellPrompt(sheet, "", attr.prompt(), 1, 100, column, column); } // 如果设置了combo属性则本列只能选择不能输入 if (attr.combo().length > 0) { // 这里默认设了2-101列只能选择不能输入. setCellValidation(sheet, attr.combo(), 1, 100, column, column); } } /** * 添加单元格 */ public Cell addCell(Excel attr, Row row, T vo, Field field, int column) { Cell cell = null; try { // 设置行高为自动调整 row.setHeight((short) -1); // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列. if (attr.isExport()) { // 创建cell cell = row.createCell(column); // 设置单元格样式 HorizontalAlignment align = attr.align(); String styleKey = "data"; if (align == HorizontalAlignment.LEFT) { styleKey = "data1"; } else if (align == HorizontalAlignment.CENTER) { styleKey = "data2"; } else if (align == HorizontalAlignment.RIGHT) { styleKey = "data3"; } cell.setCellStyle(styles.get(styleKey)); // 用于读取对象中的属性 Object value = getTargetValue(vo, field, attr); String dateFormat = attr.dateFormat(); String readConverterExp = attr.readConverterExp(); String separator = attr.separator(); if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) { cell.setCellValue(DateUtils.parseDateToStr(dateFormat, (Date) value)); } else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) { cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator)); } else if (value instanceof BigDecimal && -1 != attr.scale()) { cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).toString()); } else { // 设置列类型 setCellVo(value, attr, cell); } addStatisticsData(column, Convert.toStr(value), attr); } } catch (Exception e) { log.error("导出Excel失败{}", e); } return cell; } /** * 设置单元格提示 * * @param sheet 表单 * @param promptTitle 提示标题 * @param promptContent 提示内容 * @param firstRow 开始行 * @param endRow 结束行 * @param firstCol 开始列 * @param endCol 结束列 */ 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"); CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); DataValidation dataValidation = helper.createValidation(constraint, regions); dataValidation.createPromptBox(promptTitle, promptContent); dataValidation.setShowPromptBox(true); sheet.addValidationData(dataValidation); } /** * 设置某些列的值只能输入预制的数据,显示下拉框. * * @param sheet 要设置的sheet. * @param textlist 下拉框显示的内容 * @param firstRow 开始行 * @param endRow 结束行 * @param firstCol 开始列 * @param endCol 结束列 * @return 设置好的sheet. */ public void setCellValidation(Sheet sheet, String[] textlist, int firstRow, int endRow, int firstCol, int endCol) { DataValidationHelper helper = sheet.getDataValidationHelper(); // 加载下拉列表内容 DataValidationConstraint constraint = helper.createExplicitListConstraint(textlist); // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); // 数据有效性对象 DataValidation dataValidation = helper.createValidation(constraint, regions); // 处理Excel兼容性问题 if (dataValidation instanceof XSSFDataValidation) { dataValidation.setSuppressDropDownArrow(false); dataValidation.setShowErrorBox(true); } sheet.addValidationData(dataValidation); } /** * 解析导出值 0=男,1=女,2=未知 * * @param propertyValue 参数值 * @param converterExp 翻译注解 * @param separator 分隔符 * @return 解析后值 */ public static String convertByExp(String propertyValue, String converterExp, String separator) { StringBuilder propertyString = new StringBuilder(); String[] convertSource = converterExp.split(","); for (String item : convertSource) { String[] itemArray = item.split("="); if (StringUtils.containsAny(separator, propertyValue)) { for (String value : propertyValue.split(separator)) { if (itemArray[0].equals(value)) { propertyString.append(itemArray[1] + separator); break; } } } else { if (itemArray[0].equals(propertyValue)) { return itemArray[1]; } } } return StringUtils.stripEnd(propertyString.toString(), separator); } /** * 反向解析值 男=0,女=1,未知=2 * * @param propertyValue 参数值 * @param converterExp 翻译注解 * @param separator 分隔符 * @return 解析后值 */ public static String reverseByExp(String propertyValue, String converterExp, String separator) { StringBuilder propertyString = new StringBuilder(); String[] convertSource = converterExp.split(","); for (String item : convertSource) { String[] itemArray = item.split("="); if (StringUtils.containsAny(separator, propertyValue)) { for (String value : propertyValue.split(separator)) { if (itemArray[1].equals(value)) { propertyString.append(itemArray[0] + separator); break; } } } else { if (itemArray[1].equals(propertyValue)) { return itemArray[0]; } } } return StringUtils.stripEnd(propertyString.toString(), separator); } /** * 合计统计信息 */ private void addStatisticsData(Integer index, String text, Excel entity) { if (entity != null && entity.isStatistics()) { Double temp = 0D; if (!statistics.containsKey(index)) { statistics.put(index, temp); } try { temp = Double.valueOf(text); } catch (NumberFormatException e) { } statistics.put(index, statistics.get(index) + temp); } } /** * 创建统计行 */ public void addStatisticsRow() { if (statistics.size() > 0) { Cell cell = null; Row row = sheet.createRow(sheet.getLastRowNum() + 1); Set<Integer> keys = statistics.keySet(); cell = row.createCell(0); cell.setCellStyle(styles.get("total")); cell.setCellValue("合计"); for (Integer key : keys) { cell = row.createCell(key); cell.setCellStyle(styles.get("total")); cell.setCellValue(DOUBLE_FORMAT.format(statistics.get(key))); } statistics.clear(); } } /** * 获取bean中的属性值 * * @param vo 实体对象 * @param field 字段 * @param excel 注解 * @return 最终的属性值 * @throws Exception */ private Object getTargetValue(T vo, Field field, Excel excel) throws Exception { Object o = field.get(vo); if (StringUtils.isNotEmpty(excel.targetAttr())) { String target = excel.targetAttr(); if (target.indexOf(".") > -1) { String[] targets = target.split("[.]"); for (String name : targets) { o = getValue(o, name); } } else { o = getValue(o, target); } } return o; } /** * 以类的属性的get方法方法形式获取值 * * @param o * @param name * @return value * @throws Exception */ private Object getValue(Object o, String name) throws Exception { if (StringUtils.isNotNull(o) && StringUtils.isNotEmpty(name)) { Class<?> clazz = o.getClass(); Field field = clazz.getDeclaredField(name); field.setAccessible(true); o = field.get(o); } return o; } /** * 得到所有定义字段 */ private void createExcelField() { this.fields = new ArrayList<Object[]>(); List<Field> tempFields = new ArrayList<>(); tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); for (Field field : tempFields) { // 单注解 if (field.isAnnotationPresent(Excel.class)) { putToField(field, field.getAnnotation(Excel.class)); } // 多注解 if (field.isAnnotationPresent(Excels.class)) { Excels attrs = field.getAnnotation(Excels.class); Excel[] excels = attrs.value(); for (Excel excel : excels) { putToField(field, excel); } } } this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList()); this.maxHeight = getRowHeight(); } /** * 根据注解获取最大行高 */ public short getRowHeight() { double maxHeight = 0; for (Object[] os : this.fields) { Excel excel = (Excel) os[1]; maxHeight = maxHeight > excel.height() ? maxHeight : excel.height(); } return (short) (maxHeight * 20); } /** * 放到字段集合中 */ private void putToField(Field field, Excel attr) { if (attr != null && (attr.type() == Excel.Type.ALL || attr.type() == type)) { this.fields.add(new Object[]{field, attr}); } } /** * 创建一个工作簿 */ public void createWorkbook() { this.wb = new XSSFWorkbook(); } /** * 创建工作表 * * @param sheetNo sheet数量 * @param index 序号 */ public void createSheet(double sheetNo, int index) { this.sheet = wb.createSheet(); this.styles = createStyles(wb); // 设置工作表的名称. if (sheetNo == 0) { wb.setSheetName(index, sheetName); } else { wb.setSheetName(index, sheetName + index); } } /** * 创建工作表 * * @param index 序号 */ public void createSheetManySheet( int index) { this.sheet = wb.createSheet(); this.styles = createStyles(wb); wb.setSheetName(index, sheetName); } /** * 获取单元格值 * * @param row 获取的行 * @param column 获取单元格列号 * @return 单元格值 */ public Object getCellValue(Row row, int column) { if (row == null) { return row; } Object val = ""; try { Cell cell = row.getCell(column); if (StringUtils.isNotNull(cell)) { if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA) { val = cell.getNumericCellValue(); if (DateUtil.isCellDateFormatted(cell)) { val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换 } else { if ((Double) val % 1 != 0) { val = new BigDecimal(val.toString()); } else { val = new DecimalFormat("0").format(val); } } } else if (cell.getCellType() == CellType.STRING) { val = cell.getStringCellValue(); } else if (cell.getCellType() == CellType.BOOLEAN) { val = cell.getBooleanCellValue(); } else if (cell.getCellType() == CellType.ERROR) { val = cell.getErrorCellValue(); } } } catch (Exception e) { return val; } return val; } } 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)); row = sheet.createRow(firow); //生成二维码 if(includeQrCode) { Cell cell = row.createCell(6); row.setHeight((short)(55.8 * 20)); 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 = 4; // 中间列 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,12 +376,15 @@ firow = firow + 1; row = sheet.createRow(firow); } else row.setHeight((short)(33 * 20)); // sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 7)); if(firow==1) { sheet.addMergedRegion(new CellRangeAddress(firow, firow, 0, 8)); // 创建行并设置高度 row.setHeight((short)(20 * 20)); row.setHeight((short)(33 * 20)); } Cell titleCell = row.createCell(0); titleCell.setCellValue("文件材料移交目录清单(卷内级)"); @@ -358,33 +392,115 @@ CellStyle style = wb.createCellStyle(); Font font = wb.createFont(); font.setBold(true); font.setFontHeightInPoints((short) 18); font.setFontName("宋体"); style.setFont(font); style.setVerticalAlignment(VerticalAlignment.CENTER); style.setAlignment(HorizontalAlignment.CENTER); titleCell.setCellStyle(style); firow = firow + 1; row = sheet.createRow(firow); // 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)); // row.createCell(4).setCellValue("档号:"); //拿到档号 row.createCell(5).setCellValue(caseTitle); // 将固定行高改为自动行高,以便内容能完整显示在合并区域 row.setHeight((short)(27.6*20)); // CellStyle style1 = wb.createCellStyle(); style1.setAlignment(HorizontalAlignment.RIGHT); style1.setVerticalAlignment(VerticalAlignment.TOP); Font font1 = wb.createFont(); font1.setBold(true); font1.setFontHeightInPoints((short) 12); font1.setFontName("宋体"); style1.setFont(font1); Cell cell2 = row.createCell(0); cell2.setCellValue("发文号:"); cell2.setCellStyle(style1); // 合并第1-3列 int startCol1 = 1; int endCol1 = 2; sheet.addMergedRegion(new CellRangeAddress(firow, firow, startCol1, endCol1)); // 设置所有合并单元格的样式 for (int col = startCol1; col <= endCol1; col++) { Cell mergedCell = row.createCell(col); mergedCell.setCellStyle(style1); } // 只在起始单元格设置数据 CellStyle style2 = wb.createCellStyle(); style2.setAlignment(HorizontalAlignment.LEFT); style2.setVerticalAlignment(VerticalAlignment.TOP); Font font2 = wb.createFont(); font2.setFontHeightInPoints((short) 11); font2.setFontName("宋体"); style2.setFont(font2); Cell inquiryCell = row.getCell(startCol1); inquiryCell.setCellStyle(style2); inquiryCell.setCellValue(inquiryNumber); Cell cell1 = row.createCell(3); 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 = 4; 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); style2.setWrapText(true); // 启用自动换行 getCas.setCellStyle(style2); 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; row = sheet.createRow(firow); // 设置表头高度为43.2 row.setHeight((short)(43.2*20)); System.out.println("++++++++++++++++++++++++++---------++++++++++++"); System.out.println(firow); column = 0; } else { // 普通sheet处理 // recordId = (DocumentMaterialsVo)list.get(0) // recordId = (DocumentMaterialsVo)list.get(0) row = sheet.createRow(0); // 设置表头高度为43.2 row.setHeight((short)(43.2*20)); column = 0; } // // 产生一行 @@ -402,19 +518,46 @@ //写入签名 System.out.println(list.get(0).getDataset().size()+"aaaaaaaaaaaaaaaaaaa0999"); row = sheet.createRow(list.get(0).getDataset().size()+4); row = sheet.createRow(list.get(0).getDataset().size()+5); // CellStyle style4 = wb.createCellStyle(); Font font4 = wb.createFont(); font4.setBold(true); font4.setFontHeightInPoints((short) 12); font4.setFontName("宋体"); style4.setFont(font4); int in = 0 ; for(int i = 0; i < sigArr.size(); i++) { row.createCell(in).setCellValue(sigArr.get(i)); in = in + 3; for (String s : sigArr) { Cell clr = row.createCell(in); System.out.println(s); clr.setCellStyle(style4); clr.setCellValue(s); in = in + 2; } System.out.println(in); // row = sheet.createRow(0); // row = sheet.createRow(list.get(0).getDataset().size() + 7); //写入注释 for(int i = 0; i < arrAn.size();i++) { row = sheet.createRow(list.get(0).getDataset().size() + 5+i); int ri = list.get(0).getDataset().size() + 5+i; // System.out.println(arrAn.get(i)); row = sheet.createRow(list.get(0).getDataset().size() + 7+i); int ri = list.get(0).getDataset().size() + 7+i; sheet.addMergedRegion(new CellRangeAddress(ri, ri, 0, 3)); if(i==0) row.createCell(0).setCellValue("注: "+(i+1)+"、"+arrAn.get(i)); else row.createCell(0).setCellValue(" "+(i+1)+"、"+arrAn.get(i)); row.createCell(0).setCellValue(i+1+"、"+arrAn.get(i)); } } @@ -447,8 +590,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()); } @@ -549,7 +695,7 @@ style.setBorderBottom(BorderStyle.THIN); style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); Font dataFont = wb.createFont(); dataFont.setFontName("Arial"); dataFont.setFontName("宋体"); dataFont.setFontHeightInPoints((short) 10); style.setFont(dataFont); styles.put("data", style); @@ -562,7 +708,7 @@ String key = StringUtils.format("header_{}_{}", excel.headerColor(), excel.headerBackgroundColor()); if (!headerStyles.containsKey(key)) { style = wb.createCellStyle(); style = wb.createCellStyle(); style.cloneStyleFrom(styles.get("data")); style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); @@ -574,9 +720,9 @@ style.setFillPattern(FillPatternType.SOLID_FOREGROUND); }*/ Font headerFont = wb.createFont(); headerFont.setFontName("Arial"); headerFont.setFontHeightInPoints((short) 10); headerFont.setBold(false); headerFont.setFontName("宋体"); headerFont.setFontHeightInPoints((short) 11); headerFont.setBold(true); headerFont.setColor(excel.headerColor().index); style.setFont(headerFont); headerStyles.put(key, style); @@ -590,7 +736,7 @@ // 设置单元格内容自动换行 style.setWrapText(true); Font totalFont = wb.createFont(); totalFont.setFontName("Arial"); totalFont.setFontName("宋体"); totalFont.setFontHeightInPoints((short) 10); style.setFont(totalFont); styles.put("total", style); @@ -647,7 +793,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 +840,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 +897,7 @@ } /** * 设置 POI HSSFSheet 单元格提示 * 设置单元格提示 * * @param sheet 表单 * @param promptTitle 提示标题 @@ -761,7 +907,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 +929,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 +938,7 @@ // 数据有效性对象 DataValidation dataValidation = helper.createValidation(constraint, regions); // 处理Excel兼容性问题 if (dataValidation instanceof HSSFDataValidation) { if (dataValidation instanceof XSSFDataValidation) { dataValidation.setSuppressDropDownArrow(false); dataValidation.setShowErrorBox(true); } @@ -991,7 +1137,7 @@ * 创建一个工作簿 */ public void createWorkbook() { this.wb = new HSSFWorkbook(); this.wb = new XSSFWorkbook(); } /** @@ -1060,4 +1206,19 @@ } return val; } } }