diff --git a/pom.xml b/pom.xml index c4fc618..d7bf23c 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ 6.4.0 2.11.0 3.2.2 - 4.1.2 + 5.2.0 2.3 0.9.1 UTF-8 diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index e4cd4c5..f5db196 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -52,8 +52,23 @@ jfreechart 1.5.3 + + + aspose + aspose-words + 15.8.0-jdk16 + + + aspose + aspose-slides + 19.3 + - + + com.deepoove + poi-tl + 1.12.2 + com.itextpdf itextpdf diff --git a/ruoyi-admin/src/main/java/com/ruoyi/script/controller/PatientScriptController.java b/ruoyi-admin/src/main/java/com/ruoyi/script/controller/PatientScriptController.java index 101969e..ca4366b 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/script/controller/PatientScriptController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/script/controller/PatientScriptController.java @@ -83,7 +83,7 @@ public class PatientScriptController extends BaseController { */ @PostMapping("/exportReport") public void exportReport(HttpServletResponse response, @RequestParam("id") Long reportId) throws Exception { - this.patientScriptService.exportReport(response,reportId); + this.patientScriptService.exportReportTest(response,reportId); } @PostMapping("/test") diff --git a/ruoyi-admin/src/main/java/com/ruoyi/script/entity/PatientScript.java b/ruoyi-admin/src/main/java/com/ruoyi/script/entity/PatientScript.java index 2005570..527ac44 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/script/entity/PatientScript.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/script/entity/PatientScript.java @@ -72,6 +72,9 @@ public class PatientScript extends BaseEntity { private String shDoctor; //0否1是 private String isAll; + private String kydw; + private String fzr; + private String phone; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/script/service/PatientScriptService.java b/ruoyi-admin/src/main/java/com/ruoyi/script/service/PatientScriptService.java index 9bf9856..923ba53 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/script/service/PatientScriptService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/script/service/PatientScriptService.java @@ -20,6 +20,9 @@ public interface PatientScriptService { Boolean removeByIds(List idList); void exportReport(HttpServletResponse response, Long reportId) throws Exception; + void exportReportTest(HttpServletResponse response, Long reportId) throws Exception; + + void exportReport2(HttpServletResponse response, Long reportId) throws Exception; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/script/service/impl/PatientScriptServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/script/service/impl/PatientScriptServiceImpl.java index 189eb31..c112534 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/script/service/impl/PatientScriptServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/script/service/impl/PatientScriptServiceImpl.java @@ -1,6 +1,8 @@ package com.ruoyi.script.service.impl; import cn.hutool.core.date.DateUtil; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.data.Pictures; import com.itextpdf.text.*; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfChunk; @@ -11,6 +13,9 @@ import com.ruoyi.script.entity.PatientScript; import com.ruoyi.script.mapper.PatientScriptMapper; import com.ruoyi.script.service.PatientScriptService; import com.ruoyi.script.util.ShellUtil; +import com.ruoyi.script.util.Word2PdfUtil; +import com.ruoyi.script.util.WordToPdfConverter; +import com.ruoyi.script.util.WorldToPdf; import lombok.SneakyThrows; import org.apache.commons.compress.archivers.ArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; @@ -20,12 +25,17 @@ import org.apache.commons.compress.utils.IOUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.RandomUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.*; +import java.nio.channels.FileChannel; +import java.nio.channels.FileLock; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; @@ -34,6 +44,8 @@ import java.util.List; import java.util.concurrent.Executor; import static com.ruoyi.script.util.ShellUtil.shUtil; +import static com.ruoyi.script.util.WordToPdfConverter.convertToPdf; +import static com.ruoyi.script.util.WordToPdfConverter.replacePlaceholders; import static com.ruoyi.script.util.YmlUtil.createFile; import static com.ruoyi.system.util.pdfUtil.PdfUtil.chineseFont; import static com.ruoyi.system.util.pdfUtil.PdfUtil.getImageFromInputStream; @@ -927,6 +939,142 @@ public class PatientScriptServiceImpl implements PatientScriptService { } + @Override + public void exportReportTest(HttpServletResponse response, Long reportId) throws Exception { + PatientScript patientScript = scriptMapper.getById(reportId); + if (null==patientScript.getStatus()||patientScript.getStatus().equals("生成中")){ + return; + } + + String resInfo = patientScript.getResInfo(); + String[] brainList ={}; + //分类信息 + Map classMap = new HashMap<>(); + String[] correlationList ={}; + List msgList = new ArrayList<>(); + if (resInfo.contains("brain_regions:")){ + String[] split = resInfo.split("', '"); + String replace = split[0].replace("('brain_regions:", ""); + brainList = replace.split(","); + } + if (resInfo.contains("correlation:")){ + String[] split = resInfo.split("', '"); + String replace = split[1].replace("correlation:", "").replace("')",""); + correlationList = replace.split(","); + + } + for (String key : brainList) { + key = key.replaceAll(" ",""); + try { + MriInfo mriInfo = scriptMapper.getMriInfo(key.trim()); + if(StringUtils.isNotEmpty(mriInfo.getBrainInfo())){ + if (classMap.containsKey(mriInfo.getBrainStr())){ + classMap.put(mriInfo.getBrainStr(),classMap.get(mriInfo.getBrainInfo())+1); + + }else { + classMap.put(mriInfo.getBrainStr(),1); + msgList.add(mriInfo.getValue()); + } + } + + }catch (Exception e){ + + } + + } + + // Word 模板路径 + String wordTemplatePath = "/opt/mriTemp.docx"; + //随机十个生成的文件名称数组 + String[] fileNames = + {"output1.docx", "output2.docx", "output3.docx", "output4.docx", "output5.docx", "output6.docx", "output7.docx", "output8.docx", "output9.docx", "output10.docx"}; + //随机一个名字 + String fileName = fileNames[new Random().nextInt(fileNames.length)]; + String outPath = "/opt/"+fileName; + + + // 占位符和实际值的映射 + Map placeholders = new HashMap<>(); + placeholders.put("patientName", patientScript.getPatientName()); + placeholders.put("patientSex", patientScript.getPatientSex()); + placeholders.put("patientAge", patientScript.getPatientSex()); + + placeholders.put("patientCard", patientScript.getPatientCard()); + placeholders.put("blOrder", patientScript.getBlOrder()); + placeholders.put("scanPosition", patientScript.getScanPosition()); + + placeholders.put("scanDoctor", patientScript.getScanDoctor()); + placeholders.put("scanTime", DateUtil.format(patientScript.getScanTime(),"yyyy年MM月dd日")); + // 图片文件 + placeholders.put("image1", Pictures.ofLocal(patientScript.getResImage()).size(260, 260).create()); + // 图片文件 + placeholders.put("image2", Pictures.ofLocal(patientScript.getResImage().replace("Net","Net2")).size(260, 260).create()); + // 图片文件 + placeholders.put("image3", Pictures.ofLocal(patientScript.getResImage().replace("Net","Net3")).size(260, 260).create()); + // 图片文件 + placeholders.put("image4", Pictures.ofLocal(patientScript.getResImage().replace("Net","Net4")).size(260, 260).create()); + + placeholders.put("kydw", Optional.ofNullable(patientScript.getKydw()).orElse(" ")); + placeholders.put("fzr", Optional.ofNullable(patientScript.getFzr()).orElse(" ")); + placeholders.put("phone", Optional.ofNullable(patientScript.getPhone()).orElse(" ")); + String brainInfo = ""; + for (int i = 0; i < brainList.length; i++) { + if (i==brainList.length-1){ + brainInfo= brainInfo+brainList[i]; + }else { + brainInfo= brainInfo+brainList[i]+"\n"; + } + } + + placeholders.put("brainInfo",brainInfo); + + String joinInfo = ""; + for (int i = 0; i < correlationList.length; i++) { + if (i==correlationList.length-1){ + joinInfo= joinInfo+correlationList[i]; + }else { + joinInfo= joinInfo+correlationList[i]+"\n"; + } + } + placeholders.put("joinInfo",joinInfo); + final String[] diagInfo = {""}; + classMap.forEach((item, index)->{ + diagInfo[0] = diagInfo[0] +index+"个属于"+item+","; + }); + int idx = diagInfo[0].lastIndexOf(","); + diagInfo[0] = diagInfo[0].substring(0,idx); + diagInfo[0]=diagInfo[0]+"。"+"\n"; + for (int i = 0; i < msgList.size(); i++) { + if (i==msgList.size()-1){ + diagInfo[0]= diagInfo[0]+" "+msgList.get(i); + }else { + diagInfo[0]= diagInfo[0]+" "+msgList.get(i)+"\n"; + } + } + placeholders.put("diagInfo", " 异常脑区中,"+diagInfo[0]); + placeholders.put("resInfo", patientScript.getResInfo().equals("异常")?"孤独症谱系障碍":"正常发育个体"); + + placeholders.put("zdDoctor", patientScript.getZdDoctor()); + placeholders.put("shDoctor", patientScript.getShDoctor()); + try { + + // 文件操作 + XWPFTemplate template = XWPFTemplate.compile(new File(wordTemplatePath)).render( + placeholders); + template.writeAndClose(Files.newOutputStream(Paths.get(outPath))); + try { + Word2PdfUtil.wordConvertPdfFile(outPath,response.getOutputStream()); + } catch (Exception e) { + e.printStackTrace(); + } + + } catch (IOException e ) { + e.printStackTrace(); + } + } + + + /** * 生成六位随机数字 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/script/util/ConvertToMultipartFile.java b/ruoyi-admin/src/main/java/com/ruoyi/script/util/ConvertToMultipartFile.java new file mode 100644 index 0000000..b54c432 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/script/util/ConvertToMultipartFile.java @@ -0,0 +1,64 @@ +package com.ruoyi.script.util; + +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; + +public class ConvertToMultipartFile implements MultipartFile { + private byte[] fileBytes; + String name; + String originalFilename; + String contentType; + boolean isEmpty; + long size; + + public ConvertToMultipartFile(byte[] fileBytes, String name, String originalFilename, String contentType, + long size) { + this.fileBytes = fileBytes; + this.name = name; + this.originalFilename = originalFilename; + this.contentType = contentType; + this.size = size; + this.isEmpty = false; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getOriginalFilename() { + return originalFilename; + } + + @Override + public String getContentType() { + return contentType; + } + + @Override + public boolean isEmpty() { + return isEmpty; + } + + @Override + public long getSize() { + return size; + } + + @Override + public byte[] getBytes() throws IOException { + return fileBytes; + } + + @Override + public InputStream getInputStream() throws IOException { + return new ByteArrayInputStream(fileBytes); + } + + @Override + public void transferTo(File dest) throws IOException, IllegalStateException { + new FileOutputStream(dest).write(fileBytes); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/script/util/Word2PdfUtil.java b/ruoyi-admin/src/main/java/com/ruoyi/script/util/Word2PdfUtil.java new file mode 100644 index 0000000..66af859 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/script/util/Word2PdfUtil.java @@ -0,0 +1,108 @@ +package com.ruoyi.script.util; + +import com.aspose.words.Document; +import com.aspose.words.License; +import com.aspose.words.SaveFormat; + +import java.io.*; + +/** + * word转pdf工具类 + * + * @author shmily + */ +public class Word2PdfUtil { + + /** + * 许可证字符串(可以放到resource下的xml文件中也可) + */ + private static final String LICENSE = "" + + "" + + "Aspose.Total for JavaAspose.Words for Java" + + "Enterprise" + + "20991231" + + "20991231" + + "8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7" + + "" + + "sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=" + + ""; + + + /** + * 设置 license 去除水印 + */ + private static void setLicense() { + ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(LICENSE.getBytes()); + License license = new License(); + try { + license.setLicense(byteArrayInputStream); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * word 转 pdf 生成至指定路径,pdf为空则上传至word同级目录 + * + * @param wordPath word文件路径 + * @param pdfPath pdf文件路径 + */ + public static void wordConvertPdfFile(String wordPath, OutputStream outputStream) { + try { + setLicense(); + Document doc = new Document(wordPath); + doc.save(outputStream, SaveFormat.PDF); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + /** + * word 转 pdf 生成byte字节流 + * + * @param wordPath word所在的目录地址 + * @return + */ + public static byte[] wordConvertPdfByte(String wordPath) { + ByteArrayOutputStream fileOutputStream = null; + try { + setLicense(); + fileOutputStream = new ByteArrayOutputStream(); + Document doc = new Document(wordPath); + doc.save(fileOutputStream, SaveFormat.PDF); + return fileOutputStream.toByteArray(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + assert fileOutputStream != null; + fileOutputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + } + return null; + } + + + + /** + * 获取 生成的 pdf 文件路径,默认与源文件同一目录 + * + * @param wordPath word文件 + * @return 生成的 pdf 文件 + */ + private static String getPdfFilePath(String wordPath) { + int lastIndexOfPoint = wordPath.lastIndexOf("."); + String pdfFilePath = ""; + if (lastIndexOfPoint > -1) { + pdfFilePath = wordPath.substring(0, lastIndexOfPoint); + } + return pdfFilePath + ".pdf"; + } + +} + diff --git a/ruoyi-admin/src/main/java/com/ruoyi/script/util/WordToPdfConverter.java b/ruoyi-admin/src/main/java/com/ruoyi/script/util/WordToPdfConverter.java new file mode 100644 index 0000000..1c81249 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/script/util/WordToPdfConverter.java @@ -0,0 +1,91 @@ +package com.ruoyi.script.util; + +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFParagraph; +import org.apache.poi.xwpf.usermodel.XWPFRun; + +import com.itextpdf.text.Document; +import com.itextpdf.text.DocumentException; +import com.itextpdf.text.Paragraph; +import com.itextpdf.text.pdf.PdfWriter; + +import javax.servlet.ServletOutputStream; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class WordToPdfConverter { + + public static void main(String[] args) { +// // Word 模板路径 +// String wordTemplatePath = "template.docx"; +// // 输出 PDF 路径 +// String pdfOutputPath = "output.pdf"; +// +// // 占位符和实际值的映射 +// Map placeholders = new HashMap<>(); +// placeholders.put("${name}", "John Doe"); +// placeholders.put("${date}", "2023-10-15"); +// placeholders.put("${description}", "This is a sample description."); +// +// try { +// // 读取 Word 模板 +// XWPFDocument document = new XWPFDocument(new FileInputStream(wordTemplatePath)); +// +// // 替换占位符 +// replacePlaceholders(document, placeholders); +// +// // 将内容写入 PDF +//// convertToPdf(document, pdfOutputPath); +// +// System.out.println("PDF generated successfully!"); +// +// } catch (IOException | DocumentException e) { +// e.printStackTrace(); +// } + } + + /** + * 替换 Word 文档中的占位符 + */ + public static void replacePlaceholders(XWPFDocument document, Map placeholders) { + for (XWPFParagraph paragraph : document.getParagraphs()) { + List runs = paragraph.getRuns(); + if (runs != null) { + for (XWPFRun run : runs) { + String text = run.getText(0); + if (text != null) { + for (Map.Entry entry : placeholders.entrySet()) { + if (text.contains(entry.getKey())) { + text = text.replace(entry.getKey(), entry.getValue()); + run.setText(text, 0); + } + } + } + } + } + } + } + + /** + * 将 Word 文档内容写入 PDF + */ + public static void convertToPdf(XWPFDocument document, ServletOutputStream servletOutputStream) throws DocumentException, IOException { + Document pdfDocument = new Document(); + PdfWriter.getInstance(pdfDocument, servletOutputStream); + pdfDocument.open(); + + // 将 Word 文档的每一段内容写入 PDF + for (XWPFParagraph paragraph : document.getParagraphs()) { + String text = paragraph.getText(); + if (text != null && !text.isEmpty()) { + pdfDocument.add(new Paragraph(text)); + } + } + + pdfDocument.close(); + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/script/util/WordToPdfConverter2.java b/ruoyi-admin/src/main/java/com/ruoyi/script/util/WordToPdfConverter2.java new file mode 100644 index 0000000..d86d9c7 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/script/util/WordToPdfConverter2.java @@ -0,0 +1,39 @@ +package com.ruoyi.script.util; + +import lombok.var; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException; + +import java.io.InputStream; +import java.io.FileOutputStream; +import java.io.IOException; + +public class WordToPdfConverter2 { + + public static void main(String[] args) { + // 模板文件路径(相对于 resources 目录) + String templatePath = "static/mriTemp.docx"; + + try (InputStream inputStream = WordToPdfConverter.class.getClassLoader().getResourceAsStream(templatePath)) { + if (inputStream == null) { + System.err.println("模板文件未找到: " + templatePath); + return; + } + + // 读取 Word 模板 + XWPFDocument document = new XWPFDocument(inputStream); + + // 打印文档内容(测试用) + for (var paragraph : document.getParagraphs()) { + System.out.println(paragraph.getText()); + } + + System.out.println("模板读取成功!"); + + } catch (NotOfficeXmlFileException e) { + System.err.println("文件格式不正确,请确保是 .docx 文件: " + e.getMessage()); + } catch (IOException e) { + System.err.println("读取文件时发生错误: " + e.getMessage()); + } + } +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/script/util/WorldToPdf.java b/ruoyi-admin/src/main/java/com/ruoyi/script/util/WorldToPdf.java new file mode 100644 index 0000000..93a3435 --- /dev/null +++ b/ruoyi-admin/src/main/java/com/ruoyi/script/util/WorldToPdf.java @@ -0,0 +1,71 @@ +package com.ruoyi.script.util; + +import com.deepoove.poi.XWPFTemplate; +import com.documents4j.api.DocumentType; +import com.documents4j.api.IConverter; +import com.documents4j.job.LocalConverter; + + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Map; + +public class WorldToPdf { + + /** + * 在Word模版中写入指定内容 + * @param filePath 模版文件地址 + * @param targetPath 生成文件的目标地址 + * @param map 填充内容 + * @throws IOException + */ + public static void writForTemplate(String filePath, String targetPath, Map map) throws IOException { + + XWPFTemplate template = XWPFTemplate.compile(filePath).render(map); + + template.writeAndClose(Files.newOutputStream(Paths.get(targetPath))); + } + + /** + * + * @param wordPath word 文件路径 + * @param pdfPath pdf 输出路径 + * @throws IOException + */ + public static void wordConvertPdf(String wordPath, OutputStream outputStream) throws IOException { + try { +// // Load the Word document +// WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File(wordPath)); +// +// +// Docx4J.toPDF(wordMLPackage, outputStream); +// +// System.out.println("Word document converted to PDF successfully."); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * + * @param wordPath word 文件路径 + * @param pdfPath pdf 输出路径 + * @throws IOException + */ + public static void wordConvertPdfs(String wordPath, String pdfPath) throws IOException { + InputStream wordInputStream = Files.newInputStream(Paths.get(wordPath)); + // 转成 pdf + OutputStream outputStream = Files.newOutputStream(Paths.get(pdfPath)); + IConverter converter = LocalConverter.builder().build(); + converter.convert(wordInputStream).as(DocumentType.DOCX).to(outputStream).as(DocumentType.PDF).execute(); + converter.shutDown(); + } + + // 文件转换 + + // 文件转换 + + +} diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/overdue/OverdueController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/overdue/OverdueController.java index e2c9b48..c32353d 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/overdue/OverdueController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/overdue/OverdueController.java @@ -13,8 +13,11 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; import java.io.FileWriter; import java.text.SimpleDateFormat; +import java.util.Base64; import java.util.Date; /** @@ -61,4 +64,26 @@ public class OverdueController { } return R.ok("激活成功"); } + + + + // 加密算法 + private static final String ALGORITHM = "AES"; + // 常量密钥 + private static final String SECRET_KEY = "jinanshandongdianliangxinxijishu"; + + public static void main(String[] args) throws Exception { + String data = "山东点亮20250311175500信息技术"; + SecretKeySpec keySpec = generateKey(); + Cipher cipher = Cipher.getInstance(ALGORITHM); + cipher.init(Cipher.ENCRYPT_MODE, keySpec); + byte[] encryptedBytes = cipher.doFinal(data.getBytes()); + System.err.println(Base64.getEncoder().encodeToString(encryptedBytes)); + } + + // 生成密钥 + private static SecretKeySpec generateKey() throws Exception { + byte[] keyBytes = SECRET_KEY.getBytes(); + return new SecretKeySpec(keyBytes, ALGORITHM); + } } diff --git a/ruoyi-admin/src/main/resources/META-INF/services/javax.xml.transform.TransformerFactory b/ruoyi-admin/src/main/resources/META-INF/services/javax.xml.transform.TransformerFactory new file mode 100644 index 0000000..e69de29 diff --git a/ruoyi-admin/src/main/resources/static/mriTemp.docx b/ruoyi-admin/src/main/resources/static/mriTemp.docx new file mode 100644 index 0000000..a7d4a66 Binary files /dev/null and b/ruoyi-admin/src/main/resources/static/mriTemp.docx differ diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index da86223..0e66c10 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -52,13 +52,13 @@ org.apache.commons commons-lang3 - + com.fasterxml.jackson.core jackson-databind - + com.baomidou @@ -83,7 +83,17 @@ org.apache.poi poi-ooxml - + + + com.documents4j + documents4j-local + 1.0.3 + + + com.documents4j + documents4j-transformer-msoffice-word + 1.0.3 + org.yaml @@ -133,5 +143,8 @@ - - \ No newline at end of file + + 1.8 + 1.8 + + diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java index f7aaca5..7cd8d4f 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java @@ -5,13 +5,14 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import java.math.BigDecimal; + +import com.ruoyi.common.utils.poi.ExcelHandlerAdapter; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.IndexedColors; -import com.ruoyi.common.utils.poi.ExcelHandlerAdapter; /** * 自定义导出Excel数据注解 - * + * * @author ruoyi */ @Retention(RetentionPolicy.RUNTIME) @@ -184,4 +185,4 @@ public @interface Excel return this.value; } } -} \ No newline at end of file +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java index c6489e2..3937e06 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -87,7 +87,7 @@ import com.ruoyi.common.utils.reflect.ReflectUtils; /** * Excel相关处理 - * + * * @author ruoyi */ public class ExcelUtil @@ -279,7 +279,7 @@ public class ExcelUtil /** * 对excel表单默认第一个索引名转换成list - * + * * @param is 输入流 * @return 转换后集合 */ @@ -290,7 +290,7 @@ public class ExcelUtil /** * 对excel表单默认第一个索引名转换成list - * + * * @param is 输入流 * @param titleNum 标题占用行数 * @return 转换后集合 @@ -302,7 +302,7 @@ public class ExcelUtil /** * 对excel表单指定表格索引名转换成list - * + * * @param sheetName 表格索引名 * @param titleNum 标题占用行数 * @param is 输入流 @@ -482,7 +482,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param list 导出数据集合 * @param sheetName 工作表的名称 * @return 结果 @@ -494,7 +494,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param list 导出数据集合 * @param sheetName 工作表的名称 * @param title 标题 @@ -508,7 +508,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param response 返回数据 * @param list 导出数据集合 * @param sheetName 工作表的名称 @@ -521,7 +521,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param response 返回数据 * @param list 导出数据集合 * @param sheetName 工作表的名称 @@ -538,7 +538,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param sheetName 工作表的名称 * @return 结果 */ @@ -549,7 +549,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param sheetName 工作表的名称 * @param title 标题 * @return 结果 @@ -562,7 +562,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param sheetName 工作表的名称 * @return 结果 */ @@ -573,7 +573,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param sheetName 工作表的名称 * @param title 标题 * @return 结果 @@ -588,7 +588,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @return 结果 */ public void exportExcel(HttpServletResponse response) @@ -610,7 +610,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @return 结果 */ public AjaxResult exportExcel() @@ -678,7 +678,7 @@ public class ExcelUtil /** * 填充excel数据 - * + * * @param index 序号 * @param row 单元格行 */ @@ -749,7 +749,7 @@ public class ExcelUtil /** * 创建表格样式 - * + * * @param wb 工作薄对象 * @return 样式列表 */ @@ -802,7 +802,7 @@ public class ExcelUtil /** * 根据Excel注解创建表格头样式 - * + * * @param wb 工作薄对象 * @return 自定义样式列表 */ @@ -835,7 +835,7 @@ public class ExcelUtil /** * 根据Excel注解创建表格列样式 - * + * * @param wb 工作薄对象 * @return 自定义样式列表 */ @@ -897,7 +897,7 @@ public class ExcelUtil /** * 设置单元格信息 - * + * * @param value 单元格值 * @param attr 注解相关 * @param cell 单元格信息 @@ -1061,7 +1061,7 @@ public class ExcelUtil /** * 设置 POI XSSFSheet 单元格提示或选择框 - * + * * @param sheet 表单 * @param textlist 下拉框显示的内容 * @param promptContent 提示内容 @@ -1098,7 +1098,7 @@ public class ExcelUtil /** * 设置某些列的值只能输入预制的数据,显示下拉框(兼容超出一定数量的下拉框). - * + * * @param sheet 要设置的sheet. * @param textlist 下拉框显示的内容 * @param promptContent 提示内容 @@ -1150,7 +1150,7 @@ public class ExcelUtil /** * 解析导出值 0=男,1=女,2=未知 - * + * * @param propertyValue 参数值 * @param converterExp 翻译注解 * @param separator 分隔符 @@ -1187,7 +1187,7 @@ public class ExcelUtil /** * 反向解析值 男=0,女=1,未知=2 - * + * * @param propertyValue 参数值 * @param converterExp 翻译注解 * @param separator 分隔符 @@ -1224,7 +1224,7 @@ public class ExcelUtil /** * 解析字典值 - * + * * @param dictValue 字典值 * @param dictType 字典类型 * @param separator 分隔符 @@ -1237,7 +1237,7 @@ public class ExcelUtil /** * 反向解析值字典值 - * + * * @param dictLabel 字典标签 * @param dictType 字典类型 * @param separator 分隔符 @@ -1250,7 +1250,7 @@ public class ExcelUtil /** * 数据处理器 - * + * * @param value 数据值 * @param excel 数据注解 * @return @@ -1327,7 +1327,7 @@ public class ExcelUtil /** * 获取下载路径 - * + * * @param filename 文件名称 */ public String getAbsoluteFile(String filename) @@ -1343,7 +1343,7 @@ public class ExcelUtil /** * 获取bean中的属性值 - * + * * @param vo 实体对象 * @param field 字段 * @param excel 注解 @@ -1374,7 +1374,7 @@ public class ExcelUtil /** * 以类的属性的get方法方法形式获取值 - * + * * @param o * @param name * @return value @@ -1480,7 +1480,7 @@ public class ExcelUtil /** * 创建工作表 - * + * * @param sheetNo sheet数量 * @param index 序号 */ @@ -1497,7 +1497,7 @@ public class ExcelUtil /** * 获取单元格值 - * + * * @param row 获取的行 * @param column 获取单元格列号 * @return 单元格值 @@ -1557,7 +1557,7 @@ public class ExcelUtil /** * 判断是否是空行 - * + * * @param row 判断的行 * @return */ @@ -1634,8 +1634,8 @@ public class ExcelUtil XSSFPicture pic = (XSSFPicture) shape; XSSFClientAnchor anchor = pic.getPreferredSize(); CTMarker ctMarker = anchor.getFrom(); - String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); - sheetIndexPicMap.put(picIndex, pic.getPictureData()); +// String picIndex = ctMarker.getRow() + "_" + ctMarker.getCol(); +// sheetIndexPicMap.put(picIndex, pic.getPictureData()); } } } @@ -1645,7 +1645,7 @@ public class ExcelUtil /** * 格式化不同类型的日期对象 - * + * * @param dateFormat 日期格式 * @param val 被格式化的日期对象 * @return 格式化后的日期字符 @@ -1711,7 +1711,7 @@ public class ExcelUtil /** * 获取对象的子列表方法 - * + * * @param name 名称 * @param pojoClass 类对象 * @return 子列表方法 diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/constants/Constants.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/constants/Constants.java index fe4bbc7..f6e05ed 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/constants/Constants.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/constants/Constants.java @@ -6,5 +6,5 @@ public interface Constants { // 常量密钥 String SECRET_KEY = "jinanshandongdianliangxinxijishu"; //密钥存储文件地址 - String KEY_FILE_PATH = "E:/overdue.txt"; -} \ No newline at end of file + String KEY_FILE_PATH = "D:/overdue.txt"; +}