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

作者 : admin 本文共7893个字,预计阅读时间需要20分钟 发布时间: 2024-06-10 共3人阅读

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")
@ResponseBody
public 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里面插入值以后
java 实现导出word 自定义word 使用aspose教程包含图片 for 循环 自定义参数等功能插图
这里需要加入你要插入循环的实体类 给word里面获取实体类使用

java 实现导出word 自定义word 使用aspose教程包含图片 for 循环 自定义参数等功能插图(1)
比如我的实体类里面就有这些list 那么这些list里面的 bo就需要插入到上面的图片里面

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

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

2,if判断 是否显示

这里用到word里面的if判断了
如图
java 实现导出word 自定义word 使用aspose教程包含图片 for 循环 自定义参数等功能插图(2)

<> <>
这里就判断了如果 传入的title不为空的情况下再进行显示

2,显示指定值

java 实现导出word 自定义word 使用aspose教程包含图片 for 循环 自定义参数等功能插图(3)
直接使用 就可以显示值

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

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

这里用到了 entitylist 进行了for循环 xxxx为
java 实现导出word 自定义word 使用aspose教程包含图片 for 循环 自定义参数等功能插图(5)
这里显示的实体类 必须在这里加入 否则会报错和无法使用
注意 开始 foreach就要有结束的 foreach 相对应的都是 类似于 xml格式的 word导出

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

4,显示图片 ,

显示图片就是你的baset64复值给实体类传入以后 打开你的 word
java 实现导出word 自定义word 使用aspose教程包含图片 for 循环 自定义参数等功能插图(6)
点击文本框
插入到里面 在里面写入bo的img名称即可
如图
java 实现导出word 自定义word 使用aspose教程包含图片 for 循环 自定义参数等功能插图(7)
如果不想要外边框可以使用
java 实现导出word 自定义word 使用aspose教程包含图片 for 循环 自定义参数等功能插图(8)
属性里面的内容设置成无即可

附赠一个 word
java 实现导出word 自定义word 使用aspose教程包含图片 for 循环 自定义参数等功能插图(9)


本站无任何商业行为
个人在线分享 » java 实现导出word 自定义word 使用aspose教程包含图片 for 循环 自定义参数等功能
E-->