package com.yuanchu.mom.utils; import cn.hutool.core.lang.UUID; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.ConfigureBuilder; import com.deepoove.poi.data.*; import com.deepoove.poi.data.style.*; import com.deepoove.poi.util.TableTools; import com.opencsv.CSVReader; import com.yuanchu.mom.dto.Exceldata; import com.yuanchu.mom.exception.ErrorException; import com.yuanchu.mom.mapper.InsOrderFileMapper; import com.yuanchu.mom.mapper.InsOrderMapper; import com.yuanchu.mom.mapper.InsSampleMapper; import com.yuanchu.mom.pojo.InsOrder; import com.yuanchu.mom.pojo.InsOrderFile; import com.yuanchu.mom.pojo.InsSample; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.poi.openxml4j.util.ZipSecureFile; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xwpf.usermodel.*; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.io.*; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @Component public class FuSheUtils { @Value("${wordUrl}") private String wordUrl; @Resource InsOrderFileMapper insOrderFileMapper; @Resource InsSampleMapper insSampleMapper; public void getFuSheWord1(String sonLaboratory, InsOrderFile insOrderFile) { //读取excel文件内容 String excelFilePath = wordUrl + "/" + insOrderFile.getFileUrl(); // 更新为你的文件路径 FileInputStream fileInputStream = null; Workbook workbook = null; try { fileInputStream = new FileInputStream(new File(excelFilePath)); workbook = new XSSFWorkbook(fileInputStream); // 对于 .xlsx 文件 XWPFDocument document = new XWPFDocument(); Exceldata exceldata = new Exceldata(); Map project = new HashMap<>(); HashMap datas1 = new HashMap<>(); Boolean exitLoop = false; for (int i = 0; i < workbook.getNumberOfSheets(); i++) { String s = ""; Sheet sheet = workbook.getSheetAt(i); String sheetName = sheet.getSheetName(); Map map1 = new HashMap<>(); Map datas = new HashMap<>(); List> list = new ArrayList<>(); for (Row row : sheet) { if (row.getRowNum() != 1) { HashMap map = new HashMap<>(); for (Cell cell : row) { if (row.getRowNum() == 0) { switch (cell.getCellType()) { case STRING: project.put(cell.getColumnIndex(), cell.getStringCellValue()); System.out.print(cell.getStringCellValue() + "\t"); break; case NUMERIC: System.out.print(cell.getNumericCellValue() + "\t"); break; case BOOLEAN: System.out.print(cell.getBooleanCellValue() + "\t"); break; case FORMULA: System.out.print(cell.getCellFormula() + "\t"); break; default: System.out.print("NULL\t"); } } else { switch (cell.getCellType()) { case STRING: if (cell.getColumnIndex() == 1) { exitLoop = true; break; } if (StringUtils.isNotEmpty(s)) { datas.put(s, list); } list = new ArrayList<>(); s = cell.getStringCellValue(); datas.put(s, cell.getStringCellValue()); System.out.print(cell.getStringCellValue() + "\t"); break; case NUMERIC: int columnIndex = cell.getColumnIndex(); Object o = project.get(columnIndex); map.put(o.toString(), cell.getNumericCellValue()); System.out.print(cell.getNumericCellValue() + "\t"); break; case BOOLEAN: System.out.print(cell.getBooleanCellValue() + "\t"); break; case FORMULA: System.out.print(cell.getCellFormula() + "\t"); break; default: System.out.print("NULL\t"); } } if (exitLoop) { exitLoop = false; break; } if (map.isEmpty()) { list.add(map); } } } } datas.put(s, list); map1.put(sheetName, datas); datas1.putAll(map1); } exceldata.setProject(project); exceldata.setDataRow(datas1); System.out.println(exceldata); HashMap map = new HashMap<>(); for (String s : datas1.keySet()) { Map>> numbers = (Map>>) datas1.get(s); for (String s1 : numbers.keySet()) { List> hashMaps = numbers.get(s1); List floatList = new ArrayList<>(); for (Map number : hashMaps) { number.put("端口", s1); Double o = (Double) number.get("频率"); if (o != null) { floatList.add(o); } } Double maxValue = Collections.max(floatList); Double minValue = Collections.min(floatList); if (map.get(minValue + "," + maxValue + "," + s) == null) { map.put(minValue + "," + maxValue + "," + s, s1); } else { Object o = map.get(minValue + "," + maxValue + "," + s); map.put(minValue + "," + maxValue + "," + s, s1 + "," + o); } } } System.out.println(map); int size = map.size(); for (String s1 : map.keySet()) { String o = map.get(s1).toString(); List collect = Arrays.stream(o.split(",")).collect(Collectors.toList()); int size1 = -1; for (String s : datas1.keySet()) { Map>> o1 = (Map>>) datas1.get(s); for (String s3 : o1.keySet()) { List> numbers = o1.get(s3); for (String s2 : collect) { if (s3.equals(s2)) { if (numbers.size() > size1) { size1 = numbers.size(); } } } map.put(s1, o + "," + size1); } } } System.out.println(map); createWord(sonLaboratory, document, exceldata, map, insOrderFile); } catch (IOException e) { e.printStackTrace(); } finally { // 关闭资源 try { if (workbook != null) { workbook.close(); } if (fileInputStream != null) { fileInputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } } public void getFuSheWord2(String sonLaboratory, InsOrderFile insOrderFile) { //读取excel文件内容 String excelFilePath = wordUrl + "/" + insOrderFile.getFileUrl(); // 更新为你的文件路径 FileInputStream fileInputStream = null; Workbook workbook = null; try { fileInputStream = new FileInputStream(new File(excelFilePath)); workbook = new XSSFWorkbook(fileInputStream); // 对于 .xlsx 文件 XWPFDocument document = new XWPFDocument(); Boolean exitLoop = false; for (int i = 0; i < workbook.getNumberOfSheets(); i++) { Exceldata exceldata = new Exceldata(); HashMap project = new HashMap<>(); HashMap biaozhun = new HashMap<>(); HashMap pingjunzhi = new HashMap<>(); HashMap datas1 = new HashMap<>(); HashMap map2 = new HashMap<>(); List> list = new ArrayList<>(); String jiaodu = ""; String port = ""; Integer count = 0; Sheet sheet = workbook.getSheetAt(i); Boolean biaoji = false; int lastRowNum = sheet.getLastRowNum(); for (Row row : sheet) { count++; HashMap map1 = new HashMap<>(); HashMap pingjun = new HashMap<>(); HashMap map = new HashMap<>(); for (Cell cell : row) { if (row.getRowNum() == 0) { switch (cell.getCellType()) { case STRING: project.put(cell.getColumnIndex(), cell.getStringCellValue()); System.out.print(cell.getStringCellValue() + "\t"); break; case NUMERIC: System.out.print(cell.getNumericCellValue() + "\t"); break; case BOOLEAN: System.out.print(cell.getBooleanCellValue() + "\t"); break; case FORMULA: System.out.print(cell.getCellFormula() + "\t"); break; default: System.out.print("NULL\t"); } } else if (row.getRowNum() == 1) { switch (cell.getCellType()) { case STRING: biaozhun.put(project.get(cell.getColumnIndex()).toString(), cell.getStringCellValue()); break; case NUMERIC: System.out.print(cell.getNumericCellValue() + "\t"); break; case BOOLEAN: System.out.print(cell.getBooleanCellValue() + "\t"); break; case FORMULA: System.out.print(cell.getCellFormula() + "\t"); break; default: System.out.print("NULL\t"); } } else if (row.getRowNum() > 2) { if (cell.getColumnIndex() == 0 && StringUtils.isNotEmpty(cell.getStringCellValue())) { if (map2.size() != 0) { map2.put(port, list); datas1.put(jiaodu, map2); map2 = new HashMap<>(); } datas1.put(cell.getStringCellValue(), ""); jiaodu = cell.getStringCellValue(); } else if (cell.getColumnIndex() == 1 && StringUtils.isNotEmpty(cell.getStringCellValue())) { if (list.size() != 0) { map2.put(port, list); list = new ArrayList<>(); } map2.put(cell.getStringCellValue(), ""); port = cell.getStringCellValue(); } else { switch (cell.getCellType()) { case STRING: String value = cell.getStringCellValue(); if (value.equals("avg")) { for (Cell cell1 : row) { switch (cell1.getCellType()) { case STRING: break; case NUMERIC: pingjun.put(project.get(cell1.getColumnIndex()).toString(), cell1.getNumericCellValue()); System.out.print(cell1.getNumericCellValue() + "\t"); break; case BOOLEAN: System.out.print(cell1.getBooleanCellValue() + "\t"); break; case FORMULA: String cellFormula = cell1.getCellFormula(); Double numericCellValue = cell1.getNumericCellValue(); pingjun.put(project.get(cell1.getColumnIndex()).toString(), cell1.getNumericCellValue()); System.out.print(cellFormula); break; default: System.out.print("NULL\t"); } } } else { biaoji = true; } break; case NUMERIC: map1.put(project.get(cell.getColumnIndex()).toString(), cell.getNumericCellValue()); System.out.print(cell.getNumericCellValue() + "\t"); break; case BOOLEAN: System.out.print(cell.getBooleanCellValue() + "\t"); break; case FORMULA: System.out.print(cell.getCellFormula() + "\t"); break; default: System.out.print("NULL\t"); } } } if (biaoji) { biaoji = false; break; } } if (map1.size() != 0) { list.add(map1); } if (pingjun.size() != 0) { pingjunzhi.put(jiaodu, pingjun); } if (count == lastRowNum + 1) { map2.put(port, list); datas1.put(jiaodu, map2); } System.out.println(); } exceldata.setProject(project); exceldata.setDataRow(datas1); System.out.println(exceldata); HashMap map = new HashMap<>(); for (String s : datas1.keySet()) { Map>> numbers = (Map>>) datas1.get(s); for (String s1 : numbers.keySet()) { List> hashMaps = numbers.get(s1); List floatList = new ArrayList<>(); for (Map number : hashMaps) { number.put("端口", s1); Double o = (Double) number.get("测试频率(MHZ)"); floatList.add(o.intValue()); } Integer maxValue = Collections.max(floatList); Integer minValue = Collections.min(floatList); if (map.get(minValue + "-" + maxValue + "-" + s) == null) { map.put(minValue + "-" + maxValue + "-" + s, s1); } else { Object o = map.get(minValue + "-" + maxValue + "-" + s); map.put(minValue + "-" + maxValue + "-" + s, s1 + "," + o); } } } System.out.println(map); int size = map.size(); for (String s1 : map.keySet()) { String o = map.get(s1).toString(); List collect = Arrays.stream(o.split(",")).collect(Collectors.toList()); int size1 = -1; for (String s : datas1.keySet()) { Map>> o1 = (Map>>) datas1.get(s); for (String s3 : o1.keySet()) { List> numbers = o1.get(s3); for (String s2 : collect) { if (s3.equals(s2)) { if (numbers.size() > size1) { size1 = numbers.size(); } } } map.put(s1, o + "," + size1); } } } System.out.println(map); createWord2(sonLaboratory, document, exceldata, map, pingjunzhi, biaozhun, insOrderFile); } // 输出到文件 InsSample insSample = insSampleMapper.selectById(insOrderFile.getInsSampleId()); String[] split = insOrderFile.getFileName().split("\\."); String name = insOrderFile.getFileName().replace("#", "&").substring(0, (insOrderFile.getFileName().length() - split[split.length - 1].length())); String url = UUID.randomUUID() + "_" + insSample.getSampleCode() + "&" + sonLaboratory + name + "解析的辐射站点报告.docx"; url.replace("#", "&"); FileOutputStream out = new FileOutputStream(wordUrl + "/" + url); document.write(out); out.close(); document.close(); InsOrderFile orderFile = new InsOrderFile(); orderFile.setInsOrderId(insOrderFile.getInsOrderId()); orderFile.setInsSampleId(insOrderFile.getInsSampleId()); orderFile.setFileUrl(url); orderFile.setType(2); orderFile.setFileName(insSample.getSampleCode() + "&" + sonLaboratory + name + "解析的辐射站点报告.docx"); orderFile.setSonLaboratory(sonLaboratory); insOrderFileMapper.insert(orderFile); } catch (IOException e) { e.printStackTrace(); } finally { // 关闭资源 try { if (workbook != null) { workbook.close(); } if (fileInputStream != null) { fileInputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } } public void createWord(String sonLaboratory, XWPFDocument document, Exceldata exceldata, HashMap map, InsOrderFile insOrderFile) throws IOException { int size = 1; XWPFParagraph paragraphs = document.createParagraph(); XWPFRun runs = paragraphs.createRun(); runs.setBold(true); // 设置文本加粗 runs.setText("辐射方向图参数"); for (String s : map.keySet()) { Map dataRow = exceldata.getDataRow(); String result = s.substring(s.lastIndexOf(",") + 1); String result1 = s.substring(0, s.lastIndexOf(",")); String o = map.get(s).toString(); String[] split = o.split(","); Integer s1 = Integer.parseInt(split[split.length - 1]); Integer i1 = split.length - 1; int row = 3 + s1; int cell = 6 + i1; XWPFTable table1 = document.createTable(2, cell); mergeCellsHorizontally(table1, 1, 0, cell - 1); mergeCellsHorizontally(table1, 0, 4, cell - 2); table1.setInsideHBorder(XWPFTable.XWPFBorderType.SINGLE, 2, 0, "000000"); // 内部水平边框 table1.setInsideVBorder(XWPFTable.XWPFBorderType.SINGLE, 2, 0, "000000"); // 内部垂直边框 table1.setBottomBorder(XWPFTable.XWPFBorderType.SINGLE, 2, 0, "000000"); // 下边框 table1.setTopBorder(XWPFTable.XWPFBorderType.SINGLE, 2, 0, "000000"); // 上边框 table1.setLeftBorder(XWPFTable.XWPFBorderType.SINGLE, 2, 0, "000000"); // 左边框 table1.setRightBorder(XWPFTable.XWPFBorderType.SINGLE, 2, 0, "000000"); // 右边框 XWPFParagraph paragraph12 = table1.getRow(0).getCell(0).getParagraphArray(0); paragraph12.setAlignment(ParagraphAlignment.CENTER); XWPFRun run12 = paragraph12.createRun(); run12.setText("序号"); XWPFParagraph paragraph13 = table1.getRow(0).getCell(1).getParagraphArray(0); paragraph13.setAlignment(ParagraphAlignment.CENTER); XWPFRun run13 = paragraph13.createRun(); run13.setText("检验项目"); XWPFParagraph paragraph14 = table1.getRow(0).getCell(2).getParagraphArray(0); paragraph14.setAlignment(ParagraphAlignment.CENTER); XWPFRun run14 = paragraph14.createRun(); run14.setText("单位"); XWPFParagraph paragraph15 = table1.getRow(0).getCell(3).getParagraphArray(0); paragraph15.setAlignment(ParagraphAlignment.CENTER); XWPFRun run15 = paragraph15.createRun(); run15.setText("标准要求"); XWPFParagraph paragraph16 = table1.getRow(0).getCell(cell - 1).getParagraphArray(0); paragraph16.setAlignment(ParagraphAlignment.CENTER); XWPFRun run16 = paragraph16.createRun(); run16.setText("检验结论"); XWPFParagraph paragraph17 = table1.getRow(0).getCell(4).getParagraphArray(0); paragraph17.setAlignment(ParagraphAlignment.CENTER); XWPFRun run17 = paragraph17.createRun(); run17.setText("检验结果"); XWPFParagraph paragraph18 = table1.getRow(1).getCell(0).getParagraphArray(0); paragraph18.setAlignment(ParagraphAlignment.CENTER); XWPFRun run18 = paragraph18.createRun(); run18.setText("频段: " + result1 + "MHz " + "下倾角" + result); List collect = Arrays.stream(split).collect(Collectors.toList()); List> list = new ArrayList<>(); // 对所有的键聚合 Map>> aggregatedMap = new HashMap<>(); Map>> o1 = (Map>>) dataRow.get(result); for (String s2 : collect) { if (s2.contains("端口")) { List> mapList = o1.get(s2); list.addAll(mapList); } } // 遍历每一个项目 for (Map item : list) { for (String key : item.keySet()) { // 如果该键在 aggregatedMap 中不存在,则创建一个新的 List aggregatedMap.putIfAbsent(key, new ArrayList<>()); // 将当前项目添加到对应键的 List 中 aggregatedMap.get(key).add(item); } } for (String s2 : aggregatedMap.keySet()) { if (s2.equals("端口") || s2.equals("频率")) { continue; } List> mapList = aggregatedMap.get(s2); // 创建一个表格 XWPFTable table = document.createTable(row, cell); table.setWidth("100%"); //垂直 mergeCellsVertically(table, 0, 0, row - 1); mergeCellsVertically(table, 1, 0, row - 1); mergeCellsVertically(table, 2, 0, row - 1); mergeCellsVertically(table, 3, 0, row - 1); mergeCellsVertically(table, 4, 0, 1); mergeCellsVertically(table, cell - 1, 0, 1); mergeCellsVertically(table, cell - 1, 2, row - 2); //水平 mergeCellsHorizontally(table, 0, 5, cell - 2); mergeCellsHorizontally(table, row - 1, 5, cell - 2); table.setInsideHBorder(XWPFTable.XWPFBorderType.SINGLE, 2, 0, "000000"); // 内部水平边框 table.setInsideVBorder(XWPFTable.XWPFBorderType.SINGLE, 2, 0, "000000"); // 内部垂直边框 table.setBottomBorder(XWPFTable.XWPFBorderType.SINGLE, 2, 0, "000000"); // 下边框 table.setTopBorder(XWPFTable.XWPFBorderType.SINGLE, 2, 0, "000000"); // 上边框 table.setLeftBorder(XWPFTable.XWPFBorderType.SINGLE, 2, 0, "000000"); // 左边框 table.setRightBorder(XWPFTable.XWPFBorderType.SINGLE, 2, 0, "000000"); // 右边框 // 设置单元格文本并居中 XWPFParagraph paragraph = table.getRow(0).getCell(0).getParagraphArray(0); paragraph.setAlignment(ParagraphAlignment.CENTER); XWPFRun run = paragraph.createRun(); run.setText(String.valueOf(size)); XWPFParagraph paragraph1 = table.getRow(0).getCell(1).getParagraphArray(0); paragraph1.setAlignment(ParagraphAlignment.CENTER); XWPFRun run1 = paragraph1.createRun(); run1.setText(s2); // 调用方法提取第一个括号内的内容 String firstContent = extractFirstContentFromBrackets(s2); if (firstContent != null) { XWPFParagraph paragraph2 = table.getRow(0).getCell(2).getParagraphArray(0); paragraph2.setAlignment(ParagraphAlignment.CENTER); XWPFRun run2 = paragraph2.createRun(); run2.setText(firstContent); } else { System.out.println("没有找到括号内的内容。"); } XWPFParagraph paragraph3 = table.getRow(0).getCell(3).getParagraphArray(0); paragraph3.setAlignment(ParagraphAlignment.CENTER); XWPFRun run3 = paragraph3.createRun(); run3.setText("/"); XWPFParagraph paragraph4 = table.getRow(0).getCell(4).getParagraphArray(0); paragraph4.setAlignment(ParagraphAlignment.CENTER); XWPFRun run4 = paragraph4.createRun(); run4.setText("频率(MHz)"); XWPFParagraph paragraph5 = table.getRow(0).getCell(5).getParagraphArray(0); paragraph5.setAlignment(ParagraphAlignment.CENTER); XWPFRun run5 = paragraph5.createRun(); run5.setText("端口"); XWPFParagraph paragraph6 = table.getRow(0).getCell(cell - 1).getParagraphArray(0); paragraph6.setAlignment(ParagraphAlignment.CENTER); XWPFRun run6 = paragraph6.createRun(); run6.setText("/"); XWPFParagraph paragraph7 = table.getRow(2).getCell(cell - 1).getParagraphArray(0); paragraph7.setAlignment(ParagraphAlignment.CENTER); XWPFRun run7 = paragraph7.createRun(); run7.setText("合格"); XWPFParagraph paragraph8 = table.getRow(row - 1).getCell(4).getParagraphArray(0); paragraph8.setAlignment(ParagraphAlignment.CENTER); XWPFRun run8 = paragraph8.createRun(); run8.setText("平均值"); XWPFParagraph paragraph9 = table.getRow(row - 1).getCell(cell - 1).getParagraphArray(0); paragraph9.setAlignment(ParagraphAlignment.CENTER); XWPFRun run9 = paragraph9.createRun(); run9.setText("/"); for (int i = 0; i < collect.size(); i++) { String s3 = collect.get(i); if (s3.contains("端口")) { XWPFParagraph paragraph10 = table.getRow(1).getCell(5 + i).getParagraphArray(0); paragraph10.setAlignment(ParagraphAlignment.CENTER); XWPFRun run10 = paragraph10.createRun(); run10.setText(s3); } } Map>> group = mapList.stream() .collect(Collectors.groupingBy(item -> (Double) item.get("频率"))); group = new TreeMap<>(group); int hang = 2; Double count = 0.0; for (Double aDouble : group.keySet()) { List> mapList1 = group.get(aDouble); for (Map stringObjectMap : mapList1) { String port = stringObjectMap.get("端口").toString(); for (int i = 5; i < cell - 1; i++) { String text = table.getRow(1).getCell(i).getText(); if (text.equals(port)) { XWPFParagraph paragraph10 = table.getRow(hang).getCell(i).getParagraphArray(0); paragraph10.setAlignment(ParagraphAlignment.CENTER); XWPFRun run10 = paragraph10.createRun(); count = (Double) stringObjectMap.get(s2) + count; String project = stringObjectMap.get(s2).toString(); run10.setText(project); } } } XWPFParagraph paragraph10 = table.getRow(hang).getCell(4).getParagraphArray(0); paragraph10.setAlignment(ParagraphAlignment.CENTER); XWPFRun run10 = paragraph10.createRun(); run10.setText(String.valueOf(aDouble)); hang++; } XWPFParagraph paragraph11 = table.getRow(row - 1).getCell(5).getParagraphArray(0); paragraph11.setAlignment(ParagraphAlignment.CENTER); XWPFRun run11 = paragraph11.createRun(); double v = count / (Double.parseDouble(s1.toString()) * Double.parseDouble(i1.toString())); run11.setText(String.format("%.2f", v)); size++; } } // 输出到文件 try { InsSample insSample = insSampleMapper.selectById(insOrderFile.getInsSampleId()); String[] split = insOrderFile.getFileName().split("\\."); String name = insOrderFile.getFileName().replace('#', '&').substring(0, (insOrderFile.getFileName().length() - split[split.length - 1].length())); String url = UUID.randomUUID() + "_" + insSample.getSampleCode() + "&" + sonLaboratory + name + "解析的辐射站点报告.docx"; url.replace("#", "&"); FileOutputStream out = new FileOutputStream(wordUrl + "/" + url); document.write(out); out.close(); document.close(); InsOrderFile orderFile = new InsOrderFile(); orderFile.setInsOrderId(insOrderFile.getInsOrderId()); orderFile.setInsSampleId(insOrderFile.getInsSampleId()); orderFile.setFileUrl(url); orderFile.setType(2); orderFile.setFileName(insSample.getSampleCode() + "&" + sonLaboratory + name + "解析的辐射站点报告.docx"); orderFile.setSonLaboratory(sonLaboratory); insOrderFileMapper.insert(orderFile); } catch (IOException e) { e.printStackTrace(); } } public void createWord2(String sonLaboratory, XWPFDocument document, Exceldata exceldata, HashMap map, HashMap pj, HashMap bz, InsOrderFile insOrderFile) throws IOException { int size = 1; for (String s : map.keySet()) { Map dataRow = exceldata.getDataRow(); String result = s.substring(s.lastIndexOf("-") + 1); String result1 = s.substring(0, s.lastIndexOf("-")); String o = map.get(s).toString(); String[] split = o.split(","); Integer s1 = Integer.parseInt(split[split.length - 1]); Integer i1 = split.length - 1; int row = 3 + s1; int cell = 6 + i1; HashMap o2 = (HashMap) pj.get(result); XWPFTable table1 = document.createTable(2, cell); mergeCellsHorizontally(table1, 1, 0, cell - 1); mergeCellsHorizontally(table1, 0, 4, cell - 2); XWPFParagraph paragraph12 = table1.getRow(0).getCell(0).getParagraphArray(0); XWPFRun run12 = paragraph12.createRun(); run12.setText("序号"); XWPFParagraph paragraph13 = table1.getRow(0).getCell(1).getParagraphArray(0); XWPFRun run13 = paragraph13.createRun(); run13.setText("检验项目"); XWPFParagraph paragraph14 = table1.getRow(0).getCell(2).getParagraphArray(0); XWPFRun run14 = paragraph14.createRun(); run14.setText("单位"); XWPFParagraph paragraph15 = table1.getRow(0).getCell(3).getParagraphArray(0); XWPFRun run15 = paragraph15.createRun(); run15.setText("标准要求"); XWPFParagraph paragraph16 = table1.getRow(0).getCell(cell - 1).getParagraphArray(0); XWPFRun run16 = paragraph16.createRun(); run16.setText("检验结论"); XWPFParagraph paragraph17 = table1.getRow(0).getCell(4).getParagraphArray(0); XWPFRun run17 = paragraph17.createRun(); run17.setText("检验结果"); XWPFParagraph paragraph18 = table1.getRow(1).getCell(0).getParagraphArray(0); XWPFRun run18 = paragraph18.createRun(); run18.setText("频段: " + result1 + "MHz " + "下倾角" + result); List collect = Arrays.stream(split).collect(Collectors.toList()); collect.sort((o1, o21) -> Integer.parseInt(o1.substring((o1.length() - 1))) - Integer.parseInt(o21.substring(o21.length() - 1))); int size1 = 0; List> list = new ArrayList<>(); // 对所有的键聚合 Map>> aggregatedMap = new HashMap<>(); Map>> o1 = (Map>>) dataRow.get(result); for (String s2 : collect) { if (s2.contains("端口") || s2.contains("P")) { List> mapList = o1.get(s2); list.addAll(mapList); } } // 遍历每一个项目 for (Map item : list) { for (String key : item.keySet()) { // 如果该键在 aggregatedMap 中不存在,则创建一个新的 List aggregatedMap.putIfAbsent(key, new ArrayList<>()); // 将当前项目添加到对应键的 List 中 aggregatedMap.get(key).add(item); } } for (String s2 : aggregatedMap.keySet()) { if (s2.equals("端口") || s2.equals("测试频率(MHZ)")) { continue; } List> mapList = aggregatedMap.get(s2); // 创建一个表格 XWPFTable table = document.createTable(row, cell); table.setWidth("100%"); /* // 合并单元格 mergeCellsHorizontally(table, 0, 0, 7);*/ //垂直 mergeCellsVertically(table, 0, 0, row - 1); mergeCellsVertically(table, 1, 0, row - 1); mergeCellsVertically(table, 2, 0, row - 1); mergeCellsVertically(table, 3, 0, row - 1); mergeCellsVertically(table, 4, 0, 1); mergeCellsVertically(table, cell - 1, 0, 1); mergeCellsVertically(table, cell - 1, 2, row - 2); //水平 mergeCellsHorizontally(table, 0, 5, cell - 2); mergeCellsHorizontally(table, row - 1, 5, cell - 2); // 设置单元格文本并居中 XWPFParagraph paragraph = table.getRow(0).getCell(0).getParagraphArray(0); XWPFRun run = paragraph.createRun(); run.setText(String.valueOf(size)); XWPFParagraph paragraph1 = table.getRow(0).getCell(1).getParagraphArray(0); XWPFRun run1 = paragraph1.createRun(); run1.setText(s2); // 调用方法提取第一个括号内的内容 String firstContent = extractFirstContentFromBrackets(s2); if (firstContent != null) { XWPFParagraph paragraph2 = table.getRow(0).getCell(2).getParagraphArray(0); XWPFRun run2 = paragraph2.createRun(); run2.setText(firstContent); } else { System.out.println("没有找到括号内的内容。"); } XWPFParagraph paragraph3 = table.getRow(0).getCell(3).getParagraphArray(0); XWPFRun run3 = paragraph3.createRun(); if (bz.get(s2) != null) { run3.setText(bz.get(s2).toString()); } XWPFParagraph paragraph4 = table.getRow(0).getCell(4).getParagraphArray(0); XWPFRun run4 = paragraph4.createRun(); run4.setText("频率(MHz)"); XWPFParagraph paragraph5 = table.getRow(0).getCell(5).getParagraphArray(0); XWPFRun run5 = paragraph5.createRun(); run5.setText("端口"); XWPFParagraph paragraph6 = table.getRow(0).getCell(cell - 1).getParagraphArray(0); XWPFRun run6 = paragraph6.createRun(); run6.setText("/"); XWPFParagraph paragraph7 = table.getRow(1).getCell(cell - 1).getParagraphArray(0); XWPFRun run7 = paragraph7.createRun(); run7.setText("合格"); XWPFParagraph paragraph8 = table.getRow(row - 1).getCell(4).getParagraphArray(0); XWPFRun run8 = paragraph8.createRun(); run8.setText("平均值"); XWPFParagraph paragraph9 = table.getRow(row - 1).getCell(cell - 1).getParagraphArray(0); XWPFRun run9 = paragraph9.createRun(); run9.setText("/"); for (int i = 0; i < collect.size(); i++) { String s3 = collect.get(i); if (s3.contains("端口") || s3.contains("P")) { XWPFParagraph paragraph10 = table.getRow(1).getCell(5 + i).getParagraphArray(0); XWPFRun run10 = paragraph10.createRun(); run10.setText(s3); } } Map>> group = mapList.stream() .collect(Collectors.groupingBy(item -> { Double aDouble = (Double) item.get("测试频率(MHZ)"); return aDouble.intValue(); })); int hang = 2; Double count = 0.0; for (Integer aDouble : group.keySet()) { List> mapList1 = group.get(aDouble); for (Map stringObjectMap : mapList1) { String port = stringObjectMap.get("端口").toString(); for (int i = 5; i < cell - 1; i++) { String text = table.getRow(1).getCell(i).getText(); if (text.equals(port)) { XWPFParagraph paragraph10 = table.getRow(hang).getCell(i).getParagraphArray(0); XWPFRun run10 = paragraph10.createRun(); count = Double.parseDouble(stringObjectMap.get(s2).toString()) + count; String project = stringObjectMap.get(s2).toString(); run10.setText(project); } } } XWPFParagraph paragraph10 = table.getRow(hang).getCell(4).getParagraphArray(0); XWPFRun run10 = paragraph10.createRun(); run10.setText(String.valueOf(aDouble)); hang++; } XWPFParagraph paragraph11 = table.getRow(row - 1).getCell(5).getParagraphArray(0); XWPFRun run11 = paragraph11.createRun(); double v = count / (Double.parseDouble(s1.toString()) * Double.parseDouble(i1.toString())); run11.setText(o2.get(s2).toString()); size++; } } } // 水平合并单元格 private static void mergeCellsHorizontally(XWPFTable table, int row, int fromCol, int toCol) { for (int i = fromCol; i <= toCol; i++) { if (i == fromCol) { table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART); } else { table.getRow(row).getCell(i).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE); } } } // 垂直合并单元格 private static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) { for (int i = fromRow; i <= toRow; i++) { if (i == fromRow) { table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART); } else { table.getRow(i).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE); } } } // 提取第一个括号内的内容 public static String extractFirstContentFromBrackets(String str) { // 定义正则表达式,匹配括号内的内容,同时支持中文和英文括号 Pattern pattern = Pattern.compile("\\((.*?)\\)|\\((.*?)\\)"); Matcher matcher = pattern.matcher(str); // 查找第一个匹配的内容 if (matcher.find()) { // 获取括号内的内容,判断是中文括号还是英文括号 return matcher.group(1) != null ? matcher.group(1) : matcher.group(2); } return null; // 如果没有找到匹配项,则返回null } }