inspect-server/pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
inspect-server/src/main/java/com/yuanchu/mom/utils/FuSheUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
inspect-server/src/main/java/com/yuanchu/mom/utils/WordUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
inspect-server/pom.xml
@@ -103,5 +103,11 @@ <version>5.5.2</version> </dependency> <dependency> <groupId>org.docx4j</groupId> <artifactId>docx4j-JAXB-ReferenceImpl</artifactId> <version>8.3.4</version> <!-- 使用最新稳定版 --> </dependency> </dependencies> </project> inspect-server/src/main/java/com/yuanchu/mom/utils/FuSheUtils.java
@@ -1,24 +1,15 @@ 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 lombok.extern.slf4j.Slf4j; 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; @@ -32,10 +23,9 @@ 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; @Slf4j @Component public class FuSheUtils { @Value("${wordUrl}") @@ -700,7 +690,6 @@ for (String s : map.keySet()) { Map<String, Object> 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]); @@ -710,6 +699,7 @@ HashMap<String, Object> o2 = (HashMap<String, Object>) pj.get(result); XWPFTable table1 = document.createTable(2, cell); table1.setWidth("100%"); mergeCellsHorizontally(table1, 1, 0, cell - 1); mergeCellsHorizontally(table1, 0, 4, cell - 2); @@ -769,42 +759,43 @@ aggregatedMap.get(key).add(item); } } // 初始化行数 int rowNum = 2; for (String s2 : aggregatedMap.keySet()) { if (s2.equals("端口") || s2.equals("测试频率(MHZ)")) { continue; } List<Map<String, Object>> mapList = aggregatedMap.get(s2); // 创建一个表格 XWPFTable table = document.createTable(row, cell); table.setWidth("100%"); int checkItemRowNum = row; for (int i = 0; i < checkItemRowNum; i++) { table1.createRow(); // 创建新行 } // XWPFTable table = document.createTable(row, cell); //垂直 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); mergeCellsVertically(table1, 0, rowNum, rowNum + checkItemRowNum - 1); mergeCellsVertically(table1, 1, rowNum, rowNum + checkItemRowNum - 1); mergeCellsVertically(table1, 2, rowNum, rowNum + checkItemRowNum - 1); mergeCellsVertically(table1, 3, rowNum, rowNum + checkItemRowNum - 1); mergeCellsVertically(table1, 4, rowNum, 1); mergeCellsVertically(table1, cell - 1, rowNum, rowNum+1); mergeCellsVertically(table1, cell - 1, rowNum+2, rowNum + checkItemRowNum - 1); //水平 mergeCellsHorizontally(table, 0, 5, cell - 2); mergeCellsHorizontally(table, row - 1, 5, cell - 2); mergeCellsHorizontally(table1, rowNum, 5, cell - 2); mergeCellsHorizontally(table1, rowNum + checkItemRowNum - 1, 5, cell - 2); // 设置单元格文本并居中 XWPFParagraph paragraph = table.getRow(0).getCell(0).getParagraphArray(0); XWPFParagraph paragraph = table1.getRow(rowNum).getCell(0).getParagraphArray(0); XWPFRun run = paragraph.createRun(); run.setText(String.valueOf(size)); XWPFParagraph paragraph1 = table.getRow(0).getCell(1).getParagraphArray(0); XWPFParagraph paragraph1 = table1.getRow(rowNum).getCell(1).getParagraphArray(0); XWPFRun run1 = paragraph1.createRun(); run1.setText(s2); // 单位 XWPFParagraph paragraph2 = table.getRow(0).getCell(2).getParagraphArray(0); XWPFParagraph paragraph2 = table1.getRow(rowNum).getCell(2).getParagraphArray(0); XWPFRun run2 = paragraph2.createRun(); if (s2.contains("增益")) { run2.setText("dBi"); @@ -819,44 +810,47 @@ } XWPFParagraph paragraph3 = table.getRow(0).getCell(3).getParagraphArray(0); // 定义改检查项标准值 String checkItemStandardStr = ""; XWPFParagraph paragraph3 = table1.getRow(rowNum).getCell(3).getParagraphArray(0); paragraph3.setAlignment(ParagraphAlignment.CENTER); XWPFRun run3 = paragraph3.createRun(); if (bz.get(s2) != null) { run3.setText(bz.get(s2).toString()); checkItemStandardStr = bz.get(s2).toString(); } else run3.setText(""); XWPFParagraph paragraph4 = table.getRow(0).getCell(4).getParagraphArray(0); XWPFParagraph paragraph4 = table1.getRow(rowNum).getCell(4).getParagraphArray(0); XWPFRun run4 = paragraph4.createRun(); run4.setText("频率(MHz)"); XWPFParagraph paragraph5 = table.getRow(0).getCell(5).getParagraphArray(0); XWPFParagraph paragraph5 = table1.getRow(rowNum).getCell(5).getParagraphArray(0); paragraph5.setAlignment(ParagraphAlignment.CENTER); XWPFRun run5 = paragraph5.createRun(); run5.setText("端口"); XWPFParagraph paragraph6 = table.getRow(0).getCell(cell - 1).getParagraphArray(0); XWPFParagraph paragraph6 = table1.getRow(rowNum).getCell(cell - 1).getParagraphArray(0); XWPFRun run6 = paragraph6.createRun(); run6.setText("判定"); XWPFParagraph paragraph7 = table.getRow(1).getCell(cell - 1).getParagraphArray(0); XWPFParagraph paragraph7 = table1.getRow(rowNum+1).getCell(cell - 1).getParagraphArray(0); XWPFRun run7 = paragraph7.createRun(); run7.setText("合格"); XWPFParagraph paragraph8 = table.getRow(row - 1).getCell(4).getParagraphArray(0); XWPFParagraph paragraph8 = table1.getRow(rowNum+checkItemRowNum - 1).getCell(4).getParagraphArray(0); XWPFRun run8 = paragraph8.createRun(); run8.setText("平均值"); XWPFParagraph paragraph9 = table.getRow(row - 1).getCell(cell - 1).getParagraphArray(0); XWPFParagraph paragraph9 = table1.getRow(rowNum + checkItemRowNum - 1).getCell(cell - 1).getParagraphArray(0); XWPFRun run9 = paragraph9.createRun(); run9.setText(""); for (int i = 0; i < collect.size(); i++) { for (int i = 0; i < collect.size() - 1; i++) { String s3 = collect.get(i); if (s3.contains("端口") || s3.contains("P")) { XWPFParagraph paragraph10 = table.getRow(1).getCell(5 + i).getParagraphArray(0); XWPFParagraph paragraph10 = table1.getRow(rowNum+1).getCell(5 + i).getParagraphArray(0); XWPFRun run10 = paragraph10.createRun(); run10.setText(s3); } @@ -871,34 +865,100 @@ int hang = 2; Double count = 0.0; // 定义 是否合格标记 boolean passFlag = true; // 解析判定条件并解析比较标准值 0 无需判定 1 区间判定 2 小于等于 3 大于等于 int checkType = 0; double firstParam = 0.0; double secondParam = 0.0 ; checkItemStandardStr = checkItemStandardStr.trim(); if(checkItemStandardStr.contains("~") ){ checkType = 1; String[] params = checkItemStandardStr.split("~"); if(null != params && params.length == 2){ firstParam = Double.valueOf(params[0]); secondParam = Double.valueOf(params[1]); } } else if(checkItemStandardStr.contains("-") && !(checkItemStandardStr.contains("≤") || checkItemStandardStr.contains("≥"))){ checkType = 1; String[] params = checkItemStandardStr.split("-"); if(null != params && params.length == 2){ firstParam = Double.valueOf(params[0]); secondParam = Double.valueOf(params[1]); } } else if (checkItemStandardStr.contains("≤")) { checkType = 2; String[] params = checkItemStandardStr.split("≤"); if(null != params && params.length == 1){ if(params[1].contains("%")){ firstParam = Double.valueOf(params[1].substring(0,params[1].length()-1))/100; }else{ firstParam = Double.valueOf(params[1]); } } }else if(checkItemStandardStr.contains("≥")){ checkType = 3; String[] params = checkItemStandardStr.split("≥"); if(null != params && params.length == 2){ if(params[1].contains("%")){ firstParam = Double.valueOf(params[1].substring(0,params[1].length()-1))/100; }else{ firstParam = Double.valueOf(params[1]); } } } for (Integer aDouble : group.keySet()) { List<Map<String, Object>> mapList1 = group.get(aDouble); for (Map<String, Object> stringObjectMap : mapList1) { String port = stringObjectMap.get("端口").toString(); for (int i = 5; i < cell - 1; i++) { String text = table.getRow(1).getCell(i).getText(); String text = table1.getRow(rowNum+1).getCell(i).getText(); if (text.equals(port)) { XWPFParagraph paragraph10 = table.getRow(hang).getCell(i).getParagraphArray(0); XWPFParagraph paragraph10 = table1.getRow(hang+rowNum).getCell(i).getParagraphArray(0); XWPFRun run10 = paragraph10.createRun(); count = Double.parseDouble(stringObjectMap.get(s2).toString()) + count; double value = Double.parseDouble(stringObjectMap.get(s2).toString()); count = value + count; // 数据判断 if(checkType == 1){ if(!(value >= firstParam && value <= secondParam)){ passFlag = false; } }else if(checkType == 2){ if(value >= firstParam ){ passFlag = false; } }else if(checkType == 3){ if(value <= firstParam ){ passFlag = false; } } String project = stringObjectMap.get(s2).toString(); run10.setText(project); } } } XWPFParagraph paragraph10 = table.getRow(hang).getCell(4).getParagraphArray(0); XWPFParagraph paragraph10 = table1.getRow(hang+rowNum).getCell(4).getParagraphArray(0); XWPFRun run10 = paragraph10.createRun(); run10.setText(String.valueOf(aDouble)); hang++; } // 汇总结果 if(checkType != 0){ XWPFParagraph paragraph10 = table1.getRow(rowNum+2).getCell(cell - 1).getParagraphArray(0); XWPFRun run10 = paragraph10.createRun(); if(passFlag){ run10.setText(String.valueOf("合格")); }else { run10.setText(String.valueOf("不合格")); } } XWPFParagraph paragraph11 = table.getRow(row - 1).getCell(5).getParagraphArray(0); XWPFParagraph paragraph11 = table1.getRow(rowNum + checkItemRowNum - 1).getCell(5).getParagraphArray(0); XWPFRun run11 = paragraph11.createRun(); double v = count / (Double.parseDouble(s1.toString()) * Double.parseDouble(i1.toString())); run11.setText(String.format("%.2f",(double)o2.get(s2))); rowNum += checkItemRowNum; size++; } } inspect-server/src/main/java/com/yuanchu/mom/utils/WordUtils.java
@@ -11,6 +11,7 @@ import com.deepoove.poi.config.ConfigureBuilder; import com.deepoove.poi.data.*; import com.deepoove.poi.data.style.*; import com.deepoove.poi.data.style.Style; import com.deepoove.poi.util.TableTools; import com.spire.doc.FileFormat; import com.yuanchu.mom.dto.*; @@ -18,18 +19,23 @@ import com.yuanchu.mom.mapper.*; import com.yuanchu.mom.pojo.*; import com.yuanchu.mom.vo.InsProductResult2VO; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.poi.openxml4j.util.ZipSecureFile; import org.apache.poi.xwpf.usermodel.*; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHMerge; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVMerge; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge; import org.docx4j.XmlUtils; import org.docx4j.jaxb.Context; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.wml.*; import org.docx4j.wml.STBrType; import org.openxmlformats.schemas.wordprocessingml.x2006.main.*; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.xml.bind.JAXBElement; import java.io.*; import java.nio.file.Files; import java.nio.file.Paths; @@ -42,6 +48,7 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; @Slf4j @Component public class WordUtils { @@ -2706,6 +2713,9 @@ } //辐射表格 List<Map<String, Object>> tables3 = new ArrayList<>(); List<InsOrderFile> insOrderDocFiles = new ArrayList<>();; // 暂存需要合并表单到生成word文件的docx文件 // 统计辐射实验表数量 int radiationReportNum = 0; if (strings.contains("近场") || strings.contains("远场")) { /*辐射的试验表*/ List<InsOrderFile> insOrderFiles = insOrderFileMapper.selectList(Wrappers.<InsOrderFile>lambdaQuery() @@ -2717,102 +2727,104 @@ .or() .eq(InsOrderFile::getSonLaboratory, "近场") )); if (insOrderFiles.size() > 0) { int aa = 0; for (InsOrderFile insOrderFile : insOrderFiles) { try { XWPFDocument circuitParamsDoc = new XWPFDocument(new FileInputStream(wordUrl + "/" + insOrderFile.getFileUrl())); // 遍历电路参数文件的所有元素,段落和表格 for (IBodyElement element : circuitParamsDoc.getBodyElements()) { Map<String, Object> table3 = new HashMap<>(); TableRenderData tableData = new TableRenderData(); List<RowRenderData> rows = new ArrayList<>(); if (element instanceof XWPFTable) { aa += 1; XWPFTable tab = (XWPFTable) element; List<XWPFTableRow> row = tab.getRows(); for (int i = 0; i < row.size(); i++) { RowRenderData rowRenderData = new RowRenderData(); List<CellRenderData> cells = new ArrayList<>(); List<XWPFTableCell> cell = row.get(i).getTableCells(); for (int j = 0; j < cell.size(); j++) { CellRenderData cellRenderData = new CellRenderData(); List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>(); ParagraphRenderData paragraphRenderData = new ParagraphRenderData(); ParagraphStyle paragraphStyle = new ParagraphStyle(); paragraphStyle.setAlign(ParagraphAlignment.CENTER); paragraphRenderData.setParagraphStyle(paragraphStyle); List<RenderData> renderData = new ArrayList<>(); TextRenderData textRenderData = new TextRenderData(); Style style = new Style(); style.setFontFamily("宋体"); style.setColor("000000"); textRenderData.setStyle(style); CTTcPr tcPr = cell.get(j).getCTTc().getTcPr(); if (tcPr != null) { //合并列 CTHMerge hMerge = tcPr.getHMerge(); if (ObjectUtils.isNotEmpty(hMerge)) { if (STMerge.RESTART.equals(hMerge.getVal()) || STMerge.CONTINUE.equals(hMerge.getVal())) { int index = j; String text = null; while (text == null || text.equals("")) { if (index < 0) { text = "/"; } text = cell.get(index).getText(); index--; } textRenderData.setText(text + "∑88" + aa + i); } } //合并行 CTVMerge vMerge = tcPr.getVMerge(); if (ObjectUtils.isNotEmpty(vMerge)) { if (STMerge.RESTART.equals(vMerge.getVal()) || STMerge.CONTINUE.equals(vMerge.getVal())) { int index = i; String text = null; while (text == null || text.equals("")) { if (index < 0) { text = "/"; break; } text = row.get(index).getCell(j).getText(); index--; } if (text.equals("合格") || text.equals("不合格")) { textRenderData.setText(text + "∑25" + aa + j); } else { textRenderData.setText(text + "∑22" + aa + j); } } } } else { textRenderData.setText(cell.get(j).getText()); } renderData.add(textRenderData); paragraphRenderData.setContents(renderData); paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); } rowRenderData.setCells(cells); rows.add(rowRenderData); } tableData.setRows(rows); table3.put("table3", tableData); tables3.add(table3); } } } catch (IOException e) { e.printStackTrace(); } } } insOrderDocFiles.addAll(insOrderFiles); radiationReportNum = insOrderFiles.size(); // if (insOrderFiles.size() > 0) { // int aa = 0; // for (InsOrderFile insOrderFile : insOrderFiles) { // try { // XWPFDocument circuitParamsDoc = new XWPFDocument(new FileInputStream(wordUrl + "/" + insOrderFile.getFileUrl())); // // 遍历电路参数文件的所有元素,段落和表格 // for (IBodyElement element : circuitParamsDoc.getBodyElements()) { // Map<String, Object> table3 = new HashMap<>(); // TableRenderData tableData = new TableRenderData(); // List<RowRenderData> rows = new ArrayList<>(); // if (element instanceof XWPFTable) { // aa += 1; // XWPFTable tab = (XWPFTable) element; // List<XWPFTableRow> row = tab.getRows(); // for (int i = 0; i < row.size(); i++) { // RowRenderData rowRenderData = new RowRenderData(); // List<CellRenderData> cells = new ArrayList<>(); // List<XWPFTableCell> cell = row.get(i).getTableCells(); // for (int j = 0; j < cell.size(); j++) { // CellRenderData cellRenderData = new CellRenderData(); // List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>(); // ParagraphRenderData paragraphRenderData = new ParagraphRenderData(); // ParagraphStyle paragraphStyle = new ParagraphStyle(); // paragraphStyle.setAlign(ParagraphAlignment.CENTER); // paragraphRenderData.setParagraphStyle(paragraphStyle); // List<RenderData> renderData = new ArrayList<>(); // TextRenderData textRenderData = new TextRenderData(); // Style style = new Style(); // style.setFontFamily("宋体"); // style.setColor("000000"); // textRenderData.setStyle(style); // CTTcPr tcPr = cell.get(j).getCTTc().getTcPr(); // if (tcPr != null) { // //合并列 // CTHMerge hMerge = tcPr.getHMerge(); // if (ObjectUtils.isNotEmpty(hMerge)) { // if (STMerge.RESTART.equals(hMerge.getVal()) || STMerge.CONTINUE.equals(hMerge.getVal())) { // int index = j; // String text = null; // while (text == null || text.equals("")) { // if (index < 0) { // text = "/"; // } // text = cell.get(index).getText(); // index--; // } // textRenderData.setText(text + "∑88" + aa + i); // } // } // //合并行 // CTVMerge vMerge = tcPr.getVMerge(); // if (ObjectUtils.isNotEmpty(vMerge)) { // if (STMerge.RESTART.equals(vMerge.getVal()) || STMerge.CONTINUE.equals(vMerge.getVal())) { // int index = i; // String text = null; // while (text == null || text.equals("")) { // if (index < 0) { // text = "/"; // break; // } // text = row.get(index).getCell(j).getText(); // index--; // } // if (text.equals("合格") || text.equals("不合格")) { // textRenderData.setText(text + "∑25" + aa + j); // } else { // textRenderData.setText(text + "∑22" + aa + j); // } // } // } // } else { // textRenderData.setText(cell.get(j).getText()); // } // renderData.add(textRenderData); // paragraphRenderData.setContents(renderData); // paragraphRenderDataList.add(paragraphRenderData); // cellRenderData.setParagraphs(paragraphRenderDataList); // cells.add(cellRenderData); // } // rowRenderData.setCells(cells); // rows.add(rowRenderData); // } // tableData.setRows(rows); // table3.put("table3", tableData); // tables3.add(table3); // } // } // } catch (IOException e) { // e.printStackTrace(); // } // } // } } //辐射的标题 String title3 = ""; if (tables3.size() > 0) { if (radiationReportNum > 0) { title3 = "辐射方向图参数"; } //环境表格 @@ -3065,7 +3077,7 @@ put("insProductList", insProductList); //检验情况一览表 put("tables2", tables2); //检测结果 put("title3", finalTitle); //检测结果 put("tables3", tables3); //检测结果 put("tables3", null); //检测结果 put("tables4", tables4); //检测结果 put("urlList", urlList); //样品照片 put("insUsers", insUsers); //检测人员信息 @@ -3193,21 +3205,51 @@ } catch (IOException e) { throw new RuntimeException(e); } // //目录更新 // try{ // com.spire.doc.Document document = new com.spire.doc.Document(); // document.loadFromFile(path); // // 更新目录 // document.updateTableOfContents(); // // 保存文档 // document.saveToFile(path, FileFormat.Docx); // document.close(); // } // catch (Exception e) { // throw new RuntimeException(e); // } // 更新表单 try { WordprocessingMLPackage targetDoc = WordprocessingMLPackage.load(new File(path)); List<Object> targetContent = targetDoc.getMainDocumentPart().getContent(); int targetIndex = findFirstTargetIndex(targetDoc, title3); if (targetIndex != -1) { List<Object> forms = new ArrayList<>(); for (InsOrderFile insOrderFile : insOrderDocFiles) { // 加载源文档并提取表单内容(假设为表格) WordprocessingMLPackage sourceDoc = WordprocessingMLPackage.load(new File(wordUrl + "/" + insOrderFile.getFileUrl())); List<Object> sourceContent = sourceDoc.getMainDocumentPart().getContent(); for (Object obj : sourceContent) { if (obj instanceof JAXBElement) { // 检查是否为 JAXBElement JAXBElement jaxbElement = (JAXBElement)obj; Tbl table = (Tbl) XmlUtils.deepCopy(jaxbElement.getValue()); targetIndex++; // 插入到目标段落之后 targetContent.add(targetIndex, table); forms.add(table); // 插入分页符 P paragraphWithPageBreak = Context.getWmlObjectFactory().createP(); R run = Context.getWmlObjectFactory().createR(); Br br = Context.getWmlObjectFactory().createBr(); br.setType(STBrType.PAGE); // 设置分页符类型 run.getContent().add(br); paragraphWithPageBreak.getContent().add(run); targetIndex++; targetContent.add(targetIndex, paragraphWithPageBreak); } } } } // 保存修改后的文档 targetDoc.save(new File(path)); com.spire.doc.Document document = new com.spire.doc.Document(); document.loadFromFile(path); // 更新目录 document.updateTableOfContents(); // 保存文档 document.saveToFile(path, FileFormat.Docx); document.close(); }catch (Exception e){ log.error(e.getMessage()); } } //电路报告用于总报告的方法(天线) private void getWord1(String term, InsOrderState insOrderState, List<Map<String, Object>> tables2) { @@ -5554,4 +5596,43 @@ } } } // 查找文本首次出现行 private int findFirstTargetIndex(WordprocessingMLPackage targetDoc,String textStr){ int targetIndex = -1; if(StringUtils.isEmpty(textStr)){ return targetIndex; } try { List<Object> targetContent = targetDoc.getMainDocumentPart().getContent(); // 查找目标段落 for (int i = 0; i < targetContent.size(); i++) { Object obj = targetContent.get(i); if (obj instanceof P) { P paragraph = (P) obj; for (Object runObj : paragraph.getContent()) { if (runObj instanceof R) { R run = (R) runObj; for (Object textObj : run.getContent()) { if (textObj instanceof JAXBElement) { JAXBElement jaxbElement = (JAXBElement) textObj; if(jaxbElement.getValue() instanceof Text){ Text text = (Text) jaxbElement.getValue(); if (text.getValue().contains(textStr)) { targetIndex = i; return targetIndex; } } } } } } } } } catch (Exception e) { log.error("findFirstTargetIndex<<<<<<<<<<:{}",e.getMessage()); }finally { return targetIndex; } } }