diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/CivilEngineeringQualityInspectionOrderController.java b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/CivilEngineeringQualityInspectionOrderController.java index f50aaae91..f64ac07a1 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/CivilEngineeringQualityInspectionOrderController.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/CivilEngineeringQualityInspectionOrderController.java @@ -3,7 +3,6 @@ package com.zhgd.xmgl.modules.baotou.controller; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -18,7 +17,6 @@ import com.zhgd.xmgl.modules.basicdata.service.ISystemUserService; import com.zhgd.xmgl.util.EasyPoiUtil; import com.zhgd.xmgl.util.Fileutils; import com.zhgd.xmgl.util.FlowUtil; -import com.zhgd.xmgl.util.PathUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -322,7 +320,7 @@ public class CivilEngineeringQualityInspectionOrderController { } } File tempFile = File.createTempFile(IdUtil.simpleUUID(), ".docx"); - EasyPoiUtil.exportWord(map, url, tempFile); + EasyPoiUtil.exportNewLineWord(map, url, tempFile); EasyPoiUtil.wordToPdfExport(response, tempFile); } diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/ConfinedSpaceOperationController.java b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/ConfinedSpaceOperationController.java index 234b1bf6d..533a19ed7 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/ConfinedSpaceOperationController.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/ConfinedSpaceOperationController.java @@ -245,7 +245,7 @@ public class ConfinedSpaceOperationController { } } File tempFile = File.createTempFile(IdUtil.simpleUUID(), ".docx"); - EasyPoiUtil.exportWord(map, url, tempFile); + EasyPoiUtil.exportNewLineWord(map, url, tempFile); EasyPoiUtil.wordToPdfExport(response, tempFile); } diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/FirstOrderFireController.java b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/FirstOrderFireController.java index c88ba207e..e5dfb90b4 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/FirstOrderFireController.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/FirstOrderFireController.java @@ -324,7 +324,7 @@ public class FirstOrderFireController { } } File tempFile = File.createTempFile(IdUtil.simpleUUID(), ".docx"); - EasyPoiUtil.exportWord(map, url, tempFile); + EasyPoiUtil.exportNewLineWord(map, url, tempFile); EasyPoiUtil.wordToPdfExport(response, tempFile); } diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/HeightPermitController.java b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/HeightPermitController.java index 67e2b73e9..1bd6ed11b 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/HeightPermitController.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/HeightPermitController.java @@ -240,7 +240,7 @@ public class HeightPermitController { } } File tempFile = File.createTempFile(IdUtil.simpleUUID(), ".docx"); - EasyPoiUtil.exportWord(map, url, tempFile); + EasyPoiUtil.exportNewLineWord(map, url, tempFile); EasyPoiUtil.wordToPdfExport(response, tempFile); } diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/LiftingOperationController.java b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/LiftingOperationController.java index 16931f8a9..ca6c292ee 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/LiftingOperationController.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/LiftingOperationController.java @@ -265,7 +265,7 @@ public class LiftingOperationController { } File tempFile = File.createTempFile(IdUtil.simpleUUID(), ".docx"); - EasyPoiUtil.exportWord(map, url, tempFile); + EasyPoiUtil.exportNewLineWord(map, url, tempFile); EasyPoiUtil.wordToPdfExport(response, tempFile); } diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/NondestructiveTestOrderTicketController.java b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/NondestructiveTestOrderTicketController.java index 3c9da57a3..fbda433fb 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/NondestructiveTestOrderTicketController.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/NondestructiveTestOrderTicketController.java @@ -337,7 +337,7 @@ public class NondestructiveTestOrderTicketController { } } File tempFile = File.createTempFile(IdUtil.simpleUUID(), ".docx"); - EasyPoiUtil.exportWord(map, url, tempFile); + EasyPoiUtil.exportNewLineWord(map, url, tempFile); EasyPoiUtil.wordToPdfExport(response, tempFile); } diff --git a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/WitnessSamplingRecordController.java b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/WitnessSamplingRecordController.java index 1e886413e..4e7a84b24 100644 --- a/src/main/java/com/zhgd/xmgl/modules/baotou/controller/WitnessSamplingRecordController.java +++ b/src/main/java/com/zhgd/xmgl/modules/baotou/controller/WitnessSamplingRecordController.java @@ -183,7 +183,7 @@ public class WitnessSamplingRecordController { url = Fileutils.getExportTemplateFile("excel/work/见证取样记录模板.docx").getAbsolutePath(); File tempFile = File.createTempFile(IdUtil.simpleUUID(), ".docx"); - EasyPoiUtil.exportWord(map, url, tempFile); + EasyPoiUtil.exportNewLineWord(map, url, tempFile); EasyPoiUtil.wordToPdfExport(response, tempFile); } diff --git a/src/main/java/com/zhgd/xmgl/modules/exam/controller/ExamQuestionBankController.java b/src/main/java/com/zhgd/xmgl/modules/exam/controller/ExamQuestionBankController.java index 77bc3a368..a2aa0fc85 100644 --- a/src/main/java/com/zhgd/xmgl/modules/exam/controller/ExamQuestionBankController.java +++ b/src/main/java/com/zhgd/xmgl/modules/exam/controller/ExamQuestionBankController.java @@ -363,7 +363,7 @@ public class ExamQuestionBankController { List examQuestionOptionList = new ArrayList<>(); int index = 0; for (Map examQuestionBankImport : examQuestionBankImports) { - if (StringUtils.isNotBlank(examQuestionBankImport.get("*科目名称").trim())) { + if (examQuestionBankImport.get("*科目名称") != null && StringUtils.isNotBlank(examQuestionBankImport.get("*科目名称").trim())) { index++; List subjects = subList.stream().filter(s -> s.getName().equals(examQuestionBankImport.get("*科目名称").trim())).collect(Collectors.toList()); if (subjects == null || subjects.size() == 0) { @@ -395,7 +395,7 @@ public class ExamQuestionBankController { examQuestionBank.setUpdateBy(systemUser.getUserId().toString()); examQuestionBank.setUpdateTime(examQuestionBank.getCreateTime()); examQuestionBankList.add(examQuestionBank); - } else if (StringUtils.isNotBlank(examQuestionBankImport.get("*选项代码").trim())) { + } else if (examQuestionBankImport.get("*选项代码") != null && StringUtils.isNotBlank(examQuestionBankImport.get("*选项代码").trim())) { ExamQuestionOption examQuestionOption = new ExamQuestionOption(); examQuestionOption.setQuestionId((long) index); examQuestionOption.setOptionCode(examQuestionBankImport.get("*选项代码").trim()); @@ -416,7 +416,7 @@ public class ExamQuestionBankController { } return Result.ok("文件导入成功!数据行数:" + examQuestionBankImports.size()); } catch (Exception e) { - log.error(e.getMessage()); + log.error("通过excel导入题目管理信息:", e); return Result.error(e.getMessage()); } finally { try { 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 ca16aea8d..f6e3ddda2 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,9 +1,11 @@ package com.zhgd.xmgl.modules.exam.controller; -import cn.afterturn.easypoi.word.WordExportUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.zhgd.annotation.OperLog; @@ -15,24 +17,21 @@ import com.zhgd.xmgl.modules.exam.service.IExamTrainRecordService; import com.zhgd.xmgl.modules.exam.service.IExamTrainService; import com.zhgd.xmgl.modules.exam.vo.ExamQuestionBankVo; import com.zhgd.xmgl.modules.exam.vo.ExamTrainRecordVo; +import com.zhgd.xmgl.util.EasyPoiUtil; import com.zhgd.xmgl.util.Fileutils; -import com.zhgd.xmgl.util.WordUtils; +import com.zhgd.xmgl.util.PathUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; 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.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -175,11 +174,12 @@ public class ExamWorkerController { String recordId = MapUtils.getString(param, "recordId"); List questionBankVos = examTrainRecordService.getAnswerDetail(param); Map> typeMap = questionBankVos.stream().collect(Collectors.groupingBy(ExamQuestionBankVo::getType)); + HashMap imageMap = new HashMap<>(); //封装数据 Map params = new HashMap(); for (Map.Entry> entry : typeMap.entrySet()) { Integer key = entry.getKey(); - int i = 1; + int[] i = {1}; List list = entry.getValue(); if (CollUtil.isNotEmpty(list)) { ExamQuestionBankVo one = list.get(0); @@ -188,83 +188,68 @@ public class ExamWorkerController { BigDecimal total = NumberUtil.mul(list.size(), score); if (key == 1) { params.put("t1", "一、单选题:(每题" + score + "分,共计" + total + "分)"); - //遍历题目 - for (ExamQuestionBankVo question : list) { - content.append(" ").append(i++).append("、").append(question.getQuestionName()).append("\n").append(" "); - List optionList = question.getOptionList(); - //遍历选项 - for (ExamQuestionOption option : optionList) { - content.append(option.getOptionCode()).append("、").append(option.getOptionDesc()).append(" "); - } - content.append("\n"); - } + addOption(list, content, i, imageMap); params.put("c1", content.toString()); } else if (key == 2) { params.put("t2", "二、多选题:(每题" + one.getScore() + "分,共计" + total + "分、漏选少选得" + NumberUtil.div(one.getScore(), 2, 2) + "分,错选不得分。)"); //遍历题目 - for (ExamQuestionBankVo question : list) { - content.append(" ").append(i++).append("、").append(question.getQuestionName()).append("\n").append(" "); - List optionList = question.getOptionList(); - //遍历选项 - for (ExamQuestionOption option : optionList) { - content.append(option.getOptionCode()).append("、").append(option.getOptionDesc()).append(" "); - } - content.append("\n"); - } + addOption(list, content, i, imageMap); params.put("c2", content.toString()); } else { params.put("t3", "三、判断题(每题" + one.getScore() + "分,共" + total + "分,正确:打√,错误:打×)"); //遍历题目 - for (ExamQuestionBankVo question : list) { - content.append(" ").append(i++).append("、").append(question.getQuestionName()).append("\n").append(" "); - List optionList = question.getOptionList(); - //遍历选项 - for (ExamQuestionOption option : optionList) { - content.append(option.getOptionCode()).append("、").append(option.getOptionDesc()).append(" "); - } - content.append("\n"); - } + addOption(list, content, i, imageMap); params.put("c3", content.toString()); } } } - List> list = new ArrayList>(); - Map obj; - for (int i = 0; i < 5; i++) { - obj = new HashMap(); - obj.put("name", "abc-" + i); - obj.put("age", i); - obj.put("sex", "男-" + i); - list.add(obj); - } - params.put("objs", list); - String url; -// url = "C:\\Users\\Administrator\\Desktop\\下载试卷模板.docx"; - url = Fileutils.getExportTemplateFile("template/下载试卷模板.docx").getAbsolutePath(); -// - //jar包获取不到文件路径 - //URLDecoder.decode() 解决获取中文名称文件路径乱码 - String templatePath = URLDecoder.decode(FileUtil.file(url).getPath(), "UTF-8"); - + String tempUrl = Fileutils.getExportTemplateFile("template/下载试卷模板.docx").getAbsolutePath(); +// String tempUrl = "C:\\Users\\Administrator\\Desktop\\下载试卷模板.docx"; //生成word文档流 - XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); - //文本换行 - WordUtils.addBreakInCell(doc.getParagraphs()); - //设置响应体内容类型 - 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(); + EasyPoiUtil.exportNewLineWord(response, params, FileUtil.file(tempUrl)); + } catch (Exception e) { log.error("导出试卷出现异常", e); } } + /** + * 导出word添加题目和选项 + * + * @param list + * @param content + * @param i + * @param imageMap + */ + private void addOption(List list, StringBuilder content, int[] i, HashMap imageMap) { + //遍历题目 + for (ExamQuestionBankVo question : list) { + content.append(" ").append(i[0]).append("、"); + i[0] += 1; + if (StrUtil.isNotBlank(question.getPic())) { + JSONArray ja = JSON.parseArray(question.getPic()); + if (CollUtil.isNotEmpty(ja)) { + //保存图片占位符 + /*try { + String imageKey = "image" + i[0]; + imageMap.put(imageKey, EasyPoiUtil.imgFormatting(PathUtil.getBasePath() + "/" + ja.getJSONObject(0).getString("url"), 18, 18)); + content.append("{{" + imageKey + "}}"); + } catch (Exception e) { + log.error("导出word添加题目和选项错误", e); + }*/ + } + } + content.append(question.getQuestionName()).append("\n").append(" "); + List optionList = question.getOptionList(); + //遍历选项 + for (ExamQuestionOption option : optionList) { + content.append(option.getOptionCode()).append("、").append(option.getOptionDesc()).append(" "); + } + content.append("\n"); + } + } + + } diff --git a/src/main/java/com/zhgd/xmgl/util/EasyPoiUtil.java b/src/main/java/com/zhgd/xmgl/util/EasyPoiUtil.java index 68166e8ea..ba4173a9d 100644 --- a/src/main/java/com/zhgd/xmgl/util/EasyPoiUtil.java +++ b/src/main/java/com/zhgd/xmgl/util/EasyPoiUtil.java @@ -7,13 +7,43 @@ import com.documents4j.api.DocumentType; import com.documents4j.api.IConverter; import com.documents4j.job.LocalConverter; import com.zhgd.xmgl.modules.basicdata.entity.SystemUser; +import lombok.extern.slf4j.Slf4j; import org.apache.poi.xwpf.usermodel.XWPFDocument; import javax.servlet.http.HttpServletResponse; import java.io.*; +import java.net.URLDecoder; +import java.net.URLEncoder; import java.util.Map; +@Slf4j public class EasyPoiUtil { + /** + * 导出word + * + * @param response + * @param params + * @param file + * @throws Exception + */ + public static void exportNewLineWord(HttpServletResponse response, Map params, File file) throws Exception { + try { + XWPFDocument doc = WordExportUtil.exportWord07(URLDecoder.decode(file.getPath(), "UTF-8"), params); + WordUtils.addBreakInCell(doc.getParagraphs()); + //设置响应体内容类型 + 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(); + } catch (Exception e) { + log.error("exportNewLineWord:", e); + } + } /** * 根据模板导出word @@ -29,7 +59,27 @@ public class EasyPoiUtil { doc.write(fos); fos.close(); } catch (Exception e) { - e.printStackTrace(); + log.error("exportWord:", e); + } + } + + /** + * 根据模板导出word会换行的 + * + * @param map + * @param url + * @param tempFile + */ + public static void exportNewLineWord(Map map, String url, File tempFile) { + try { + XWPFDocument doc = WordExportUtil.exportWord07(url, map); + //文本换行 + WordUtils.addBreakInCell(doc.getParagraphs()); + FileOutputStream fos = new FileOutputStream(tempFile); + doc.write(fos); + fos.close(); + } catch (Exception e) { + log.error("exportNewLineWord:", e); } } @@ -84,10 +134,20 @@ public class EasyPoiUtil { return image; } + /** + * 导出项目子账号签名图片 + * + * @param u + * @param width + * @param height + * @return + */ public static Object getImgFromUser(SystemUser u, int width, int height) { if (u != null && StrUtil.isNotBlank(u.getElectronicSignature())) { return EasyPoiUtil.imgFormatting(PathUtil.getBasePath() + "/" + u.getElectronicSignature(), width, height); } return null; } + + }