From 737edb13930b9f450675cb8675fcf9ce5cd6cbf9 Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Mon, 17 Feb 2025 18:27:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8C=85=E5=A4=B4bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/PlanRecordServiceImpl.java | 3 +- .../exam/controller/ExamWorkerController.java | 6 +- .../java/com/zhgd/xmgl/util/EasyPoiUtil.java | 99 ++++++++++++++++++ .../java/com/zhgd/xmgl/util/WordUtils.java | 32 ++++++ src/main/resources/template/下载试卷模板.docx | Bin 29620 -> 29653 bytes 5 files changed, 138 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/plan/service/impl/PlanRecordServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/baotou/plan/service/impl/PlanRecordServiceImpl.java index d6b807829..a1db7310a 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/plan/service/impl/PlanRecordServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/plan/service/impl/PlanRecordServiceImpl.java @@ -16,6 +16,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Lists; import com.zhgd.jeecg.common.execption.OpenAlertException; import com.zhgd.jeecg.common.system.query.QueryGenerator; +import com.zhgd.xmgl.constant.Cts; import com.zhgd.xmgl.modules.baotou.plan.entity.*; import com.zhgd.xmgl.modules.baotou.plan.mapper.PlanRecordMapper; import com.zhgd.xmgl.modules.baotou.plan.service.*; @@ -96,7 +97,7 @@ public class PlanRecordServiceImpl extends ServiceImpl dealList(List list, HashMap param) { if (CollUtil.isNotEmpty(list)) { List alls = planRecordMapper.selectList(new LambdaQueryWrapper() - .eq(PlanRecord::getProjectSn, MapUtils.getString(param, "projectSn"))); + .eq(PlanRecord::getProjectSn, MapUtils.getString(param, "projectSn")).last(Cts.IGNORE_DATA_SCOPE_CONDITION)); Map> ridRateMap = this.getManyActualCompleteRates(alls); String approvalId = MapUtils.getString(param, "approvalId"); Map ridMap = planFeedbackApprovalWorkService.list(new LambdaQueryWrapper() diff --git a/src/main/java/com/zhgd/xmgl/modules/exam/controller/ExamWorkerController.java b/src/main/java/com/zhgd/xmgl/modules/exam/controller/ExamWorkerController.java index 48f101678..953f0eefa 100644 --- a/src/main/java/com/zhgd/xmgl/modules/exam/controller/ExamWorkerController.java +++ b/src/main/java/com/zhgd/xmgl/modules/exam/controller/ExamWorkerController.java @@ -1,5 +1,6 @@ package com.zhgd.xmgl.modules.exam.controller; +import cn.afterturn.easypoi.word.WordExportUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; @@ -36,6 +37,7 @@ import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.MapUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.web.bind.annotation.*; @@ -45,6 +47,8 @@ import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.math.BigDecimal; +import java.net.URLDecoder; +import java.net.URLEncoder; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -419,7 +423,7 @@ public class ExamWorkerController { // String dest = PathUtil.getBasePath() + "/temp/" + IdUtil.randomUUID() + "." + StrUtil.subAfter(url, ".", true); // HttpUtil.downloadFile(url, dest); // imageMap.put(imageKey, EasyPoiUtil.imgFormatting(dest, 18, 18)); -// content.append("{{" + imageKey + "}}"); +// content.append("##" + imageKey + "##"); // params.put(imageKey, imageMap.get(imageKey)); // } catch (Exception e) { // log.error("导出word添加题目和选项错误", e); diff --git a/src/main/java/com/zhgd/xmgl/util/EasyPoiUtil.java b/src/main/java/com/zhgd/xmgl/util/EasyPoiUtil.java index c427fa709..df4053f4a 100644 --- a/src/main/java/com/zhgd/xmgl/util/EasyPoiUtil.java +++ b/src/main/java/com/zhgd/xmgl/util/EasyPoiUtil.java @@ -3,6 +3,7 @@ package com.zhgd.xmgl.util; import cn.afterturn.easypoi.entity.ImageEntity; import cn.afterturn.easypoi.word.WordExportUtil; import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.documents4j.api.DocumentType; import com.documents4j.api.IConverter; @@ -11,15 +12,113 @@ import com.zhgd.xmgl.modules.basicdata.entity.SystemUser; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFParagraph; +import org.apache.poi.xwpf.usermodel.XWPFRun; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLDecoder; import java.net.URLEncoder; +import java.util.Iterator; +import java.util.List; import java.util.Map; +import java.util.Set; @Slf4j public class EasyPoiUtil { +// /** +// * 导出word和图片 +// * +// * @param response +// * @param params +// * @param file +// * @throws Exception +// */ +// public static void exportNewLineWordAndPic(HttpServletResponse response, Map params, File file) { +// XWPFDocument doc = null; +// FileOutputStream tempFos = null; +// try { +// //导出临时文件 +// doc = WordExportUtil.exportWord07(URLDecoder.decode(file.getPath(), "UTF-8"), params); +// WordUtils.addBreakInCellForExam(doc.getParagraphs()); +// +// //把######改成占位符{{}} +// List paragraphs = doc.getParagraphs(); +// Iterator itPara = paragraphs.iterator(); +// while (itPara.hasNext()) { +// XWPFParagraph paragraph = (XWPFParagraph) itPara.next(); +// List run = paragraph.getRuns(); +// for (int i = 0; i < run.size(); i++) { +// XWPFRun xwpfRun = run.get(i); +// String text = xwpfRun.getText(xwpfRun.getTextPosition()); +// if (text.contains("##")) { +// String replacedText = text.replaceAll("##(.*?)##", "{{}}{{$1}}{{}}"); +//// xwpfRun.setText(replacedText,0); +//// // 为剩余行创建新的 XWPFRun +//// for (int j = 1; j < lines.length; j++) { +//// XWPFRun newRun = paragraph.insertNewRun(i + j); // 插入新的 XWPFRun +//// newRun.setText("{{}}"); // 设置新行的文本 +//// // 复制原始 XWPFRun 的样式到新的 XWPFRun +//// newRun.setBold(run.isBold()); +//// newRun.setItalic(run.isItalic()); +//// newRun.setFontSize(run.getFontSize()); +//// newRun.setFontFamily(run.getFontFamily()); +//// } +// // 清空当前 run 的文本 +// xwpfRun.setText("", 0); +// +// // 将替换后的文本拆分为多个部分,并设置蓝色字体 +// String[] parts = replacedText.split("(?=\\{\\{)|(?<=\\}\\})"); +// for (String part : parts) { +// XWPFRun newRun = paragraph.insertNewRun(i++); // 插入新的 run +// newRun.setText(part); +// if (part.equals("{{}}")) { +// newRun.setColor("0000FF"); // 设置蓝色字体 +// } +// } +// } +// } +// } +// String tempName = IdUtil.randomUUID() + ".docx"; +// String tempPath = PathUtil.getBasePath() + "/temp/" + tempName; +// tempFos = new FileOutputStream(tempPath); +// doc.write(tempFos); +// tempFos.close(); +// doc.close(); +// +// //导出response +// doc = WordExportUtil.exportWord07(URLDecoder.decode(tempPath, "UTF-8"), params); +// //设置响应体内容类型 +// response.setContentType("application/octet-stream"); +// //添加响应头 +// response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("下载试卷.docx", "UTF-8")); +// //暴露新添加的响应头 +// response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); +// //将word文档流输出到输出流中 +// doc.write(response.getOutputStream()); +// //关闭流 +// doc.close(); +//// FileUtil.del(tempPath); +// } catch (Exception e) { +// log.error("exportNewLineWord:", e); +// } finally { +// if (doc != null) { +// try { +// doc.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// if (tempFos != null) { +// try { +// tempFos.close(); +// } catch (IOException e) { +// e.printStackTrace(); +// } +// } +// } +// } + /** * 导出word * diff --git a/src/main/java/com/zhgd/xmgl/util/WordUtils.java b/src/main/java/com/zhgd/xmgl/util/WordUtils.java index 28080674e..42bb736a4 100644 --- a/src/main/java/com/zhgd/xmgl/util/WordUtils.java +++ b/src/main/java/com/zhgd/xmgl/util/WordUtils.java @@ -82,4 +82,36 @@ public class WordUtils { } } } + + /** + * 文本换行 + */ + public static void addBreakInCellForExam(List paragraphs) { + for (XWPFParagraph p : paragraphs) { + List runs = p.getRuns(); + for (int i = 0; i < runs.size(); i++) { + XWPFRun run = runs.get(i); + String text = run.getText(0); // 获取完整文本 + if (text != null && text.contains("\n")) { + String[] lines = text.split("\n"); + if (lines.length > 0) { + // 设置第一行文本 + run.setText(lines[0], 0); + + // 为剩余行创建新的 XWPFRun + for (int j = 1; j < lines.length; j++) { + run.addBreak(); // 添加换行符 + XWPFRun newRun = p.insertNewRun(i + j); // 插入新的 XWPFRun + newRun.setText(lines[j]); // 设置新行的文本 + // 复制原始 XWPFRun 的样式到新的 XWPFRun + newRun.setBold(run.isBold()); + newRun.setItalic(run.isItalic()); + newRun.setFontSize(10); + newRun.setFontFamily("宋体"); + } + } + } + } + } + } } diff --git a/src/main/resources/template/下载试卷模板.docx b/src/main/resources/template/下载试卷模板.docx index e0887273533b00e0c8d76d11249f4f9866574a0e..dbbd121783013955420239baf389c0d411ec934a 100644 GIT binary patch delta 2822 zcmZ9OX*kpk7sls53@O=S3?}<7k$uTpO0s7kqaph;m>Dz}leL6Fe@odykrqqYBhttk zV+mQak4P${vOT@;dtL8yJ!1 zWBqS$LkyGZkJ1If@lB3Lmj%`%gn8j=k*O39{eA}j+5luOpvi7oH-(#{=6?{c5<6mH z9bd`aMLc4cwIQ#*o`@7FtEHpmBakkK&@#r2Dpuk+C5$b4k1KZfW`t@jxkYH`aE07$ z)lj|_;L(5x?Ur1~6N8O*5UhiQWW6TMcwXiC5^3L6w(fhXZ)%dr?*t`(?Nyk5A2+*a zDrE#ds}{BJwt`=IS*W5grr%-C5ngT?>GUa;8gmWtCEO>Q#9(=ufsq>mfgFL{G@sW$ zL%D_a{ImN=C6s~f+lghf z^2S3d+|dZy;l@VP?rG%d>i3Q})Gk$sp4W*%T8d^T<`}KulyJ;lXR_qFhn)@L>@Wk0 zx@V6VwVkh+bEd<*b8iI8-cd5;=FCB%6q8f#p6f`l*R+u^$L9y5GRffy$4+B^u~u0a z3wdE07qb@lSKuc(YmH^J+=CwtGYP{IxRoqNF{@U4>$Qc-oAme#<9N?RG|x!xM8mGX zOr0CuCFh}XmdB?|gA)&WEWU03{9H_Yl3Vt>lCe-Dqu8f2jtOg^#d9NIay{ee>>@$Q z@VUj_>yq~pu`D8|3X>huayd4f*Z27wJeIT$u19`oF8_Gd#Sazclq$Z|L3#Sg>_l4U z)9d)dtzXS--vUc|vunQ`GW>9!Z`$%UWZ7gGUE6?70rM|g6O61Ytxa=F(c?CHI}!)b zYBPoPSBlYf41q%%_g?91UAu8M77KE8T z{!W=yvDUkEP8qLyiyd;Se`@q6`~&`DXh>NMYT0htTlDx40p1Xb5?ayffvu>H7?uzE znuJM>yq2;Z+q-5{u4w>9)Ou5!AH)3)kepgy#}IXrkv)#8Yth7zku&Gxdz50guaPk| z-H+k0Q${Q^HJ-f@?e!0)U1IzmS7njTPFOcdE|c4w9K!0?U4Mk85F7e&(=&oainULp zPv>m=4is0Nx?jcb6d5(wGfOa~MTyMm*=f&y8E9B^4d1S@W?>wr`6ekS(FpoDY9f zjqyx5%0sj4#!_^ON?;*TtWU`MD{pY?hc?WTL=mk@hxMY-$Ep|Z5zbSr?Ipnmt9J(a z`%pRAX3>Cf)r}<7%R670Z9T5

_}S{`mmA9u=#*0Hj(NuF3&Jd0900fliWwWHfd` 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 I|GD%(00}1