java导出word文档

java对word文档预设参数填值并生成(包含图片) 工作上要搞一个合同签署功能,后端根据登录人信息和合同word模板生成一个合同word文档并保存,踩了不少坑,现在用freemarker进行值替换,支持替换图片,不过步骤有些繁琐。 阅读详情

1.应用场景,java下载world定制模板,并自动填充参数时使用

1.1 使用技术 SpringMVC

2.先看我的模板截图

红色方框为自己定义的一些参数


3.请求的Action

@SuppressWarnings("deprecation")
	@RequestMapping(value = "down-talk-word")
	public void down_talk_word(ModelMap model,approvalModel query,HttpServletResponse response, HttpServletRequest request) throws IOException{
		response.reset();
		String logoRealPathDir = request.getSession().getServletContext().getRealPath("//modile//TSC-talk-record.docx");//获取文档路径
		TempleWordUtil xwpfTUtil=null;   //声明工具类
		XWPFDocument doc=null;   //仅支持2007之后的版本  需要引入poi包 import org.apache.poi.xwpf.usermodel.XWPFDocument;
		InputStream is = null;
		OutputStream os=null;
		try {
			//查询员工基本信息
			EmployeeModel employeeInfo=employeeService.getEmployeeOrganization(query.getEmployeeCode());
			 Map<String, Object> params=null;
				/*存入替换模板数据*/
			    params = new HashMap<String, Object>();  
			    params.put("${name}",employeeInfo.getName());  
			    params.put("${sectionName}", employeeInfo.getSectionName());
			    params.put("${directManager}", employeeInfo.getDirectManager());
			    params.put("${employeeCode}",employeeInfo.getEmployeeCode());
			    params.put("${positionCode}", employeeInfo.getPositionCode());
			    xwpfTUtil = new TempleWordUtil();
			    is = new FileInputStream(logoRealPathDir);
			    doc = new XWPFDocument(is);
			    xwpfTUtil.replaceInTable(doc, params);  //下方定义的工具类,用于替换word文档中定义的参数
			    //替换表格里面的变量
			    xwpfTUtil.replaceInTable(doc, params);
			    os = response.getOutputStream();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			//设置数据类型
			 response.setContentType("application/vnd.ms-excel");
			//设置文件名称
			 response.setHeader("Content-Disposition",
			 "attachment; filename="+ "TSC-talk-record"+java.net.URLEncoder.encode(DateUtil.getExportDate()+ ".docx", "UTF-8"));
	        doc.write(os);
	        xwpfTUtil.close(os);
	        xwpfTUtil.close(is);
	        os.flush();
	        os.close();
		}

	}

4.工具类

package common.util;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;

public class  TempleWordUtil {


    /**
     * 替换段落里面的变量
     *
     * @param doc    要替换的文档
     * @param params 参数
     */
    public void replaceInPara(XWPFDocument doc, Map<String, Object> params) {
        Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();//获取段落
        XWPFParagraph para;
        while (iterator.hasNext()) {
            para = iterator.next();
            this.replaceInPara(para, params);
        }
    }

    /**
     * 替换段落里面的变量${}这种格式
     *
     * @param para   要替换的段落
     * @param params 参数
     */
    public void replaceInPara(XWPFParagraph para, Map<String, Object> params) {
        List<XWPFRun> runs;
        Matcher matcher;
        if (this.matcher(para.getParagraphText()).find()) {
            runs = para.getRuns();
            int start = -1;
            int end = -1;
            String str = "";
            for (int i = 0; i < runs.size(); i++) {
                XWPFRun run = runs.get(i);
                String runText = run.toString();
                if ('$' == runText.charAt(0)&&'{' == runText.charAt(1)) {
                    start = i;
                }
                if ((start != -1)) {
                    str += runText;
                }
                if ('}' == runText.charAt(runText.length() - 1)) {
                    if (start != -1) {
                        end = i;
                        break;
                    }
                }
            }

            for (int i = start; i <= end; i++) {
                para.removeRun(i);
                i--;
                end--;
            }

            for (String key : params.keySet()) {
                if (str.equals(key)) {
                    para.createRun().setText((String) params.get(key));
                    break;
                }
            }


        }
    }

