首页 > 编程语言 >java导出占位符word模板

java导出占位符word模板

时间:2023-10-16 13:45:59浏览次数:40  
标签:null word text 占位 Word java document 模板

实际项目中,便于维护模板,采用直接 word里面制作占位符 来导出更为直观,而不是 将word做成tpl模板。

使用XWPFDocument (这种解析xlsx或者docx)和 HWPFDocument(这种解析xls或者doc)。 代码如下:

写磁盘代码: 点击查看代码
// 创建Word模板文件:在开始代码编写之前,我们需要准备一个Word模板文件,模板文件中的文本可以是固定的,也可以使用占位符来表示需要动态填充的内容
        //读取Word模板文件
        // 我们需要使用Apache POI库来读取Word模板文件,并将其加载到内存中进行后续的操作。代码如下
        FileInputStream fis = null;
        try {
            File sPath = new File("D:/opt/jwxt/file/uploadfile/ly-edu-core-svc-thx/testWord.docx");
//            File sPath = new File("/template/testword.doc");
            fis = new FileInputStream(sPath);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
//        HWPFDocument 支持doc  XWPFDocument支持docx
 
        XWPFDocument document = null;
        FileOutputStream fos = null;
        try {
            document = new XWPFDocument(fis);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }

        // 替换模板中的占位符
        //在模板文件中,我们可以使用占位符来表示需要动态填充的内容,比如使用${placeholder}来表示占位符。我们需要遍历Word文档的所有段落和表格,找到包含占位符的位置,并将其替换为实际的内容。代码如下

        List<XWPFParagraph> paragraphs = document.getParagraphs();
        for (XWPFParagraph paragraph : paragraphs) {
            List<XWPFRun> runs = paragraph.getRuns();
            for (XWPFRun run : runs) {
                String text = run.getText(0);
                if (text != null && text.contains("${{成果名称}}")) {
                    text = text.replace("${{成果名称}}", "替换后的内容");
                    run.setText(text, 0);
                }
            }
        }

        // 表格处理方式
        List<XWPFTable> tables = document.getTables();
        for (XWPFTable table : tables) {
            List<XWPFTableRow> rows = table.getRows();
            for (XWPFTableRow row : rows) {
                List<XWPFTableCell> cells = row.getTableCells();
                for (XWPFTableCell cell : cells) {
                    List<XWPFParagraph> cellParagraphs = cell.getParagraphs();
                    for (XWPFParagraph cellParagraph : cellParagraphs) {
                        List<XWPFRun> runs = cellParagraph.getRuns();
                        for (XWPFRun run : runs) {
                            String text = run.getText(0);
                            if (text != null && text.contains("${{完成人姓名1}}")) {
                                text = text.replace("${{完成人姓名1}}", "替换后的内容");
                                run.setText(text, 0);
                            }
                            if (text != null && text.contains("${{成果名称}}")) {
                                text = text.replace("${{成果名称}}", "替换后的内容2222");
                                run.setText(text, 0);
                            }
                        }
                    }
                }
            }
        }

        // 导出word文档
            File outFile = new File("D:\\opt\\jwxt\\file\\uploadfile\\ly-edu-core-svc-thx\\占位符完成打印.docx");
        fos = new FileOutputStream(outFile);

    } catch (Exception e) {
        log.error( "获取word文档失败,原因是:"   + e.getMessage());
    } finally {
        try {
            document.write(fos);
            if(fos != null) {
                fos.close();
            }
//            document.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

与前端配合弹出流,使用response,代码如下

点击查看代码
/**
     * 我们可以实现Java Word模板打印的功能。首先,我们需要引入Apache POI库,并创建一个Word模板文件。然后,我们需要读取模板文件并将其加载到内存中。
     * 接下来,我们需要遍历Word文档,找到包含占位符的位置,并将其替换为实际的内容。最后,我们可以将生成的Word文档导出为文件。
     * <p>
     * 在实际应用中,我们可以根据具体需求扩展这个功能,比如支持更复杂的模板替换、添加图片和表格等。同时,我们也可以使用其他的库来实现类似的功能,比如Docx4j等
     *
     * 
     */

    @Autowired
    private HttpServletResponse response;

    @Autowired
    private HttpServletRequest request;

    @Override
    public void testWordPrint(ReviewTemplateDto reviewTemplateDto) { 


        // 创建Word模板文件:在开始代码编写之前,我们需要准备一个Word模板文件,模板文件中的文本可以是固定的,也可以使用占位符来表示需要动态填充的内容
        //读取Word模板文件
        // 我们需要使用Apache POI库来读取Word模板文件,并将其加载到内存中进行后续的操作。代码如下
        FileInputStream fis = null;
        try {
            File sPath = new File("D:/opt/jwxt/file/uploadfile/tt/模板.docx");
//            File sPath = new File("/template/testword.doc");
            fis = new FileInputStream(sPath);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
//        HWPFDocument 支持doc  XWPFDocument支持docx
        XWPFDocument document = null;
        FileOutputStream fos = null;
        try {
            document = new XWPFDocument(fis); 

            // 替换模板中的占位符
            //在模板文件中,我们可以使用占位符来表示需要动态填充的内容,比如使用${placeholder}来表示占位符。我们需要遍历Word文档的所有段落和表格,找到包含占位符的位置,并将其替换为实际的内容。代码如下

            List<XWPFParagraph> paragraphs = document.getParagraphs();
            for (XWPFParagraph paragraph : paragraphs) {
                List<XWPFRun> runs = paragraph.getRuns();
                for (XWPFRun run : runs) {
                    String text = run.getText(0);
                    if (text != null && text.contains("${{成果名称}}")) {
                        text = text.replace("${{成果名称}}", "替换后的内容");
                        run.setText(text, 0);
                    }
                }
            }

            // 表格处理方式
            List<XWPFTable> tables = document.getTables();
            for (XWPFTable table : tables) {
                List<XWPFTableRow> rows = table.getRows();
                for (XWPFTableRow row : rows) {
                    List<XWPFTableCell> cells = row.getTableCells();
                    for (XWPFTableCell cell : cells) {
                        List<XWPFParagraph> cellParagraphs = cell.getParagraphs();
                        for (XWPFParagraph cellParagraph : cellParagraphs) {
                            List<XWPFRun> runs = cellParagraph.getRuns();
                            for (XWPFRun run : runs) {
                                String text = run.getText(0);
                                if (text != null && text.contains("${{完成人姓名1}}")) {
                                    text = text.replace("${{完成人姓名1}}", "替换后的内容");
                                    run.setText(text, 0);
                                }
                                if (text != null && text.contains("${{成果名称}}")) {
                                    text = text.replace("${{成果名称}}", "替换后的内容2222");
                                    run.setText(text, 0);
                                }
                            }
                        }
                    }
                }
            }

            // 导出word文档
//            File outFile = new File("D:\\opt\\jwxt\\file\\uploadfile\\tt\\tt.docx");// 直接写磁盘
//            fos = new FileOutputStream(outFile);
//
////            document.write(fos);//
            String filePath = request.getSession().getServletContext().getRealPath("/");
            String fileName = "tt.docx";
//            response.setHeader("Content-Disposition", "attachment;fileName=" + stringToUnicode(fileName));
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.setContentType("multipart/form-data");

            OutputStream outputStream = null;
            try {
                outputStream = response.getOutputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
            document.write(outputStream);

        } catch (Exception e) {
            log.error("获取word文档失败,原因是:" + e.getMessage());
        } finally {
            try {

                if (fos != null) {
                    fos.close();
                } 
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
前端
点击查看代码

// 导出占位符word
export function exportZwfWord (url,params,id,callback){
    exportDataExcel(url,params,{
        header:{ },responseType:"blob"
    }).then(response=>{

        if (response.status==200){
            let fileName = response.headers["content-disposition"].split(";")[1].split("filename=")[1];
            const aLink = document.createElement("a");
            document.body.appendChild(aLink);
            aLink.style.display = "none";
            const objectUrl = window.URL.createObjectURL(new Blob([response.data], { type: 'application/docx; charset=utf-8' }));
            aLink.href = objectUrl;
            aLink.download = decodeURI(fileName);
            aLink.click();
            document.body.removeChild(aLink);
            message.success('导出成功')
            callback(response.data);
            return;
        }else{
            if (response.message) {
                message.error(response.message);
            } else {
                message.error("没有数据");
            }
            callback();
        }
    })
}

遇到问题:
1。Java使用POI技术导出Word文档,报错Package should contain a content type part [M1.13]
解决方案:
因为XWPFDocument只支持docx,所以需要将doc文件另存为 docx. 切记不能直接改后缀,否则不生效的。
image
2。问题2:response的Content-Disposition写文件名要与前端对应,否则,导出undefined.

效果:
image

image

标签:null,word,text,占位,Word,java,document,模板
From: https://www.cnblogs.com/heavenTang/p/17766974.html

相关文章

  • java-springboot和servlet的项目搭建
    1.404->启动tomcat->tomcat闪退->配置jre全局环境,重启电脑->8080端口被占用->下载太多tomcat->重新配置->还是被占用->命令行找netstat-ano|findstr80得到PID,在任务管理器找到(用PID排序会更好找)是一个java.exe,结束进程。->成功运行2.入口类3.mysql命令不生效->因为没加分号(我......
  • 组合模式--Java实现
    画类图以文件夹浏览为例;具体代码实现//AbstractFile.javapackageorg.example.design008;publicabstractclassAbstractFile{publicabstractvoidadd(AbstractFileelement);publicabstractvoidremove(AbstractFileelement);publicabstractvoid......
  • 放弃WordPress,纯手撸一个导航网站
    最近AI好火啊,各种AI工具导航网站也层出不穷,思路就是建站然后流量做大赚广告费。于是,我仔细研究下了所谓的导航网站,不仅AI领域,其他诸如编程啊,产品经理啊,跨境电商啊等等行业都有导航站,的确极大的增加了工作效率,做到了工具和资源的整合。从技术的角度讲,各大导航网站无一例外都是使......
  • 自邮之翼Java Web开发入门学习之旅 阶段一
    这个阶段的任务是“完成开发环境的安装和配置,并基于JSP实现一个“HellotheWorld”页面。主要使用的开发环境为:IntellijJava,进行开发前需要完成的环境配置如下:·配置java环境(JDK17)·配置maven环境(apache-maven-3.9.4)·配置Tomcat环境(apache-tomcat-10.1.13)以上均需要......
  • Javaweb后端
    Javaweb后端目录Javaweb后端MavenHTTP请求响应请求(补充)xml文件分层解耦三层架构IOC/DI入门IoC控制反转DI依赖注入MySQL事务索引分页查询MyBatis快速入门数据库连接池Lombok增删改查删除新增查询条件查询xml映射文件动态sql案例部门管理分页查询文件上传阿里云OSS配置文件参数......
  • JavaWeb前端
    HTML+CSS+JS+Vue+Element目录HTML+CSS+JS+Vue+Element一、基本概念二、Web服务器三、HTMLCSS3.1官方文档四、JavaScript五、Vue六、Ajax七、前端工程化八、Element一、基本概念静态web:html,css缺点:无法动态更新;无法和数据库交互伪动态:轮播图、点击特效(JavaScript)......
  • Java基础知识
    Java基础知识目录Java基础知识第08章面向对象编程(中级部分)306~318多态第10章面向对象编程(高级部分)374~382static类变量和类方法383~385main386~391代码块392~393单例模式394~397final403~412接口413~424内部类第11章枚举和注解425~432Enum枚举433~436注解第12章异......
  • Java上传大文件实现方法
    简介在开发过程中,我们经常会遇到需要上传大文件的需求。本文将教会你如何用Java实现上传大文件的功能。整体流程首先,让我们来看一下实现上传大文件的整体流程。下面是一个流程表格:步骤 描述1 创建一个文件上传表单2 在后端编写一个接收上传文件的控制器3 将上传的文件保存到服务......
  • 基于JT/T1078协议的开源 java视频服务系统
    ​首先,让我们来概述一下JT/T1078协议。JT/T1078协议,也称为"道路交通视频监控系统信息模型与通信协议",是由中华人民共和国交通运输部提出并规范的一种视频服务协议,主要应用于道路交通视频监控系统的设计和实施。其目的是确保视频服务的互操作性、可扩展性和安全性。基于JT/T1078......
  • java和c#里的TOTP统一算法
    基础说明本文根据RFC4226和RFC6238文档,详细的介绍HOTP和TOTP算法的原理和实现。两步验证已经被广泛应用于各种互联网应用当中,用来提供安全性。对于如何使用两步验证,大家并不陌生,无非是开启两步验证,然后出现一个二维码,使用支持两步验证的移动应用比如GoogleAuthenticat......