web检测报告导出修改

This commit is contained in:
cwchen 2024-09-28 15:29:52 +08:00
parent f8fb10700c
commit e3742a8db3
5 changed files with 607 additions and 302 deletions

View File

@ -123,4 +123,22 @@ public interface TestReportManageDao {
* @return
*/
TestReportManageDto downloadCertificateList(TestReportManageDto data);
/**
* 获取基本信息
* @param id
* @return Map<String,Object>
* @author cwchen
* @date 2024/9/28 14:40
*/
Map<String, String> getBasicInfoMap(Long id);
/**
* 获取签名图片
* @param id
* @return List<String>
* @author cwchen
* @date 2024/9/28 15:09
*/
List<String> getSignImgs(Long id);
}

View File

@ -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<ConfigItemsVo> configItemsVos = bean.getConfigItemsVos();
for (ConfigItemsVo configItemsVo : configItemsVos){
List<ConfigItemVo> itemList = configItemsVo.getItemList();
trendsNum += itemList.size();
}
List<ExperBasisVo> 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<ExperDevVo> devList=bean.getExperDevVos();
try {
//先计算出总共有多少列和动态生成的有多少列
//总列数
int totalNum = 0;
//动态生成的列数
int trendsNum = 0;
//获取所有检测项目
List<ConfigItemsVo> configItemsVos = bean.getConfigItemsVos();
for (ConfigItemsVo configItemsVo : configItemsVos){
List<ConfigItemVo> itemList = configItemsVo.getItemList();
trendsNum += itemList.size();
}
List<ExperBasisVo> 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<ExperDevVo> 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<ConfigItemVo> 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<ConfigItemVo> 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();
}

View File

@ -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<String, String> 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<ExperBasisVo> 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<String, Object>
* @author cwchen
* @date 2024/9/28 14:40
*/
public Map<String, String> getBasicData(Long id) {
Map<String, String> mapData = null;
try {
mapData = testReportManageDao.getBasicInfoMap(id);
List<String> 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;
}
}

View File

@ -276,4 +276,43 @@
GROUP BY ted.exper_id
LIMIT 1
</select>
<!--获取基本信息-->
<select id="getBasicInfoMap" resultType="java.util.Map">
SELECT te.id AS id,
tc.custom_name AS customName
FROM tb_exper te
LEFT JOIN tb_sample ts ON te.sample_id = ts.id
LEFT JOIN tb_custom tc ON ts.custom_id = tc.id
WHERE te.id = #{id}
LIMIT 1
</select>
<!--获取签名图片 审核人 审批人 主检人-->
<select id="getSignImgs" resultType="java.lang.String">
(
SELECT IFNULL(su.sign_img,'')
FROM tb_audit_history tah
LEFT JOIN sys_user su ON tah.audit_user_id = su.id
WHERE tah.exper_id = #{id} AND tah.audit_status = 1 AND tah.audit_type = 2
ORDER BY audit_time DESC
LIMIT 1
)
UNION ALL
(
SELECT IFNULL(su.sign_img,'')
FROM tb_audit_history tah
LEFT JOIN sys_user su ON tah.audit_user_id = su.id
WHERE tah.exper_id = #{id} AND tah.audit_status = 1 AND tah.audit_type = 3
ORDER BY audit_time DESC
LIMIT 1
)
UNION ALL
(
SELECT IFNULL(su.sign_img,'')
FROM tb_exper te
LEFT JOIN sys_user su ON te.update_user = su.id
WHERE te.id = #{id} AND te.del_flag = 0
ORDER BY audit_time DESC
LIMIT 1
)
</select>
</mapper>

Binary file not shown.