diff --git a/src/main/java/com/bonus/aqgqj/basis/dao/TestReportManageDao.java b/src/main/java/com/bonus/aqgqj/basis/dao/TestReportManageDao.java index bb138cb..486d92b 100644 --- a/src/main/java/com/bonus/aqgqj/basis/dao/TestReportManageDao.java +++ b/src/main/java/com/bonus/aqgqj/basis/dao/TestReportManageDao.java @@ -123,4 +123,22 @@ public interface TestReportManageDao { * @return */ TestReportManageDto downloadCertificateList(TestReportManageDto data); + + /** + * 获取基本信息 + * @param id + * @return Map + * @author cwchen + * @date 2024/9/28 14:40 + */ + Map getBasicInfoMap(Long id); + + /** + * 获取签名图片 + * @param id + * @return List + * @author cwchen + * @date 2024/9/28 15:09 + */ + List getSignImgs(Long id); } diff --git a/src/main/java/com/bonus/aqgqj/basis/service/impl/TestReportManageServiceImpl.java b/src/main/java/com/bonus/aqgqj/basis/service/impl/TestReportManageServiceImpl.java index 5be7d49..dd69fc2 100644 --- a/src/main/java/com/bonus/aqgqj/basis/service/impl/TestReportManageServiceImpl.java +++ b/src/main/java/com/bonus/aqgqj/basis/service/impl/TestReportManageServiceImpl.java @@ -24,16 +24,12 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; +import java.io.*; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import java.util.zip.ZipOutputStream; -import java.io.ByteArrayOutputStream; import java.util.zip.ZipEntry; /** @@ -48,6 +44,9 @@ public class TestReportManageServiceImpl implements TestReportManageService { @Resource private TestReportManageDao testReportManageDao; + @Resource(name = "CreateSheetUtil") + private CreateSheetUtil createSheetUtil; + /** * 查询列表 * @param bean @@ -238,324 +237,361 @@ public class TestReportManageServiceImpl implements TestReportManageService { * 生成检测报告 */ public void generateReport(TestReportManageDto bean,ZipOutputStream zos) throws IOException { - //先计算出总共有多少列和动态生成的有多少列 - //总列数 - int totalNum = 0; - //动态生成的列数 - int trendsNum = 0; - //获取所有检测项目 - List configItemsVos = bean.getConfigItemsVos(); - for (ConfigItemsVo configItemsVo : configItemsVos){ - List itemList = configItemsVo.getItemList(); - trendsNum += itemList.size(); - } - List basisVos = bean.getBasisVos(); - String yj=""; - for (int i = 0; i < basisVos.size(); i++){ - yj+=(i + 1)+"、"+basisVos.get(i).getBasisName() + "\n"; - } - totalNum = trendsNum + 6; - List devList=bean.getExperDevVos(); + try { + //先计算出总共有多少列和动态生成的有多少列 + //总列数 + int totalNum = 0; + //动态生成的列数 + int trendsNum = 0; + //获取所有检测项目 + List configItemsVos = bean.getConfigItemsVos(); + for (ConfigItemsVo configItemsVo : configItemsVos){ + List itemList = configItemsVo.getItemList(); + trendsNum += itemList.size(); + } + List basisVos = bean.getBasisVos(); + String yj=""; + for (int i = 0; i < basisVos.size(); i++){ + yj+=(i + 1)+"、"+basisVos.get(i).getBasisName() + "\n"; + } + totalNum = trendsNum + 6; + List devList=bean.getExperDevVos(); + XSSFWorkbook workbook = new XSSFWorkbook(); +// Sheet sheet = workbook.createSheet("检测报告"); + /*******处理检测报告start******/ + // 模板xlsx文件 + XSSFWorkbook wb = null; + InputStream inputSteam = createSheetUtil.getInputSteam(); + if(inputSteam!=null){ + wb = new XSSFWorkbook(inputSteam); + } + Sheet oneSheet = null,twoSheet = null,sheet = null,fourSheet = null; + if(wb!=null){ + sheet = wb.createSheet(); + wb.removeSheetAt(2); + wb.setSheetName(3, bean.getSampleTools()); + wb.cloneSheet(2); + wb.removeSheetAt(2); + wb.setSheetName(3, "封底"); + createSheetUtil.handleOneSheetData(wb.getSheetAt(0),bean); + createSheetUtil.handleTwoSheetData(wb,wb.getSheetAt(1),bean); + }else{ + oneSheet = workbook.createSheet(); + twoSheet = workbook.createSheet(); + sheet = workbook.createSheet(); + fourSheet = workbook.createSheet(); + workbook.setSheetName(0, "封页1"); + workbook.setSheetName(1, "封页2"); + workbook.setSheetName(2, bean.getSampleTools()); + workbook.setSheetName(3, "封底"); + } + /*******处理检测报告end******/ - XSSFWorkbook workbook = new XSSFWorkbook(); - Sheet sheet = workbook.createSheet("检测报告"); + // 创建样式 + XSSFCellStyle style = wb !=null?wb.createCellStyle():workbook.createCellStyle(); + style.setBorderTop(BorderStyle.THIN); + style.setBorderBottom(BorderStyle.THIN); + style.setBorderLeft(BorderStyle.THIN); + style.setBorderRight(BorderStyle.THIN); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + + // 设置每列的宽度为20个字符的宽度 + int widthInCharacters = 15; + int columnCount = totalNum; + + for (int i = 0; i < columnCount; i++) { + // 1/256字符的宽度单位 + sheet.setColumnWidth(i, widthInCharacters * 256); + } + + //第一行 + Row row1 = sheet.createRow(0); + //单元格-创建第一个头 + Cell cell11 = row1.createCell(0); + cell11.setCellValue(bean.getSampleTools()+"检测报告附页"); + //合并全部列 + addMergedRegion(0,0,0,totalNum-1,sheet); + // 应用边框到合并区域 + applyBordersToMergedRegion(sheet, new CellRangeAddress(0, 0, 0, totalNum-1), style); + cell11.setCellStyle(style); - // 创建样式 - XSSFCellStyle style = workbook.createCellStyle(); - style.setBorderTop(BorderStyle.THIN); - style.setBorderBottom(BorderStyle.THIN); - style.setBorderLeft(BorderStyle.THIN); - style.setBorderRight(BorderStyle.THIN); - style.setAlignment(HorizontalAlignment.CENTER); - style.setVerticalAlignment(VerticalAlignment.CENTER); + //第二行 + Row row2 = sheet.createRow(1); + Cell cell21 = row2.createCell(0); + cell21.setCellValue("报告编号"); + cell21.setCellStyle(style); + //计算占用行数 + int num21=(totalNum-4)/2; + Cell cell22 = row2.createCell(1); + addMergedRegion(1,1,1,num21,sheet); + // 应用边框到合并区域 + applyBordersToMergedRegion(sheet, new CellRangeAddress(1, 1, 1, num21), style); + cell22.setCellValue(bean.getReportCode()); + cell22.setCellStyle(style); - // 设置每列的宽度为20个字符的宽度 - int widthInCharacters = 15; - int columnCount = totalNum; + Cell cell23 = row2.createCell(num21+1); + cell23.setCellValue("收样日期"); + cell23.setCellStyle(style); - for (int i = 0; i < columnCount; i++) { - // 1/256字符的宽度单位 - sheet.setColumnWidth(i, widthInCharacters * 256); - } + Cell cell24 = row2.createCell(num21+2); + cell24.setCellValue(bean.getCollectSamplesTime()); + addMergedRegion(1,1,num21+2,totalNum-3,sheet); + // 应用边框到合并区域 + applyBordersToMergedRegion(sheet, new CellRangeAddress(1,1,num21+2,totalNum-3), style); + cell24.setCellStyle(style); - //第一行 - Row row1 = sheet.createRow(0); - //单元格-创建第一个头 - Cell cell11 = row1.createCell(0); - cell11.setCellValue(bean.getSampleTools()+"检测报告附页"); - //合并全部列 - addMergedRegion(0,0,0,totalNum-1,sheet); - // 应用边框到合并区域 - applyBordersToMergedRegion(sheet, new CellRangeAddress(0, 0, 0, totalNum-1), style); - cell11.setCellStyle(style); + Cell cell25 = row2.createCell(totalNum-2); + cell25.setCellValue("样品数量"); + cell25.setCellStyle(style); + + Cell cell26= row2.createCell(totalNum-1); + cell26.setCellValue(bean.getDevNum()); + cell26.setCellStyle(style); - //第二行 - Row row2 = sheet.createRow(1); - Cell cell21 = row2.createCell(0); - cell21.setCellValue("报告编号"); - cell21.setCellStyle(style); - //计算占用行数 - int num21=(totalNum-4)/2; - Cell cell22 = row2.createCell(1); - addMergedRegion(1,1,1,num21,sheet); - // 应用边框到合并区域 - applyBordersToMergedRegion(sheet, new CellRangeAddress(1, 1, 1, num21), style); - cell22.setCellValue(bean.getReportCode()); - cell22.setCellStyle(style); + //第三行 + Row row3 = sheet.createRow(2); + Cell cell31 = row3.createCell(0); + cell31.setCellValue("检测设备"); + cell31.setCellStyle(style); - Cell cell23 = row2.createCell(num21+1); - cell23.setCellValue("收样日期"); - cell23.setCellStyle(style); - - Cell cell24 = row2.createCell(num21+2); - cell24.setCellValue(bean.getCollectSamplesTime()); - addMergedRegion(1,1,num21+2,totalNum-3,sheet); - // 应用边框到合并区域 - applyBordersToMergedRegion(sheet, new CellRangeAddress(1,1,num21+2,totalNum-3), style); - cell24.setCellStyle(style); - - Cell cell25 = row2.createCell(totalNum-2); - cell25.setCellValue("样品数量"); - cell25.setCellStyle(style); - - Cell cell26= row2.createCell(totalNum-1); - cell26.setCellValue(bean.getDevNum()); - cell26.setCellStyle(style); + Cell cell32 = row3.createCell(1); + cell32.setCellValue(bean.getDevTypeName()); + cell32.setCellStyle(style); + addMergedRegion(2,2,1,totalNum-1,sheet); + // 应用边框到合并区域 + applyBordersToMergedRegion(sheet, new CellRangeAddress(2,2,1,totalNum-1), style); - //第三行 - Row row3 = sheet.createRow(2); - Cell cell31 = row3.createCell(0); - cell31.setCellValue("检测设备"); - cell31.setCellStyle(style); + //第四行 + Row row4= sheet.createRow(3); - Cell cell32 = row3.createCell(1); - cell32.setCellValue(bean.getDevTypeName()); - cell32.setCellStyle(style); - addMergedRegion(2,2,1,totalNum-1,sheet); - // 应用边框到合并区域 - applyBordersToMergedRegion(sheet, new CellRangeAddress(2,2,1,totalNum-1), style); + Cell cell41 = row4.createCell(0); + cell41.setCellValue("检测依据"); + cell41.setCellStyle(style); + Cell cell42 = row4.createCell(1); + cell42.setCellValue(yj); + cell42.setCellStyle(style); + addMergedRegion(3,3,1,totalNum-1,sheet); + // 应用边框到合并区域 + applyBordersToMergedRegion(sheet, new CellRangeAddress(3,3,1,totalNum-1), style); + //第5行 //第六行 + Row row5= sheet.createRow(4); + Row row6= sheet.createRow(5); + //第五行//第六号合并 + Cell cell51 = row5.createCell(0); + cell51.setCellValue("序号"); + cell51.setCellStyle(style); + addMergedRegion(4,5,0,0,sheet); + // 应用边框到合并区域 + applyBordersToMergedRegion(sheet, new CellRangeAddress(4,5,0,0), style); - //第四行 - Row row4= sheet.createRow(3); - - Cell cell41 = row4.createCell(0); - cell41.setCellValue("检测依据"); - cell41.setCellStyle(style); - - Cell cell42 = row4.createCell(1); - cell42.setCellValue(yj); - cell42.setCellStyle(style); - addMergedRegion(3,3,1,totalNum-1,sheet); - // 应用边框到合并区域 - applyBordersToMergedRegion(sheet, new CellRangeAddress(3,3,1,totalNum-1), style); - - //第5行 //第六行 - Row row5= sheet.createRow(4); - Row row6= sheet.createRow(5); - //第五行//第六号合并 - Cell cell51 = row5.createCell(0); - cell51.setCellValue("序号"); - cell51.setCellStyle(style); - addMergedRegion(4,5,0,0,sheet); - // 应用边框到合并区域 - applyBordersToMergedRegion(sheet, new CellRangeAddress(4,5,0,0), style); - - Cell cell52 = row5.createCell(1); - cell52.setCellValue("样品编号"); - cell52.setCellStyle(style); - addMergedRegion(4,5,1,1,sheet); - //应用边框到合并区域 - applyBordersToMergedRegion(sheet, new CellRangeAddress(4,5,1,1), style); - Cell cell53 = row5.createCell(2); - cell53.setCellValue("样品信息"); - cell53.setCellStyle(style); - addMergedRegion(4,4,2,5,sheet); - //应用边框到合并区域 - applyBordersToMergedRegion(sheet, new CellRangeAddress(4,4,2,5), style); - //第六行固定数据 - Cell cell62= row6.createCell(2); - cell62.setCellStyle(style); - cell62.setCellValue("客户自编号"); - Cell cell63 = row6.createCell(3); - cell63.setCellStyle(style); - cell63.setCellValue("生成厂家"); - Cell cell64 = row6.createCell(4); - cell64.setCellStyle(style); - cell64.setCellValue("生产日期"); - Cell cell65 = row6.createCell(5); - cell65.setCellStyle(style); - cell65.setCellValue("规格型号"); - - //第五第六号非固定数据 - AtomicInteger num= new AtomicInteger(5); - AtomicInteger rowNums= new AtomicInteger(5); - configItemsVos.forEach(vo->{ - List childList=vo.getItemList(); - int rowNum=childList.size(); - num.set(num.get() + 1); - Cell cell54 = row5.createCell(num.get()); - cell54.setCellValue(vo.getExperTypeName()); - cell54.setCellStyle(style); - addMergedRegion(4,4,num.get(),num.get()+rowNum-1,sheet); + Cell cell52 = row5.createCell(1); + cell52.setCellValue("样品编号"); + cell52.setCellStyle(style); + addMergedRegion(4,5,1,1,sheet); //应用边框到合并区域 - applyBordersToMergedRegion(sheet, new CellRangeAddress(4,4,num.get(),num.get()+rowNum-1), style); - num.addAndGet(rowNum-1); - childList.forEach(child->{ - rowNums.set(rowNums.get() + 1); - Cell cell4 = row6.createCell(rowNums.get()); - cell4.setCellStyle(style); - cell4.setCellValue(child.getItemName()); - }); - }); + applyBordersToMergedRegion(sheet, new CellRangeAddress(4,5,1,1), style); + Cell cell53 = row5.createCell(2); + cell53.setCellValue("样品信息"); + cell53.setCellStyle(style); + addMergedRegion(4,4,2,5,sheet); + //应用边框到合并区域 + applyBordersToMergedRegion(sheet, new CellRangeAddress(4,4,2,5), style); + //第六行固定数据 + Cell cell62= row6.createCell(2); + cell62.setCellStyle(style); + cell62.setCellValue("客户自编号"); + Cell cell63 = row6.createCell(3); + cell63.setCellStyle(style); + cell63.setCellValue("生成厂家"); + Cell cell64 = row6.createCell(4); + cell64.setCellStyle(style); + cell64.setCellValue("生产日期"); + Cell cell65 = row6.createCell(5); + cell65.setCellStyle(style); + cell65.setCellValue("规格型号"); - AtomicInteger row = new AtomicInteger(5); - AtomicInteger cellNum = new AtomicInteger(0); - AtomicInteger serialNumber = new AtomicInteger(1); // 用于追踪序号 - - if (ListHelper.isNotEmpty(devList)) { - devList.forEach(dev -> { - row.set(row.get() + 1); - cellNum.set(0); // 每次处理新行时重置 cellNum - - Row row7 = sheet.createRow(row.get()); - - // 创建序号列 - Cell row71 = row7.createCell(cellNum.get()); - row71.setCellValue(serialNumber.get()); // 设置序号 - row71.setCellStyle(style); - cellNum.set(cellNum.get() + 1); - - // 更新序号 - serialNumber.set(serialNumber.get() + 1); - - // 处理其他列 - Cell row72 = row7.createCell(cellNum.get()); - row72.setCellValue(dev.getCustomerCode()); - row72.setCellStyle(style); - cellNum.set(cellNum.get() + 1); - - Cell row73 = row7.createCell(cellNum.get()); - row73.setCellValue(dev.getDevCode()); - row73.setCellStyle(style); - cellNum.set(cellNum.get() + 1); - - Cell row74 = row7.createCell(cellNum.get()); - row74.setCellValue(dev.getManufacturer()); - row74.setCellStyle(style); - cellNum.set(cellNum.get() + 1); - - Cell row75 = row7.createCell(cellNum.get()); - row75.setCellValue(dev.getManufactureDate()); - row75.setCellStyle(style); - cellNum.set(cellNum.get() + 1); - - Cell row76 = row7.createCell(cellNum.get()); - row76.setCellValue(dev.getDevModule()); - row76.setCellStyle(style); - cellNum.set(cellNum.get() + 1); - - String val = dev.getDevData(); - JSONArray jsonArray = JSON.parseArray(val); - - jsonArray.forEach(json -> { - Cell row77 = row7.createCell(cellNum.get()); - row77.setCellValue(json.toString()); - row77.setCellStyle(style); - cellNum.set(cellNum.get() + 1); + //第五第六号非固定数据 + AtomicInteger num= new AtomicInteger(5); + AtomicInteger rowNums= new AtomicInteger(5); + for (ConfigItemsVo vo : configItemsVos) { + List childList=vo.getItemList(); + int rowNum=childList.size(); + num.set(num.get() + 1); + Cell cell54 = row5.createCell(num.get()); + cell54.setCellValue(vo.getExperTypeName()); + cell54.setCellStyle(style); + addMergedRegion(4,4,num.get(),num.get()+rowNum-1,sheet); + //应用边框到合并区域 + applyBordersToMergedRegion(sheet, new CellRangeAddress(4,4,num.get(),num.get()+rowNum-1), style); + num.addAndGet(rowNum-1); + childList.forEach(child->{ + rowNums.set(rowNums.get() + 1); + Cell cell4 = row6.createCell(rowNums.get()); + cell4.setCellStyle(style); + cell4.setCellValue(child.getItemName()); }); - }); + } + + AtomicInteger row = new AtomicInteger(5); + AtomicInteger cellNum = new AtomicInteger(0); + AtomicInteger serialNumber = new AtomicInteger(1); // 用于追踪序号 + + if (ListHelper.isNotEmpty(devList)) { + for (ExperDevVo dev : devList) { + row.set(row.get() + 1); + cellNum.set(0); // 每次处理新行时重置 cellNum + + Row row7 = sheet.createRow(row.get()); + + // 创建序号列 + Cell row71 = row7.createCell(cellNum.get()); + row71.setCellValue(serialNumber.get()); // 设置序号 + row71.setCellStyle(style); + cellNum.set(cellNum.get() + 1); + + // 更新序号 + serialNumber.set(serialNumber.get() + 1); + + // 处理其他列 + Cell row72 = row7.createCell(cellNum.get()); + row72.setCellValue(dev.getCustomerCode()); + row72.setCellStyle(style); + cellNum.set(cellNum.get() + 1); + + Cell row73 = row7.createCell(cellNum.get()); + row73.setCellValue(dev.getDevCode()); + row73.setCellStyle(style); + cellNum.set(cellNum.get() + 1); + + Cell row74 = row7.createCell(cellNum.get()); + row74.setCellValue(dev.getManufacturer()); + row74.setCellStyle(style); + cellNum.set(cellNum.get() + 1); + + Cell row75 = row7.createCell(cellNum.get()); + row75.setCellValue(dev.getManufactureDate()); + row75.setCellStyle(style); + cellNum.set(cellNum.get() + 1); + + Cell row76 = row7.createCell(cellNum.get()); + row76.setCellValue(dev.getDevModule()); + row76.setCellStyle(style); + cellNum.set(cellNum.get() + 1); + + String val = dev.getDevData(); + JSONArray jsonArray = JSON.parseArray(val); + + jsonArray.forEach(json -> { + Cell row77 = row7.createCell(cellNum.get()); + row77.setCellValue(json.toString()); + row77.setCellStyle(style); + cellNum.set(cellNum.get() + 1); + }); + } + } + // + row.set(row.get() + 1); + Row row8= sheet.createRow(row.get()); + Cell cell81 = row8.createCell(0); + cell81.setCellValue("技术要求"); + cell81.setCellStyle(style); + + Cell cell82 = row8.createCell(1); + cell82.setCellValue(bean.getExperStand()); + cell82.setCellStyle(style); + addMergedRegion(row.get(),row.get(),1,totalNum-1,sheet); + //应用边框到合并区域 + applyBordersToMergedRegion(sheet, new CellRangeAddress(row.get(),row.get(),1,totalNum-1), style); + + + row.set(row.get() + 1); + Row row9= sheet.createRow(row.get()); + + Cell cell91 = row9.createCell(0); + cell91.setCellValue("检测结论"); + cell91.setCellStyle(style); + + Cell cell92 = row9.createCell(1); + cell92.setCellValue(bean.getExperConclu()); + cell92.setCellStyle(style); + addMergedRegion(row.get(),row.get(),1,totalNum-1,sheet); + //应用边框到合并区域 + applyBordersToMergedRegion(sheet, new CellRangeAddress(row.get(),row.get(),1,totalNum-1), style); + + + row.set(row.get() + 1); + Row row10= sheet.createRow(row.get()); + + Cell cell101 = row10.createCell(0); + cell101.setCellValue("备注"); + cell101.setCellStyle(style); + + Cell cell102 = row10.createCell(1); + cell102.setCellValue(bean.getRemarks()); + cell102.setCellStyle(style); + addMergedRegion(row.get(),row.get(),1,totalNum-1,sheet); + //应用边框到合并区域 + applyBordersToMergedRegion(sheet, new CellRangeAddress(row.get(),row.get(),1,totalNum-1), style); + + + row.set(row.get() + 1); + Row row11= sheet.createRow(row.get()); + + Cell cell111 = row11.createCell(0); + cell111.setCellValue("检测日期"); + cell111.setCellStyle(style); + + Cell cell112 = row11.createCell(1); + cell112.setCellValue(bean.getExperTime()); + cell112.setCellStyle(style); + int num112=(totalNum-2)/2; + addMergedRegion(row.get(),row.get(),1,num112,sheet); + //应用边框到合并区域 + applyBordersToMergedRegion(sheet, new CellRangeAddress(row.get(),row.get(),1,num112), style); + + Cell cell113 = row11.createCell(num112+1); + cell113.setCellValue("下次检测日期"); + cell113.setCellStyle(style); + + Cell cell114= row11.createCell(num112+2); + cell114.setCellValue(bean.getNextExperTime()); + cell114.setCellStyle(style); + addMergedRegion(row.get(),row.get(),num112+2,totalNum-1,sheet); + //应用边框到合并区域 + applyBordersToMergedRegion(sheet, new CellRangeAddress(row.get(),row.get(),num112+2,totalNum-1), style); + + + // 保存到 ZIP 文件 + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + if(wb!=null){ + wb.write(baos); + }else{ + workbook.write(baos); + } + if (StringHelper.isNotEmpty(bean.getReportCode())){ + //将字符串中“ML/BG-”去除 + bean.setReportCode(bean.getReportCode().replace("ML/BG-","")); + } + ZipEntry entry = new ZipEntry("检测报告_" + bean.getReportCode() + "_"+DateTimeHelper.getNowDMS()+".xlsx"); + zos.putNextEntry(entry); + zos.write(baos.toByteArray()); + zos.closeEntry(); + if(wb!=null){ + wb.close(); + }else{ + workbook.close(); + } + } catch (IOException e) { + log.error(e.toString(),e); } - // - row.set(row.get() + 1); - Row row8= sheet.createRow(row.get()); - Cell cell81 = row8.createCell(0); - cell81.setCellValue("技术要求"); - cell81.setCellStyle(style); - - Cell cell82 = row8.createCell(1); - cell82.setCellValue(bean.getExperStand()); - cell82.setCellStyle(style); - addMergedRegion(row.get(),row.get(),1,totalNum-1,sheet); - //应用边框到合并区域 - applyBordersToMergedRegion(sheet, new CellRangeAddress(row.get(),row.get(),1,totalNum-1), style); - - - row.set(row.get() + 1); - Row row9= sheet.createRow(row.get()); - - Cell cell91 = row9.createCell(0); - cell91.setCellValue("检测结论"); - cell91.setCellStyle(style); - - Cell cell92 = row9.createCell(1); - cell92.setCellValue(bean.getExperConclu()); - cell92.setCellStyle(style); - addMergedRegion(row.get(),row.get(),1,totalNum-1,sheet); - //应用边框到合并区域 - applyBordersToMergedRegion(sheet, new CellRangeAddress(row.get(),row.get(),1,totalNum-1), style); - - - row.set(row.get() + 1); - Row row10= sheet.createRow(row.get()); - - Cell cell101 = row10.createCell(0); - cell101.setCellValue("备注"); - cell101.setCellStyle(style); - - Cell cell102 = row10.createCell(1); - cell102.setCellValue(bean.getRemarks()); - cell102.setCellStyle(style); - addMergedRegion(row.get(),row.get(),1,totalNum-1,sheet); - //应用边框到合并区域 - applyBordersToMergedRegion(sheet, new CellRangeAddress(row.get(),row.get(),1,totalNum-1), style); - - - row.set(row.get() + 1); - Row row11= sheet.createRow(row.get()); - - Cell cell111 = row11.createCell(0); - cell111.setCellValue("检测日期"); - cell111.setCellStyle(style); - - Cell cell112 = row11.createCell(1); - cell112.setCellValue(bean.getExperTime()); - cell112.setCellStyle(style); - int num112=(totalNum-2)/2; - addMergedRegion(row.get(),row.get(),1,num112,sheet); - //应用边框到合并区域 - applyBordersToMergedRegion(sheet, new CellRangeAddress(row.get(),row.get(),1,num112), style); - - Cell cell113 = row11.createCell(num112+1); - cell113.setCellValue("下次检测日期"); - cell113.setCellStyle(style); - - Cell cell114= row11.createCell(num112+2); - cell114.setCellValue(bean.getNextExperTime()); - cell114.setCellStyle(style); - addMergedRegion(row.get(),row.get(),num112+2,totalNum-1,sheet); - //应用边框到合并区域 - applyBordersToMergedRegion(sheet, new CellRangeAddress(row.get(),row.get(),num112+2,totalNum-1), style); - - - // 保存到 ZIP 文件 - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - workbook.write(baos); - if (StringHelper.isNotEmpty(bean.getReportCode())){ - //将字符串中“ML/BG-”去除 - bean.setReportCode(bean.getReportCode().replace("ML/BG-","")); - } - ZipEntry entry = new ZipEntry("检测报告_" + bean.getReportCode() + "_"+DateTimeHelper.getNowDMS()+".xlsx"); - zos.putNextEntry(entry); - zos.write(baos.toByteArray()); - zos.closeEntry(); - workbook.close(); } diff --git a/src/main/java/com/bonus/aqgqj/utils/CreateSheetUtil.java b/src/main/java/com/bonus/aqgqj/utils/CreateSheetUtil.java new file mode 100644 index 0000000..6ddceba --- /dev/null +++ b/src/main/java/com/bonus/aqgqj/utils/CreateSheetUtil.java @@ -0,0 +1,212 @@ +package com.bonus.aqgqj.utils; + +import com.bonus.aqgqj.app.entity.TestReportManageAppVo; +import com.bonus.aqgqj.basis.dao.TestReportManageDao; +import com.bonus.aqgqj.basis.entity.dto.TestReportManageDto; +import com.bonus.aqgqj.basis.entity.vo.ExperBasisVo; +import com.bonus.aqgqj.basis.entity.vo.TestVo; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.util.IOUtils; +import org.apache.poi.xssf.usermodel.*; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.repository.init.ResourceReader; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.awt.image.BufferedImage; +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * @className:CreateSheetUtil + * @author:cwchen + * @date:2024-09-27-13:32 + * @version:1.0 + * @description:创建sheet页工具类 + */ +@Component(value = "CreateSheetUtil") +@Slf4j +public class CreateSheetUtil { + + @Resource + private TestReportManageDao testReportManageDao; + + @Value("${file.linux.upload_path}") + private String uploadPath; + + public InputStream getInputSteam() { + // 使用ClassLoader读取资源文件 + InputStream inputStream = null; + try { + inputStream = this.getClass().getClassLoader().getResourceAsStream("temple/model_excel.xlsx"); + // 确保inputStream不为null + if (inputStream != null) { + return inputStream; + } + } catch (Exception e) { + log.error(e.toString(), e); + } + return null; + } + + public void handleOneSheetData(Sheet sheet, TestReportManageDto vo) { + Cell cell = sheet.getRow(2).getCell(0); + Cell cell2 = sheet.getRow(9).getCell(2); + Cell cell3 = sheet.getRow(13).getCell(2); + cell.setCellValue(""); + cell2.setCellValue(vo.getSampleTools()); + cell3.setCellValue(""); +// System.err.println("数据:" + cell.getStringCellValue()); + /*for (Row row : sheet) { + + for (Cell cell : row) { + System.err.println(row.getRowNum()+"列:"+cell.getColumnIndex()+"数据:"+cell.getStringCellValue()); + } + }*/ + } + + public void handleTwoSheetData(XSSFWorkbook workbook, Sheet sheet, TestReportManageDto vo) { + for (Row row : sheet) { + for (Cell cells : row) { + System.err.println(row.getRowNum() + "列:" + cells.getColumnIndex() + "数据:" + cells.getStringCellValue()); + } + } + Map dataMap = getBasicData(Long.parseLong(vo.getId() + "")); + // 委托单位 + Cell cell = sheet.getRow(8).getCell(2); + cell.setCellValue(handleValue(dataMap.get("customName"))); + // 委托单位地址 + Cell cell2 = sheet.getRow(9).getCell(2); + cell2.setCellValue(""); + // 样品名称 + Cell cell3 = sheet.getRow(11).getCell(2); + cell3.setCellValue(vo.getSampleTools()); + // 样品特性和状态 + Cell cell4 = sheet.getRow(13).getCell(6); + // 到样日期 + Cell cell5 = sheet.getRow(14).getCell(2); + cell5.setCellValue(vo.getCollectSamplesTime().replaceAll("-", ".")); + // 检测日期 + Cell cell6 = sheet.getRow(14).getCell(6); + cell6.setCellValue(vo.getExperTime().replaceAll("-", ".")); + // 样品数量 + Cell cell7 = sheet.getRow(15).getCell(6); + cell7.setCellValue(vo.getDevNum() + ""); + // 检测依据 + Cell cell8 = sheet.getRow(16).getCell(2); + cell8.setCellValue(handleBasis(vo)); + // 检测结论 审核人 + Cell cell9 = sheet.getRow(17).getCell(2); + cell9.setCellValue(cell9.getStringCellValue().replace("该样品按DL/T 976-2017标准所检项目合格。", handleValue(vo.getExperConclu()))); + handlePicture(workbook, sheet, sheet.getRow(18), sheet.getRow(18).getCell(3), handleValue(dataMap.get("pzUrl"))); + // 备注 + Cell cell10 = sheet.getRow(19).getCell(2); + cell10.setCellValue(handleValue(vo.getRemarks())); + // 主检人 编制人 审核人 + Cell cell11 = sheet.getRow(21).getCell(2); + Cell cell12 = sheet.getRow(21).getCell(4); + Cell cell13 = sheet.getRow(21).getCell(6); + handlePicture(workbook, sheet, sheet.getRow(21), cell11, handleValue(dataMap.get("zjUrl"))); + handlePicture(workbook, sheet, sheet.getRow(21), cell12, handleValue(dataMap.get("bzUrl"))); + handlePicture(workbook, sheet, sheet.getRow(21), cell13, handleValue(dataMap.get("shUrl"))); + } + + /** + * 设置检测依据值 + * + * @param dto + * @return String + * @author cwchen + * @date 2024/9/27 18:12 + */ + public static String handleBasis(TestReportManageDto dto) { + List basisVos = dto.getBasisVos(); + if (CollectionUtils.isNotEmpty(basisVos)) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < basisVos.size(); i++) { + ExperBasisVo basisVo = basisVos.get(i); + if (i == basisVos.size() - 1) { + sb.append((i + 1)).append("、").append(basisVo.getBasisName()); + } else { + sb.append((i + 1)).append("、").append(basisVo.getBasisName()).append("\n"); + } + } + return sb.toString(); + } + return ""; + } + + public void handlePicture(XSSFWorkbook workbook, Sheet sheet, Row row, Cell cell, String filePath) { + if (!new File(uploadPath + filePath).exists()) { + return; + } + try { + // 创建一个图片单元格的引用 + CreationHelper createHelper = workbook.getCreationHelper(); + ClientAnchor anchor = createHelper.createClientAnchor(); + // 图片从哪一列开始 + anchor.setCol1(cell.getColumnIndex()); + // 图片从哪一行开始 + anchor.setRow1(row.getRowNum()); + // 图片从哪一列结束 + anchor.setCol2(cell.getColumnIndex() + 1); + // 图片从哪一行结束 + anchor.setRow2(row.getRowNum() + 1); + // 读取图片 + InputStream inputStream = Files.newInputStream(Paths.get(uploadPath + filePath)); + byte[] bytes = IOUtils.toByteArray(inputStream); + // 将图片添加到工作簿中 + int pictureIdx = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG); + Drawing drawing = sheet.createDrawingPatriarch(); + Picture picture = drawing.createPicture(anchor, pictureIdx); + picture.resize(1, 1); + } catch (IOException e) { + log.error(e.toString(), e); + } + } + + /** + * 获取基本信息 + * + * @param id + * @return Map + * @author cwchen + * @date 2024/9/28 14:40 + */ + public Map getBasicData(Long id) { + Map mapData = null; + try { + mapData = testReportManageDao.getBasicInfoMap(id); + List urlList = testReportManageDao.getSignImgs(id); + mapData.put("pzUrl", urlList.get(1)); + mapData.put("zjUrl", urlList.get(2)); + mapData.put("bzUrl", urlList.get(2)); + mapData.put("shUrl", urlList.get(0)); + } catch (Exception e) { + log.error(e.toString(), e); + } + return mapData; + } + + /** + * 空值处理 + * + * @param value + * @return String + * @author cwchen + * @date 2024/9/28 14:39 + */ + public String handleValue(String value) { + if (StringUtils.isEmpty(value)) { + return ""; + } + return value; + } +} diff --git a/src/main/resources/mappers/basis/TestReportManageMapper.xml b/src/main/resources/mappers/basis/TestReportManageMapper.xml index 37a38f3..e20c8fd 100644 --- a/src/main/resources/mappers/basis/TestReportManageMapper.xml +++ b/src/main/resources/mappers/basis/TestReportManageMapper.xml @@ -276,4 +276,43 @@ GROUP BY ted.exper_id LIMIT 1 + + + + \ No newline at end of file diff --git a/src/main/resources/temple/model_excel.xlsx b/src/main/resources/temple/model_excel.xlsx new file mode 100644 index 0000000..ae2ee99 Binary files /dev/null and b/src/main/resources/temple/model_excel.xlsx differ