    /**
     * 替换表格里面的变量
     *
     * @param doc    要替换的文档
     * @param params 参数
     */
    public void replaceInTable(XWPFDocument doc, Map<String, Object> params) {
        Iterator<XWPFTable> iterator = doc.getTablesIterator();
        XWPFTable table;
        List<XWPFTableRow> rows;
        List<XWPFTableCell> cells;
        List<XWPFParagraph> paras;
        while (iterator.hasNext()) {
            table = iterator.next();
            rows = table.getRows();
            for (XWPFTableRow row : rows) {
                cells = row.getTableCells();
                for (XWPFTableCell cell : cells) {
                    paras = cell.getParagraphs();
                    for (XWPFParagraph para : paras) {
                        this.replaceInPara(para, params);
                    }
                }
            }
        }
    }

    /**
     * 正则匹配字符串
     *
     * @param str
     * @return
     */
    private Matcher matcher(String str) {
        Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(str);
        return matcher;
    }

    /**
     * 关闭输入流
     *
     * @param is
     */
    public void close(InputStream is) {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 关闭输出流
     *
     * @param os
     */
    public void close(OutputStream os) {
        if (os != null) {
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

4. 前台页面定义下载按钮,交互下应该就可以了




java实现Word 文档形式的导出功能 关于在Java中实现导出功能,导出格式为Word文档导出,具体参考如下代码。 1 先准备好一个导出Word文档的模板。 例如: 将其存值地方用字段代替。例如: 2.打开doc文件后 ,文件中的另存为,然后选择 保存类型为2003 版本的(*.xml) 3、 刚生成的xml文件里面比较乱,要整理一下,方法如下: 使用Eclipse/idea ,新建一个jsp ,把xml里面的东西覆盖更新刚才的jsp ,ctrl+Shift+F/ ctrl+alt+L 把文件整理一下,在拷贝出来,放到刚才的xml。文件内容 阅读详情

相关推荐

Java导出Word文档的实现

前言 在日常的开发工作中,我们时常会遇到导出Word文档报表的需求,比如公司的财务报表、医院的患者统计报表、电商平台的销售报表等等。 导出Word方式多种多样,通常有以下几种方式: 1. 使用第三方Java工具类库Hutool的Word工具类,参考网址为https://www.hutool.cn/docs/#/poi/Word生成-Word07Writer; 2. 利用Apache POI和FreeMarker模板引擎; 3. 第三方报表工具。 上面的几种方式虽然可以实现...

plxddyxnmd的博客 7万+

记录java使用POI实现word模板数据填充

最近项目遇到个需求,在模板中填充数据,刚开始是用smartBi报表进行填充,输出参数都是必录,无法满足需求。在网上查了很多资料,有些需要把文档转成xml格式修改里面内容,IDEA里面修改要替换的占位符的位置等方式,都不满足需求。

LiuQjie的博客 1万+

java快速导出word文档

在 Java 应用程序中,有时候我们需要将数据导出为 Word 文档,以便进行文档的编辑、打印或共享。本文将介绍如何使用 Java 实现导出 Word 文档的方法,帮助你灵活处理文档导出需求。

最初的节奏 3338

Java 实现word文档填充

java实现word模板填充

m0_45277005的博客 2583

使用Java填充Word模板的技术详解

在许多企业应用中,生成具有特定格式的文档是一个常见需求,例如生成合同、发票、报告等。这些文档通常需要根据模板填充动态数据。Java作为一门功能强大的编程语言,提供了多种方式来填充Word模板。本文将详细介绍如何使用Java填充Word模板,包括常见的工具和库、实际应用示例以及最佳实践。

fudaihb的博客 2265

Java实现Word文档导出功能详解

本文还有配套的精品资源,点击获取 简介:在IT行业中,文件导出是一个基本且重要的任务,尤其是使用Java技术实现Word文档导出。本文将重点讲解如何使用Java技术,特别是Java2Word库,来生成和操作Word文件。文章将从基础步骤(添加依赖、创建文档对象、添加内容、设置格式、保存文件)讲起,覆盖文档创建的各个方面,包括模板填充、页眉页脚等高级功能,提供一个完整的文件导...

weixin_30700095的博客 1880

java 导出word文档

java 导出word文档 1、设置模板 设置方法: 1、选中需要动态生成数据的部分,按 Ctrl+F9 -> 选择编辑域。 2.1、选择邮件合并,并在域代码部分后面加上相应参数,例如 :${videoNum} 'videoNum’是对应的参数名,后面代码编辑的时候会用到。 2.2、如果是表格类型的动态数据,按照2.1的方式设置参数,但参数以 ${video.name} 方式设置,用以后续动态数据的生成。 2、代码编写 2.1 pom导入 <!-- word

iampatrick_star的博客 6620

Java实现Word文档导出技术指南

在现代企业中,自动化文档生成已成为提高工作效率的重要手段之一。Java作为一种成熟的编程语言,广泛应用于企业级应用开发中,其强大的文档处理能力是许多开发者的关注焦点。特别是在处理Word文档方面,Java提供了多种实现方式。其中,Apache POI库作为处理Microsoft Office文档的事实标准库,是Java开发者最常使用的工具之一。本章首先概述了在Java中导出Word文档的基本方法,为后续章节中深入探讨Apache POI库的使用提供一个整体框架。

weixin_42589700的博客 1207

java POI 导出 word 文档

优点:跨平台支持windows、unix和linux,生成word文件格式标准,支持文本、图片、表格、字体、段落、颜色、超链、页眉等各种格式的操作,支持多word合并,无需处理并发,不耗费服务器资源,运行稳定。这些服务包括: 打开文档、新建文档、查找文字、替换文字,插入文字、插入图片、插入表格,在书签处插入文字、插入图片、插入表格等。缺点:生成的文件本质上是xml,不是真正的word文件格式,有很多常用的word格式无法处理或表现怪异,比如:超链、换行、乱码、部分生成的文件打不开等。

weixin_42396752的博客 3856

Java实现网页表格到Word文档的导出

Java是一种广泛使用的面向对象的编程语言,以其“一次编写,到处运行”的设计理念而闻名。由于其跨平台特性、稳定性和安全性,Java在企业级应用、移动开发、大数据和云服务等领域有着深远的影响力。它被全球成千上万的开发者使用,并且是许多大型系统的首选语言。Apache POI库是处理Microsoft Office文档的一个开源Java库,它允许开发者直接操作Excel和Word文档,包括读取、创建、修改等。

weixin_36204513的博客 1033

freemarker根据word模板生成word的完整示例

template文件夹下放入xml模板,运行Test.java文件,可以生成word文档

[含完整代码]Java实现导出word文档【超详细】

[含完整代码]Java实现导出word文档【超详细】java实现导出word文档是项目中很常见的操作,但又是很棘手的操作,这篇文章,带大家从0到1超详细的完整的操作一遍java实现导出word文档。一定要认真看这篇文章,超详细。话不多说直接上代码。

wang20000102的博客 1万+

STM32读取BQ40Z50的数据

TI电池管理芯片BQ40Z50,通信协议是SMBUS,类似IIC,速率要求10-100KHz   用的STM32F103的硬件IIC读取电池的各种数值,源代码如下: ​ #include "iic.h" #include "stdio.h"  //***************************************************** // IIC2初始化函数:初始化ST...

百步登峰的博客 1万+

JAVA使用Apache POI动态导出Word文档

1、需要的环境2、创建模板3、书写java类4、测试。

qq_45087487的博客 1万+

别再写前端了!用Gradio 3.x + HuggingFace Spaces,5分钟把你的Python算法变成网页应用

本文介绍如何利用Gradio 3.x和HuggingFace Spaces快速将Python算法转化为网页应用,无需前端开发经验。通过5行代码和简单的Git命令,即可实现专业级Web界面部署,大幅提升算法展示效率。特别适合算法工程师和数据科学家快速分享模型成果。

weixin_33443333的博客 332

Autoware.universe部署03:与Carla(二进制版)联调

本文介绍了 Autoware.universe 与 Carla 二进制版的联调过程。Autoware.universe 是一个开源的自动驾驶软件平台,而 Carla 则是一个用于自动驾驶仿真的开源工具。将这两者联调起来可以在仿真环境中测试和验证 Autoware.universe 的功能和性能,为自动驾驶系统的开发和测试提供有力支持。

zardforever123的博客 7369

Java 实现导出 Word 文档的方法详解

在 Java 应用程序中,有时候我们需要将数据导出为 Word 文档,以便进行文档的编辑、打印或共享。本文将介绍如何使用 Java 实现导出 Word 文档的方法,帮助你灵活处理文档导出需求。在 Java 中,我们可以使用 Apache POI 库来操作 Microsoft Office 文档,包括 Word 文档。通过本文的介绍,你了解了如何使用 Java 实现导出 Word 文档的方法。你学习了使用 Apache POI 库创建 Word 文档、向文档中添加内容,并将文档导出为文件。

pleaseprintf的博客 7501

计算机组成原理(二)—— 数据的表示与运算

本章目录引言一、数制与编码1.1 进位计数制1.1.1 进制及转换1.1.2 真值、机器数1.2 BCD码1.3 ASCII 码1.4 校验码1.4.1 奇偶校验码1.4.2 海明码1.4.3 CRC循环冗余码二、定点数的表示和运算2.1 定点数的表示2.1.1 无符号2.1.2 有符号(原码、反码、补码、移码)2.2 定点数的运算2.2.1 移位运算2.2.2 加减运算(溢出判断)2.2.3 乘法运算2.2.4 除法运算2.3 强制类型转换2.4 数据的存储和排列三、浮点数的表示和运算3.1 浮点数的表示

S mile0804的博客 7473

Java通过freemarker生成Word文档导出

Java通过freemarker生成Word文档导出

syg1207的博客 2817

Vivado静态时序分析学习笔记(1)

静态时序分析分为片内时序分析(寄存器与寄存器之间的时序关系)和片外时序分析(IO时序分析)。(1)建立时间 setup time在时钟事件(上升沿/下降沿)发生之前数据信号应保持稳定的时间。把实际电路抽象成前级D触发器+组合逻辑+后级D触发器。

Fantaasky的博客 4376

2026.2.23:AgentScope框架实战<一>:安装并使用agentscope

本文介绍了AgentScope框架的安装与使用实践。通过PyPI安装agentscope[full]后,演示了如何创建ReActAgent代理:1)配置DashScope聊天模型;2)注册自定义工具函数(查询位置和天气);3)初始化代理并处理用户请求。示例展示了代理如何响应复合查询(如同时获取北京位置和天气信息),输出结果显示代理成功执行了工具调用并返回结构化响应。该框架支持Python 3.13环境,提供内存管理、工具集成等功能,适用于构建智能代理系统。

拥抱具身智能,昇腾Ascend C 508

java poi实现word文档导出

需求,将多分数据导出一个word文档,这里没有图片 实现方式,定义一个word文档模板,使用字符串占位符替换文本内容,java后台引用模板实现导出 原理:生成一个word文档对象,获取其xml字段穿,多个word文档,将其xml字符串拼接。 package testModel; import java.io.ByteArrayOutputStream; import java.io.F...

weixin_41802726的博客 1728

RAG 提示词工程最佳实践

虽然目前网络上关于提示工程的相关资料已经多如牛毛,然而 RAG (检索增强生成) 任务中提示工程如何进行的资料相对而言却较少。不少朋友之前也热烈的讨论过 RAG 场景下提示词的运用,因此 Zen 禅与计算机程序设计艺术 特别推出 RAG 任务下的提示词实践经验系列分享。RAG 是检索增强生成(Retrieval Augmented Generation)的简称,是当前最火热的企业级LLM应用方案。

AI天才研究院 2012

java 根据word模板导出导出word文档

这里写自定义目录标题欢迎使用Markdown编辑器**加粗样式新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 一:新建word文档,编辑需要导出的模板,如下 欢迎使用Markdown编辑器** 加粗样式 ** 你好! 这是

qq_45611413的博客 4314

成本中心(CO)和利润中心(PCA)是管理会计模块的核心组件

SAP中成本中心(CO)和利润中心(PCA)凭证处理存在差异:①外部交易(如费用支付、销售)会生成FI借贷凭证;②内部成本分摊和转移仅产生CO/PCA管理凭证,通过次级成本要素或利润中心转移科目记录,不涉及FI模块。核心区别在于是否涉及企业实际收支:实际收支触发FI凭证,内部核算仅生成管理会计凭证。系统通过这种机制实现财务会计与管理会计的集成与分离。

金牌架构师 1128

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: JAVA POI自动导出数据和图片到excel
下一篇: Java从数据库中读取Blob对象图片并显示的方法
旋转的钢笔
博客等级 码龄11年 24粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值