From 54bae7fcc7a2dca32b7614b698c52399b2920b4f Mon Sep 17 00:00:00 2001 From: chenrui <1187576398@qq.com> Date: 星期一, 24 三月 2025 13:35:47 +0800 Subject: [PATCH] 近场/远场辐射导入样式修改 --- inspect-server/src/main/java/com/yuanchu/mom/utils/WordUtils.java | 326 ++++++++++++++++++++++++++++++++++------------------- 1 files changed, 207 insertions(+), 119 deletions(-) diff --git a/inspect-server/src/main/java/com/yuanchu/mom/utils/WordUtils.java b/inspect-server/src/main/java/com/yuanchu/mom/utils/WordUtils.java index 6fcbefd..b57dcb6 100644 --- a/inspect-server/src/main/java/com/yuanchu/mom/utils/WordUtils.java +++ b/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 { @@ -2651,13 +2658,19 @@ if (vValues.size() > 0) { //涓嶅悎鏍� if (vValues.get(1) != 0) { - productCount2 = productCount2 - 1 + vValues.get(1); + productCount2 = productCount2 + vValues.get(1); } //鍚堟牸 if (vValues.get(0) != 0) { if (fusheProduct.getInsResult() == 1) { - productCount3 = productCount3 - 1 + vValues.get(0); - } else productCount3 = productCount3 + vValues.get(0); + productCount3 = productCount3 + vValues.get(0); + } + } + // 鍒ゅ畾鏄惁鍑忔帀杈愬皠妫�楠岄」鏈韩 + if (fusheProduct.getInsResult() == 1) { + productCount3 = productCount3 - 1; + }else if(fusheProduct.getInsResult() == 0){ + productCount2 = productCount2 - 1; } //鎬绘暟=椤圭洰鎬绘暟-杈愬皠椤圭洰鏁伴噺+杈愬皠鍏蜂綋鐨�(鍚堟牸+涓嶅悎鏍�)鏁伴噺 productCount = productCount - 1 + vValues.stream().mapToLong(Long::longValue).sum(); @@ -2706,9 +2719,12 @@ } //杈愬皠琛ㄦ牸 List<Map<String, Object>> tables3 = new ArrayList<>(); + List<InsOrderFile> insOrderDocFiles = new ArrayList<>();; // 鏆傚瓨闇�瑕佸悎骞惰〃鍗曞埌鐢熸垚word鏂囦欢鐨刣ocx鏂囦欢 + // 缁熻杈愬皠瀹為獙琛ㄦ暟閲� + int radiationReportNum = 0; if (strings.contains("杩戝満") || strings.contains("杩滃満")) { /*杈愬皠鐨勮瘯楠岃〃*/ - List<InsOrderFile> insOrderFiles = insOrderFileMapper.selectList(Wrappers.<InsOrderFile>lambdaQuery() + List<InsOrderFile> insOrderFiles = insOrderFileMapper.selectList(Wrappers.<InsOrderFile>lambdaQuery() .eq(InsOrderFile::getInsOrderId, orderId) .eq(InsOrderFile::getInsSampleId, insReportDto1.getSampleId()) .like(InsOrderFile::getFileName, "瑙f瀽鐨勮緪灏勭珯鐐规姤鍛�") @@ -2717,102 +2733,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 = "杈愬皠鏂瑰悜鍥惧弬鏁�"; } //鐜琛ㄦ牸 @@ -2959,13 +2977,14 @@ if (i % 2 == 0) { urlListDto = new UrlListDto(); urlListDto.setImageOne(Pictures.ofLocal(imgUrl + "/" + insOrderFiles.get(i).getFileUrl()).create()); + if (i == insOrderFiles.size() - 1) { + urlList.add(urlListDto); + } } else { urlListDto.setImageTwo(Pictures.ofLocal(imgUrl + "/" + insOrderFiles.get(i).getFileUrl()).create()); urlList.add(urlListDto); } - if (i == insOrderFiles.size() - 1) { - urlList.add(urlListDto); - } + } } //鏍峰搧缂栧彿鍙傜収涓婅堪sampleCode @@ -3065,7 +3084,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 +3212,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) { + // 鍔犺浇婧愭枃妗e苟鎻愬彇琛ㄥ崟鍐呭锛堝亣璁句负琛ㄦ牸锛� + 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 +5603,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; + } + } } -- Gitblit v1.9.3