当前位置: 首页 > news >正文

java 实现导出word 自定义word 使用aspose教程包含图片 for 循环 自定义参数等功能

java 实现导出word 主要有一下几个知识点

  • 1,aspose导入 jar包 和 java编写基础代码
    • 下载使用 aspose-words jar包
    • 导入 aspose jar 包 使用 maven导入
    • java代码编写
  • 2,if判断 是否显示
  • 2,显示指定值
  • 3,循环显示List 集合列表 使用 foreach
  • 4,显示图片 ,

1,aspose导入 jar包 和 java编写基础代码

下载使用 aspose-words jar包

我使用的是 aspose-words-23.3 版本的
之前版本的导出大量word内容容易报错 使用新版解决此问题

导入 aspose jar 包 使用 maven导入

mvn install:install-file -DgroupId=aspose-words -DartifactId=aspose-words -Dversion=23.3 -Dpackaging=jar -Dfile=G:\你的windows电脑的jar包路径\aspose-word\aspose-words-23.3-jdk16.jar

java代码编写

首选新建一个工具类方法

public class QualityConstants {/*** 质量检测 的督导事项id*/public static final int EVENTID = 12;/*** 数字0*/public static final int NUM_ZERO = 0;/*** 数字1*/public static final int NUM_ONE = 1;/*** 数字2*/public static final int NUM_TWO = 2;/*** 数字-1*/public static final int NUM_MINUS_1 = -1;/*** 字节大小512*/public static final int BYTE_512 = 512;/*** 500错误编码*/public static final int CODE_500 = 500;/*** 500错误提示信息 - 状态非法*/public static final String CODE_500_MSG_1 = "状态非法!";/*** 500错误提示信息 - 非督导用户不允许查看质量检测记录*/public static final String CODE_500_MSG_2 = "非督导用户不允许查看质量检测记录!";/*** 500错误提示信息 - 这条质量监测已经完成!无法修改*/public static final String CODE_500_MSG_3 = "这条质量监测已经完成!无法修改!";/*** 500错误提示信息 - 提交失败,材料上传不能为空*/public static final String CODE_500_MSG_4 = "提交失败,材料上传不能为空";/*** 500错误提示信息 - 提交失败,请稍后重试或联系管理员*/public static final String CODE_500_MSG_5 = "提交失败,请稍后重试或联系管理员!";/*** 500错误提示信息 - 提交失败,意见反馈不能为空*/public static final String CODE_500_MSG_6 = "提交失败,意见反馈不能为空!";/*** 405错误编码*/public static final int CODE_405 = 405;/*** 405错误提示信息 - 该信息只允许督导查看*/public static final String CODE_405_MSG_1 = "该信息只允许督导查看!";/*** 200成功编码*/public static final int CODE_200 = 200;/*** 200成功提示信息 - 该信息只允许督导查看*/public static final String CODE_200_MSG_1 = "提交成功!";/*** 错误提示信息 - 尚未选择记录*/public static final String DELETE_FAIRURE_MSG = "删除失败,尚未选择记录!";/*** 错误提示信息 - 尚未选择记录*/public static final String NO_RECORD_SELECTED = "尚未选择记录!";/*** 字符编码utf-8*/public static final String UTF_8 = "utf-8";/*** 默认pid*/public static final int PID = 0;/*** 默认层级*/public static final int DEFUALT_LAYER = 1;/*** 不适当最低得分*/public static final Integer MIN_SCORE = 1;/*** 优秀最高得分*/public static final Integer MAX_SCORE = 7;/*** map的hash初始值*/public static final int HASH_MAP_INIT_VALUE = 32;/*** 全园平均分*/public final static String WHOLE_AVERAGE = "全园平均分";/*** 查询失败*/public final static String QUERY_FAIRURE = "查询失败";/*** 操作成功*/public final static String SUCCESS_MSG = "操作成功!";/*** 操作失败*/public final static String FARIURE_MSG = "操作失败!";/*** 导出失败*/public final static String FARIURE_EXPORT = "导出失败!";/*** 请求头 - 文档*/public final static String CONTENT_TYPE_WORD = "application/msword";/*** 请求头 - 下载*/public final static String CONTENT_TYPE_DOWNLOAD = "application/x-download";/*** 请求头 - 二进制文件*/public final static String CONTENT_TYPE_STEAM = "application/octet-stream;charset=UTF-8";/*** 请求头*/public final static String USER_AGENT = "User-Agent";/*** 请求头*/public final static String CONTENT_TYPE = "Content-Type";/*** 连接*/public final static String CONNECTION = "Connection";/*** 关闭连接*/public final static String CLOSE = "close";/*** 连接*/public final static String ACCESS_CONTROL_ALLOW_ORIGIN = "Access-Control-Allow-Origin";/*** 连接*/public final static String CONTENT_DISPOSITION = "Content-Disposition";/*** 浏览器 - ie*/public final static String MSIE = "MSIE";/*** 浏览器 - Firefox*/public final static String FIREFOX = "Firefox";/*** 填写报告的step*/public final static String MODULE_STEP3_REPORT = "qualityreport";/*** 督导下园核实的材料*/public final static String MODULE_STEP1_MATERIAL = "qualitymetrail";/*** 数字3*/public final static int NUM_3 = 3;/*** 数字4*/public final static int NUM_4 = 4;/*** 数字5*/public final static int NUM_5 = 5;/*** 数字6*/public final static int NUM_6 = 6;/*** 数字7*/public final static int NUM_7 = 7;/*** 数字8*/public final static int NUM_8 = 8;/*** 数字9*/public final static int NUM_9 = 9;/*** 数字10*/public final static int NUM_10 = 10;/*** 数字11*/public final static int NUM_11 = 11;/*** 数字12*/public final static int NUM_12 = 12;/*** 数字13*/public final static int NUM_13 = 13;/*** 数字14*/public final static int NUM_14 = 14;/*** 数字15*/public final static int NUM_15 = 15;/*** 数字16*/public final static int NUM_16 = 16;/*** 数字17*/public final static int NUM_17 = 17;/*** 数字18*/public final static int NUM_18 = 18;/*** 数字19*/public final static int NUM_19 = 19;/*** 数字20*/public final static int NUM_20 = 20;/*** 格式化数字*/public final static String DECIMAL_Format = "######.00";}

