【Java用法】使用Java导出word文档的解决方案(适用于Windows电脑)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【Java用法】使用Java导出word文档的解决方案(适用于Windows电脑)

最近在做一个word导出功能,需求非常简单,只需要将内容导出到word文件里即可,对于word的格式并没有要求。功能不复杂,想快速实现这个功能,但是使用POI的话,比较麻烦。本文记录一下通过一个工具类即可实现简单的word导出的功能。

项目架构:Springboot + mybatis-plus + MySQL + Maven

实现方式一、通过原生的POI

通过原生的POI实现这个功能感觉有点大材小用,实现起来也比较复杂。可参考一篇写的比较好的博客:Apache POI使用详解。已经有其他人写的很好了,这里就不再赘述。

POI读写Excel功能强大、操作简单。但是POI操作时,一般只用它读取word文档,POI只能能够创建简单的word文档,相对而言POI操作时的功能太少。

实现方式二、通过Hutool工具包

如果以下内容看不懂,可参考Hutool工具包关于poi的介绍:Hutool工具包的使用方法

步骤1、添加pom依赖

   <dependencies>
        <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.6.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <!--说明 hutool-4.x的poi-ooxml 版本需高于 3.17(别问我3.8版本为啥不行,
因为3.17 > 3.8 ) hutool-5.x的poi-ooxml 版本需高于 4.1.2 xercesImpl版本高于2.12.0-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
    </dependencies>

步骤2、编写几行代码

Hutool将POI中Word生成封装为Word07Writer, 通过分段写出,实现word生成。

使用例子

Word07Writer writer = new Word07Writer();
// 添加段落(标题)
writer.addText(new Font("方正小标宋简体", Font.PLAIN, 22), "我是第一部分", "我是第二部分");
// 添加段落(正文)
writer.addText(new Font("宋体", Font.PLAIN, 22), "我是正文第一部分", "我是正文第二部分");
// 写出到文件
writer.flush(FileUtil.file("e:/wordWrite.docx"));
// 关闭
writer.close();

步骤3、启动项目,大功告成

完成前两步即可导出word文档。

********************************************************************************************************************************************************************************************************************************************************************************************************************

附:以下是我的功能具体实现(步骤1省略)

public RestResponse word(Integer examId) {
        Word07Writer word07Writer = new Word07Writer();
        // 1、得到当前试卷信息
        Exam exam = this.getById(examId);
        // 1.1 保存试卷名称
        word07Writer.addText(new Font("方正小标宋简体", Font.PLAIN, 22), "试卷名称:" + exam.getTitle());
        // 2、得到当前试卷的题目列表
        List<Integer> quIds = quExamService.listByExamId(examId);
        // 题目列表用
        int count = 1;
        for (Integer quId : quIds) {
            // 3、得到当前题目信息
            Question question = questionMapper.selectById(quId);
            // 4、保存到文件中:题目 格式为( 题目2. 多选题测试(20分))
            word07Writer.addText(new Font("宋体", Font.PLAIN, 15),
                    "题目" + (count++) + ". " + question.getContent() + "(" + (question.getQuScore()) + "分)");
            // 5、得到每个题目的选项列表
            List<QuAnswerDTO> quAnswerDTOList = quAnswerService.listByQu(quId);
            // 6、答案和解析
            StringBuilder answers = new StringBuilder();
            // 题目类型 1 单选题 2 多选题 3 判断题 4 简答题 5 填空题
            Integer quType = question.getQuType();
            for (QuAnswerDTO quAnswerDTO : quAnswerDTOList) {
                // 添加题目选项
                word07Writer.addText(new Font("宋体", Font.PLAIN, 10),
                        quAnswerDTO.getAbc() + "、" + quAnswerDTO.getContent());
                // 得到题目选项的答案 1 正确答案,0 错误答案
                Integer isRight = quAnswerDTO.getIsRight();
                String dtoAbc = quAnswerDTO.getAbc();
                // 得到正确答案
                this.getAnswers(quType, isRight, answers, dtoAbc);
            }
            // 7、得到答案并保存到文件中
            word07Writer.addText(new Font("宋体", Font.PLAIN, 10), "答案:" + answers);
            // 8、得到题目整体解析
            String analysis = question.getAnalysis();
            word07Writer.addText(new Font("宋体", Font.PLAIN, 10),
                    "解析:" + (Objects.isNull(analysis) ? "暂无解析" : analysis));
        }
        // 9、写出到文件(试卷名称.docx)
        word07Writer.flush(FileUtil.file("G:/" + Math.round(Math.random() * 100) + exam.getTitle() + ".docx"));
        // 10、关闭
        word07Writer.close();
        return RestResponse.ok();
    }
    /**
     * 得到答案
     *
     * @param quType  题目类型 1 单选题 2 多选题 3 判断题 4 简答题 5 填空题
     * @param isRight 是否为正确答案 1 正确答案,0 错误答案
     * @param answers 得到的答案
     * @param dtoAbc  选项ABC
     */
    private void getAnswers(Integer quType, Integer isRight, StringBuilder answers, String dtoAbc) {
        if (quType == Constants.QU_TYPE_SINGLE && isRight == Constants.NUMBER_ONE) {
            answers.append(dtoAbc);
        }
        if (quType == Constants.QU_TYPE_MULTI && isRight == Constants.NUMBER_ONE) {
            answers.append(dtoAbc);
        }
        if (quType == Constants.QU_TYPE_JUDGE && isRight == Constants.NUMBER_ONE) {
            answers.append(dtoAbc);
        }
        if (quType == Constants.QU_TYPE_SHORT && isRight == Constants.NUMBER_ONE) {
            answers.append(dtoAbc);
        }
        if (quType == Constants.QU_TYPE_FILL && isRight == Constants.NUMBER_ONE) {
            answers.append(dtoAbc);
        }
    }

实现的效果

 

 

在本地电脑可以,但是项目部署到服务器,还是无法下载到本地电脑,如果想要从服务器上下载word文档,请参考另一篇文章:【Java用法】使用Java导出word文档的解决方案(适用于从服务器上下载到本地电脑)

 

完结!

 


目录
打赏
0
0
0
0
17
分享
相关文章
Java 实现局域网电脑屏幕监控算法揭秘
在数字化办公环境中,局域网电脑屏幕监控至关重要。本文介绍用Java实现这一功能的算法,涵盖图像采集、数据传输和监控端显示三个关键环节。通过Java的AWT/Swing库和Robot类抓取屏幕图像,使用Socket进行TCP/IP通信传输图像数据,并利用ImageIO类在监控端展示图像。整个过程确保高效、实时和准确,为提升数字化管理提供了技术基础。
86 15
|
4月前
|
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
226 5
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
55 7
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
62 5
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
1881 2
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
【Bug合集】——Java大小写引起传参失败,获取值为null的解决方案
类中成员变量命名问题引起传送json字符串,但是变量为null的情况做出解释,@Data注解(Spring自动生成的get和set方法)和@JsonProperty
【潜意识java】前后端跨域问题及解决方案
本文深入探讨了跨域问题及其解决方案。跨域是指浏览器出于安全考虑,限制从一个域加载的网页请求另一个域的资源。
88 0
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####
Java多线程编程中的常见问题与解决方案
本文深入探讨了Java多线程编程中常见的问题,包括线程安全问题、死锁、竞态条件等,并提供了相应的解决策略。文章首先介绍了多线程的基础知识,随后详细分析了每个问题的产生原因和典型场景,最后提出了实用的解决方案,旨在帮助开发者提高多线程程序的稳定性和性能。
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
71 3