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("宋体"); + } + } + } + } + } + } }