以下为实现post导出 并且删除新生成的文件代码 需要借助工具类
传入map json的方式获取参数

@PostMapping("/Export")@ResponseBodypublic void ExportWord(@RequestBody Map<String, Object> json, HttpServletRequest request, HttpServletResponse response) throws Exception {String filePath = "/xxx/xxx/xx/要生成的临时word地址和名称.docx";String tempName = "/xxx/xxx/xx/你的word模版地址和名称.docx";com.aspose.words.Document doc = new com.aspose.words.Document(tempName);Map<String, Object> map = new HashMap<>();XXX  XX= new XXX();  //XXX   为你的 word要的数据的实体类 自己建 这个XXX 包含word所有需要的字段 图片 和循环体XX.setTitle(json.get("title").toString());  //标题
//        图片 base64  传入BufferedImage image = decodeBase64Image(json.get("image").toString()); //json格式传入的base64图片/**** 这里获取图片可以用路径的方式 不使用base64传进来*///BufferedImage image =  ImageIO.read(new FileInputStream("/home/123.png"));//BufferedImage bufferedImage = Utils.resizeBufferedImage(image, 100, 100, false);scivalword.setImg(image );setParams(doc, scivalword);doc.save(filePath);File file = new File(filePath);//world输出流操作InputStream fin = null;OutputStream out = null;try {fin = new FileInputStream(file);response.setCharacterEncoding(QualityConstants.UTF_8);response.setContentType(QualityConstants.CONTENT_TYPE_WORD);String filename = "demo";String agent = request.getHeader(QualityConstants.USER_AGENT);String filenameEncoder = "";// 根据不同的浏览器进行不同的判断if (agent.contains(QualityConstants.MSIE)) {// IE浏览器filenameEncoder = URLEncoder.encode(filename, QualityConstants.UTF_8);filenameEncoder = filenameEncoder.replace("+", " ");} else if (agent.contains(QualityConstants.FIREFOX)) {// 火狐浏览器BASE64Encoder base64Encoder = new BASE64Encoder();filenameEncoder = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes(StandardCharsets.UTF_8)) + "?=";} else {// 其它浏览器filenameEncoder = URLEncoder.encode(filename, QualityConstants.UTF_8);}response.setHeader(QualityConstants.ACCESS_CONTROL_ALLOW_ORIGIN, "*");//所有域都可以跨response.setHeader(QualityConstants.CONTENT_TYPE, QualityConstants.CONTENT_TYPE_STEAM);//二进制  流文件response.setHeader(QualityConstants.CONTENT_DISPOSITION, "attachment;filename=" + filenameEncoder + ".doc");//下载及其文件名response.setHeader(QualityConstants.CONNECTION, QualityConstants.CLOSE);//关闭请求头连接//设置文件在浏览器打开还是下载response.setContentType(QualityConstants.CONTENT_TYPE_DOWNLOAD);out = response.getOutputStream();byte[] buffer = new byte[QualityConstants.BYTE_512];int bytesToRead = QualityConstants.NUM_MINUS_1;// 通过循环将读入的Word文件的内容输出到浏览器中while ((bytesToRead = fin.read(buffer)) != QualityConstants.NUM_MINUS_1) {out.write(buffer, QualityConstants.NUM_ZERO, bytesToRead);}} catch (Exception e) {System.out.println("导出异常");} finally {try {//这里最后删除文件if (fin != null) {fin.close();}if (out != null) {out.flush();out.close();}if (file != null) {file.delete();}} catch (IOException e) {System.out.println("导出异常");}}}private static void setParams(Document doc, XXX vo) throws Exception { //XXX   为你的 word要的数据的实体类 自己建 这个XXX 包含word所有需要的字段 图片 和循环体ReportingEngine engines = new ReportingEngine();engines.getKnownTypes().add(xxxxx.class);//加入实体类类型 - 在foreach中用到 engines.buildReport(doc, new Object[]{vo}, new String[]{"st"});}//获取当前日期的年月日public static String getCurrentDate() {Date currentDate = new Date();SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年 MM月dd日");return dateFormat.format(currentDate);}
//把字符串类型的base64图片转换成IO流给buffere public static BufferedImage decodeBase64Image(String base64Image) {try {byte[] imageData = Base64.getDecoder().decode(base64Image);ByteArrayInputStream inputStream = new ByteArrayInputStream(imageData);return ImageIO.read(inputStream);} catch (Exception e) {e.printStackTrace();return null;}}

上面的代码中包含 图片 和实体类 for循环就是要在你的实体类里面插入一个 list 然后往这个list里面插入值以后
在这里插入图片描述
这里需要加入你要插入循环的实体类 给word里面获取实体类使用

在这里插入图片描述
比如我的实体类里面就有这些list 那么这些list里面的 bo就需要插入到上面的图片里面

上的代码中
XXX 为你的实体类自己创建 可以创建一个 默认的 比如

public class XXX{//注意 get set 方法一定要有private String title;private BufferedImage img;private List<entityBo> entitbo;
}

2,if判断 是否显示

这里用到word里面的if判断了
如图
在这里插入图片描述

<<if [st.getTitle() != null ]>> <<[st.getTitle()]>> <>
这里就判断了如果 传入的title不为空的情况下再进行显示

2,显示指定值

在这里插入图片描述
直接使用 就可以显示值

3,循环显示List 集合列表 使用 foreach

在这里插入图片描述

这里用到了 entitylist 进行了for循环 xxxx为
在这里插入图片描述
这里显示的实体类 必须在这里加入 否则会报错和无法使用
注意 开始 foreach就要有结束的 foreach 相对应的都是 类似于 xml格式的 word导出

注意 “String[]{“st”}” st表示在word里面的初始名称 调用关键字 比如你的实体类里面有title的字段 就用 st.getTitle() 就可以调用 如果是list就是 st.getList() 就可以调用

4,显示图片 ,

显示图片就是你的baset64复值给实体类传入以后 打开你的 word
在这里插入图片描述
点击文本框
插入到里面 在里面写入bo的img名称即可
如图
在这里插入图片描述
如果不想要外边框可以使用
在这里插入图片描述
属性里面的内容设置成无即可

附赠一个 word
在这里插入图片描述


相关文章:

java 实现导出word 自定义word 使用aspose教程包含图片 for 循环 自定义参数等功能

java 实现导出word 主要有一下几个知识点 1&#xff0c;aspose导入 jar包 和 java编写基础代码下载使用 aspose-words jar包导入 aspose jar 包 使用 maven导入java代码编写 2&#xff0c;if判断 是否显示2&#xff0c;显示指定值3&#xff0c;循环显示List 集合列表 使用 fore…...

CSS动画(炫酷表单)

1.整体效果 https://mmbiz.qpic.cn/sz_mmbiz_gif/EGZdlrTDJa6yORMSqiaEKgpwibBgfcTQZNV0pI3M8t8HQm5XliaicSO42eBiboEUC3jxQOL1bRe0xlsd8bv04xXoKwg/640?wx_fmtgif&fromappmsg&wxfrom13 表单&#xff0c;也需要具有吸引力和实用性。HTML源码酷炫表单不仅能够提供给用户…...

Stream

Stream 也叫Stream流&#xff0c;是Jdk8开始新增的一套API (java.util.stream.*)&#xff0c;可以用于操作集合或者数组的数据。 优势&#xff1a; Stream流大量的结合了Lambda的语法风格来编程&#xff0c;提供了一种更加强大&#xff0c;更加简单的方式操作集合或者数组中的…...

鸿蒙轻内核A核源码分析系列五 虚实映射(5)虚实映射解除

虚实映射解除函数LOS_ArchMmuUnmap解除进程空间虚拟地址区间与物理地址区间的映射关系&#xff0c;其中参数包含MMU结构体、解除映射的虚拟地址和解除映射的数量count,数量的单位是内存页数。 ⑴处函数OsGetPte1用于获取指定虚拟地址对应的L1页表项数据。⑵处计算需要解除的无效…...

编程初学者用什么软件电脑:全方位指南及深度解析

编程初学者用什么软件电脑&#xff1a;全方位指南及深度解析 在数字化浪潮席卷而来的今天&#xff0c;编程技能逐渐成为了一项必备的基本素养。对于初学者来说&#xff0c;选择一款合适的编程软件电脑至关重要。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;深…...

代理IP池功能组件

1.IP池管理器&#xff1a;用于管理IP池&#xff0c;包括IP地址的添加、删除、查询和更新等操作。 2.代理IP获取器&#xff1a;用于从外部资源中获取代理IP&#xff0c;例如从公开代理IP网站上爬取代理IP、从代理服务商订购代理IP等。 3.IP质量检测器&#xff1a;用于检测代理…...

Sqlite3入门和c/c++下使用

1. SQLite3基本介绍 1.1 数据库的数据类型 1.2 基本语法 1. 创建数据表格 create table 表名(字段名 数据类型&#xff0c; 字段名 数据类型)&#xff1b; create table student(id int, name varchar(256), address text, QQ char(32)); 2. 插入数据 insert into 表名 valu…...

pyinstaller打包exe多种失败原因解决方法

pyinstaller打包exe多种失败原因解决方法 目录 pyinstaller打包exe多种失败原因解决方法1、pyinstaller安装有问题1.1 安装pyinstaller1.2 采用anconda的环境启动 2、pyqt5与pyside6冲突2.1 打包生成.spec文件2.2 编辑spec文件 3、打包成功后打不开exe&#xff0c;exe闪退3.1 s…...

x64-linux下在vscode使用vcpkg

1.使用vscode远程连接上对应的linux &#xff0c;或者直接在图形化界面上使用。 2.安装vcpkg 插件&#xff0c;然后打开插件设置。 注意&#xff1a;defalut和host的主机一定和你自己的主机一致&#xff0c;且必须符合vcpkg三元组格式&#xff0c;其中你可以选择工作台的设置&a…...

运营商二要素核验-手机号机主姓名核验接口-运营商二要素核验接口

通过电信运营商验证手机号码与姓名是否一致。广泛用于实名注册、风控审核等场景&#xff0c;如电商、游戏、直播、金融等需要用户实名认证的场景。支持携号转网核验。 更新周期&#xff1a;联通T1 电信T3 移动T3~5 均为工作日 接口地址&#xff1a; https://www.wapi.cn/api_de…...

C++设计模式-生产者消费者模式

运行在VS2022&#xff0c;x86&#xff0c;Debug下。 32. 生产者消费者模式 解耦生产者和消费者之间的关系&#xff0c;即生产者和消费者只依赖缓冲区&#xff0c;而不相互依赖。应用&#xff1a;多线程并发编程&#xff0c;可以解决生产者和消费者之间的同步问题。实现 生产者…...

VSTO Word.net 如何在另外的工程内添加CustomTaskPane

其他工程肯定是不能直接添加CustomTaskPane面板的&#xff0c;但我们可以在ThisAddIn 中先把对应的panel给新建出来再进行隐藏。步骤如下&#xff1a; 1.在另外工程中定义public static CustomTaskPane currMainForm;把需要隐藏的界面赋值给currMainForm&#xff1b; 2.在另外…...

ROS——自定义话题消息和使用方法

定义Person话题 定义Person发布者 /*** 该例程将发布/person_info话题&#xff0c;自定义消息类型&#xff1a; test_topic::Person*/#include <ros/ros.h> #include <test_topic/Person.h> //包含的头文件&#xff0c;ros相关的头文件&#xff0c;及自定义头文件…...

包装对象类型又是啥啊。。。

包装对象类型 目录 包装对象类型 目录包装对象的概念包装对象类型和字面量类型Objectobject 包装对象的概念 JavaScript 的8种类型之中&#xff0c;undefined和null其实是两个特殊值&#xff0c;object属于复合类型&#xff0c;剩下的五种属于原始类型&#xff08;primiti…...

服务编排如何选?这几款可视化服务编排引擎,开发团队赶紧收藏

最近看到几款不错的服务编排的产品&#xff0c;先给大家上图看看 扣子&#xff1a; jvs-logic&#xff1a; node-red&#xff1a; jvs-rules&#xff1a; 上述几个产品是最近看到的 几个比较有特点的服务编排的系统。 接下来我对API详细分解下&#xff0c;说明下优点与挑战 服…...

web前端语言框架:探索现代前端开发的核心架构

web前端语言框架&#xff1a;探索现代前端开发的核心架构 在快速发展的web开发领域&#xff0c;前端语言框架的选择对于项目的成功至关重要。它们不仅影响着开发效率&#xff0c;更直接关系到用户体验与网站性能。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;…...

基于flask的网站如何使用https加密通信

文章目录 内容简介网站目录示例生成SSL证书单独使用Flask使用WSGI服务器Nginx反向代理参考资料 内容简介 HTTPS 是一种至关重要的网络安全协议&#xff0c;它通过在 HTTP 协议之上添加 SSL/TLS 层来确保数据传输的安全性和完整性。这有助于防止数据在客户端和服务器之间传输时…...

软件测试面试题(应届生)

设计员工管理系统的测试用例时&#xff0c;需要考虑系统的各种功能和可能的使用场景&#xff0c;以确保系统的稳定性和准确性。以下是一些设计测试用例的基本步骤和策略&#xff1a; 一、明确测试目标 首先&#xff0c;需要明确测试的目标&#xff0c;例如确保员工信息的准确…...

使用halo的jar方法搭建博客(数据库mysql

ssh连接远程主机 ➜ ~ ssh root 146.56.249.61 第一步.在CentOS 7上安装下载OpenJDK 17的tar.gz文件 wget https://download.java.net/java/GA/jdk17.0.1/2a2082e5a09d4267845be086888add4f/12/GPL/openjdk-17.0.1_linux-x64_bin.tar.gz解压 tar xvf openjdk-17.0.1_linux-…...

Linux - 复盘一次句柄数引发的故障

文章目录 Pre&#xff08;内核、用户、进程&#xff09;句柄数设置问题 shell修复 Pre Linux - 深入理解/proc虚拟文件系统&#xff1a;从基础到高级 &#xff08;内核、用户、进程&#xff09;句柄数设置 在Linux系统中&#xff0c;进程打开的最大句柄数可以通过多种方式配置…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...