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 | 367 ++++++++++++++++++++++++++++++++-------------------- 1 files changed, 227 insertions(+), 140 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 8b01a45..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 { @@ -283,7 +290,6 @@ cells.add(cellRenderData); } else { - i=i-1; if (insOrderState.getVersion() == 1) { //闈炵數璋冪増鏈�(绠�鍗曠増) if (inspectionItemSubclass.contains("鐢靛帇椹绘尝姣�") && i <= 2 * portRow) { @@ -905,7 +911,8 @@ paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); - } else if (j == bb - 1) { + } + else if (j == bb - 1) { //鏈�鍚庝竴鍒� if (i % (angles + 1) == 1) { textRenderData.setText("鍒ゅ畾"); @@ -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(); @@ -2692,24 +2705,26 @@ List<Map<String, Object>> tables2 = new ArrayList<>(); if (strings.contains("鐢佃矾璇曢獙")) { /*鍕鹃�夌殑鐢佃矾璇曢獙琛�*/ - for (InsReportDto2 insReportDto2 : insReportDto1.getInsReportDto2s()) { + List<InsReportDto2> dto2s = insReportDto1.getInsReportDto2s().stream().filter(insReportDto2 -> insReportDto2.getLaboratory().equals("鐢佃矾璇曢獙")).collect(Collectors.toList()); + for (InsReportDto2 insReportDto2 : dto2s) { InsOrderUser insOrderUser = insOrderUserMapper.selectById(insReportDto2.getInsOrderUsersId()); InsOrderState orderState = insOrderStateMapper.selectById(insOrderUser.getInsOrderStateId()); - if (orderState.getLaboratory().equals("鐢佃矾璇曢獙")) { - orderState.setNum(insOrderUser.getNum()); - if (!insOrder.getSampleType().equals("鏃犳簮鍣ㄤ欢")) { - getWord1(insOrderUser.getTerm(), orderState, tables2); - } else { - getWord2(insOrderUser.getTerm(), orderState, tables2); - } + orderState.setNum(insOrderUser.getNum()); + if (!insOrder.getSampleType().equals("鏃犳簮鍣ㄤ欢")) { + getWord1(insOrderUser.getTerm(), orderState, tables2); + } else { + getWord2(insOrderUser.getTerm(), orderState, tables2); } } } //杈愬皠琛ㄦ牸 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瀽鐨勮緪灏勭珯鐐规姤鍛�") @@ -2718,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 = "杈愬皠鏂瑰悜鍥惧弬鏁�"; } //鐜琛ㄦ牸 @@ -2948,27 +2965,26 @@ /*妫�楠屾牱鍝佷俊鎭�*/ //鏍峰搧鐓х墖 + List<UrlListDto> urlList = new ArrayList<>(); //鑾峰彇闄勪欢鍥剧墖绫诲瀷 - List<List<Map<String, Object>>> imageRows = new ArrayList<>(); - List<Map<String, Object>> currentRow = new ArrayList<>(); List<InsOrderFile> insOrderFiles = insOrderFileMapper.selectList(Wrappers.<InsOrderFile>lambdaQuery() .eq(InsOrderFile::getType, 1) .eq(InsOrderFile::getInsSampleId,insReportDto1.getSampleId()) .eq(InsOrderFile::getInsOrderId, orderId)); if (CollectionUtils.isNotEmpty(insOrderFiles)) { + UrlListDto urlListDto = new UrlListDto(); for (int i = 0; i < insOrderFiles.size(); i++) { - Map<String, Object> image = new HashMap<>(); - PictureRenderData pictureRenderData = Pictures.ofLocal(imgUrl + "/" + insOrderFiles.get(i).getFileUrl()).sizeInCm(8, 10).create(); - image.put("url", pictureRenderData); - currentRow.add(image); - if ((i + 1) % 2 == 0 || i == insOrderFiles.size() - 1) { - imageRows.add(currentRow); - currentRow = new ArrayList<>(); + 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 (!currentRow.isEmpty()) { - imageRows.add(currentRow); + } } //鏍峰搧缂栧彿鍙傜収涓婅堪sampleCode @@ -2990,20 +3006,17 @@ String insUser = insUserList.stream().map(insSampleUser -> { User user = userMapper.selectById(insSampleUser.getUserId()); return user.getName(); - }).collect(Collectors.joining(",")); + }).distinct().collect(Collectors.joining(",")); insUserDto.setInsUser(insUser);//娴嬭瘯浜哄憳 List<InsSampleUser> checkUserList = entry.getValue().stream().filter(insSampleUser -> insSampleUser.getState() == 1).collect(Collectors.toList());//澶嶆牳浜� String checkUser = checkUserList.stream().map(insSampleUser -> { User user = userMapper.selectById(insSampleUser.getUserId()); return user.getName(); - }).collect(Collectors.joining(",")); + }).distinct().collect(Collectors.joining(",")); insUserDto.setCheckUser(checkUser);//瀹℃牳浜哄憳 insUsers.add(insUserDto); index2++; } - - - /*娴嬭瘯浠〃*/ Set<String> deviceSet = new HashSet<>(); @@ -3048,6 +3061,7 @@ .bind("insProductList", new HackLoopTableRenderPolicy()) .bind("devList", new HackLoopTableRenderPolicy()) .bind("insUsers", new HackLoopTableRenderPolicy()) + .bind("urlList", new HackLoopTableRenderPolicy()) .build(); List<DevListDto> finalDevList = devList; String finalTitle = title3; @@ -3070,9 +3084,9 @@ put("insProductList", insProductList); //妫�楠屾儏鍐典竴瑙堣〃 put("tables2", tables2); //妫�娴嬬粨鏋� put("title3", finalTitle); //妫�娴嬬粨鏋� - put("tables3", tables3); //妫�娴嬬粨鏋� + put("tables3", null); //妫�娴嬬粨鏋� put("tables4", tables4); //妫�娴嬬粨鏋� - put("images", imageRows); //鏍峰搧鐓х墖 + put("urlList", urlList); //鏍峰搧鐓х墖 put("insUsers", insUsers); //妫�娴嬩汉鍛樹俊鎭� put("devList", finalDevList); //娴嬭瘯浠〃 put("writeUrl", null); //鎻愪氦浜� @@ -3198,8 +3212,40 @@ } catch (IOException e) { throw new RuntimeException(e); } - //鐩綍鏇存柊 - try{ + // 鏇存柊琛ㄥ崟 + 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); // 鏇存柊鐩綍 @@ -3207,12 +3253,10 @@ // 淇濆瓨鏂囨。 document.saveToFile(path, FileFormat.Docx); document.close(); - } - catch (Exception e) { - throw new RuntimeException(e); + }catch (Exception e){ + log.error(e.getMessage()); } } - //鐢佃矾鎶ュ憡鐢ㄤ簬鎬绘姤鍛婄殑鏂规硶(澶╃嚎) private void getWord1(String term, InsOrderState insOrderState, List<Map<String, Object>> tables2) { @@ -3365,7 +3409,7 @@ int qq = 0; int ss = 0; //琛ㄦ牸鐨勮鏁� - for (int i = 0; i <= aa+1; i++) { + for (int i = 0; i <= aa+1; i++) { RowRenderData rowRenderData = new RowRenderData(); RowStyle rowStyle = new RowStyle(); rowStyle.setHeight(40); @@ -3447,7 +3491,9 @@ paragraphRenderDataList.add(paragraphRenderData); cellRenderData.setParagraphs(paragraphRenderDataList); cells.add(cellRenderData); - } else { + } + else { + int u = i; i=i-1; if (insOrderState.getVersion() == 1) { //闈炵數璋冪増鏈�(绠�鍗曠増) @@ -4013,7 +4059,8 @@ cells.add(cellRenderData); } } - } else { + } + else { //鐢佃皟鐗堟湰(澶嶆潅鐗�) if (inspectionItemSubclass.contains("鐢靛帇椹绘尝姣�") && i <= (angles + 1) * portRow) { cc = (angles + 1) * portRow; @@ -5317,6 +5364,7 @@ } } } + i=u; } } rowRenderData.setCells(cells); @@ -5555,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