导出word并且插入图片

java 复制代码
	// 导出报告 Word文档(仅导出单个Word文件)
	@GetMapping("/exportReportWord")
	@ApiOperationSupport(order = 8)
	@ApiOperation(value = "导出报告 Word 文档", notes = "正式节点才能导出报告")
	public void exportReportWord(@RequestParam String yearMonth, HttpServletResponse response) {
		try {


			// 5. 生成Word文档并直接输出到响应流
			String fileName = UUID.randomUUID() + ".docx";
			response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
			response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));

			try (XWPFTemplate template = getXwpfTemplate(null)) {
				template.write(response.getOutputStream());
			}

		} catch (Exception e) {
			log.error("导出Word失败", e);
			try {
				response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "导出失败:" + e.getMessage());
			} catch (IOException ex) {
				log.error("设置响应错误信息失败", ex);
			}
		}
	}


	private XWPFTemplate getXwpfTemplate(CmComplaintVO cmComplaintVO) throws IOException {
		Map<String, Object> map = new HashMap<>();

		// 1. 处理文本参数(保持原有逻辑)
		map.put("work_order_time",
				Optional.ofNullable(LocalDateTime.now())
						.map(time -> time.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
						.orElse(null)
		);

		// 处理图片的核心代码
		Resource imageResource = new ClassPathResource("templates/statistic_chart.png");
		try (InputStream imageStream = imageResource.getInputStream()) {
			// 1. 将输入流转换为 BufferedImage(直接从流转换,避免中间字节数组)
			BufferedImage bufferedImage = ImageIO.read(imageStream);
			if (bufferedImage == null) {
				throw new IOException("无法解析图片流,可能是图片格式不支持");
			}

			// 2. 使用 Pictures.ofBufferedImage() 创建图片对象
			PictureRenderData pictureData = Pictures.ofBufferedImage(bufferedImage, PictureType.PNG)
					.size(712, 500) // 设置图片宽高(像素)
					.create(); // 创建 PictureRenderData

			map.put("image", pictureData); // 绑定到模板占位符 {{image}}
		} catch (IOException e) {
			log.error("处理图片失败", e);
			// 可选:添加默认图片或抛出友好异常
			throw new RuntimeException("导出Word失败:图片处理异常", e);
		}

		// 3. 编译模板(必须绑定图片渲染策略)
		PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
		Resource templateResource = resolver.getResource("classpath:/templates/cm_statistics.docx");

		Configure config = Configure.builder()
				.bind("image", new PictureRenderPolicy()) // 绑定图片渲染策略
				.build();

		XWPFTemplate template = XWPFTemplate.compile(templateResource.getInputStream(), config).render(map);
		return template;
	}

本文介绍了导出报告Word文档的实现方法。通过Spring Boot的@GetMapping注解创建"/exportReportWord"接口,使用XWPFTemplate工具生成Word文件并直接输出到响应流。方法包含:(1)设置响应头为Word文档类型;(2)调用getXwpTemplate方法处理模板;(3)异常处理机制。模板处理方法getXwpfTemplate包含:文本参数处理(如格式化当前时间)、图片处理(将PNG图片转为BufferedImage并设置尺寸)以及模板编译(绑定图片渲染策略)。该方法最终返回包含动态数据和图片的Word模板对象,支持导出包含统计图表的报告文档。

如果不插图片就简单了

代码如下

java 复制代码
/**
	 * 传入 对象  返回生成的word文档
	 * @param cmComplaintVO
	 * @return
	 * @throws IOException
	 */
	private XWPFTemplate getXwpfTemplate(CmComplaintVO cmComplaintVO) throws IOException {
		Map<String, Object> map = new HashMap<>();


		// 方式1:直接处理
		map.put("work_order_time",
				Optional.ofNullable(LocalDateTime.now())
						.map(time -> time.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
						.orElse(null)
		);

		// 导出
		PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

		Resource resource = resolver.getResource("classpath:/templates/cm_statistics.docx");
//		Configure config = Configure.builder().bind("table", new LoopRowTableRenderPolicy()).build();
//		XWPFTemplate template = XWPFTemplate.compile(resource.getInputStream(), config).render(map);
		XWPFTemplate template = XWPFTemplate.compile(resource.getInputStream()).render(map);
		return template;
	}
相关推荐
IT90901 小时前
C#软件授权注册码模块源码及机器码注册码功能
c#·软件开发
阿拉丁的梦1 小时前
教程1:用vscode->ptvsd-创建和调试一个UI(python)-转载官方翻译(有修正)
开发语言·python
木宇(记得热爱生活)1 小时前
一键搭建开发环境:制作bash shell脚本
开发语言·bash
Cisyam^1 小时前
Go环境搭建实战:告别Java环境配置的复杂
java·开发语言·golang
IAR Systems2 小时前
在IAR Embedded Workbench for Arm中实现Infineon TRAVEO™ T2G安全调试
开发语言·arm开发·安全·嵌入式软件开发·iar
jayzhang_3 小时前
SPARK入门
大数据·开发语言
蹦极的考拉3 小时前
网站日志里面老是出现{pboot:if((\x22file_put_co\x22.\x22ntents\x22)(\x22temp.php\x22.....
android·开发语言·php
fured3 小时前
[调试][实现][原理]用Golang实现建议断点调试器
开发语言·后端·golang
大翻哥哥4 小时前
Python地理空间数据分析:从地图绘制到智能城市应用
开发语言·python·数据分析
NPE~4 小时前
[手写系列]Go手写db — — 第二版
开发语言·数据库·golang·教程·db·手写系列