【Java用法】使用Java导出word文档的解决方案(适用于从服务器上下载到本地电脑)

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

最近在做一个word导出功能,需求非常简单,只需要将内容导出到word文件里即可,对于word的格式并没有要求。功能不复杂,想快速实现这个功能,但是使用POI的话,比较麻烦。本文记录一下通过一个工具类即可实现简单的word导出的功能,上一篇文章讲的是通过这个工具类实现服用在本地,word文档下载到本地的功能。本文将会实现项目部署到服务器上,然后通过导出或者下载功能保存到本地电脑。

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

添加依赖,同上一篇文章:【Java用法】使用Java导出word文档的解决方案(适用于Windows电脑)

直接上代码喽:

一、Controller

    @ApiOperation(value = "根据examId导出word文档")
    @RequestMapping(value = "/word", method = RequestMethod.POST)
    public void word(@RequestBody ExamExportDTO examExportDTO, HttpServletResponse response) {
        // 写出到客户端下载(即写出到Servlet)
        Word07Writer word07Writer = examService.word(examExportDTO);
        // response是HttpServletResponse对象
        response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8");
        // test.docx是弹出下载对话框的文件名,不能为中文,中文请自行编码
        response.setHeader("Content-Disposition", "attachment;filename=test.docx");
        ServletOutputStream out = null;
        try {
            out = response.getOutputStream();
        } catch (IOException e) {
            log.error("根据examId导出word文档失败!", e);
        }
        // 写出到目标流
        word07Writer.flush(out);
        // 关闭writer,释放内存
        word07Writer.close();
        // 关闭输出Servlet流
        IoUtil.close(out);
    }

二、Service 接口类

    /**
     * 试卷导出word文档
     *
     * @param examExportDTO 试卷id和是否导出答案
     * @return 当前文件导出的路径位置
     */
    Word07Writer word(ExamExportDTO examExportDTO);

三、ServiceImpl 实现类

    @Override
    public Word07Writer word(ExamExportDTO examExportDTO) {
        Integer examId = examExportDTO.getExamId();
        Integer isExportAnswer = examExportDTO.getIsExportAnswer();
        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());
                if (isExportAnswer == Constants.NUMBER_ONE) {
                    // 得到题目选项的答案 1 正确答案,0 错误答案
                    Integer isRight = quAnswerDTO.getIsRight();
                    String dtoAbc = quAnswerDTO.getAbc();
                    // 得到正确答案
                    this.getAnswers(quType, isRight, answers, dtoAbc);
                }
            }
            if (isExportAnswer == Constants.NUMBER_ONE) {
                // 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));
            }
        }
        return word07Writer;
    }
    /**
     * 得到答案
     *
     * @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);
        }
    }

说明:与第一篇不同的是,将数据以流的形式通过Response返回给前端即可。浏览器会根据Response中的 content-type 类型去自动识别,然后进行下载或者保存的。

四、Content-Type 类型与MIME Type类型对照表

附:Content-Type 类型与MIME Type类型对照表(当然这只是 office 所有后缀的,还有其他类型,如音频、视频、图像、Html,Css等)

后缀 MIME Type
.doc application/msword
.dot application/msword
.docx application/vnd.openxmlformats-officedocument.wordprocessingml.document
.dotx application/vnd.openxmlformats-officedocument.wordprocessingml.template
.docm application/vnd.ms-word.document.macroEnabled.12
.dotm application/vnd.ms-word.template.macroEnabled.12
.xls application/vnd.ms-excel
.xlt application/vnd.ms-excel
.xla application/vnd.ms-excel
.xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xltx application/vnd.openxmlformats-officedocument.spreadsheetml.template
.xlsm application/vnd.ms-excel.sheet.macroEnabled.12
.xltm application/vnd.ms-excel.template.macroEnabled.12
.xlam application/vnd.ms-excel.addin.macroEnabled.12
.xlsb application/vnd.ms-excel.sheet.binary.macroEnabled.12
.ppt application/vnd.ms-powerpoint
.pot application/vnd.ms-powerpoint
.pps application/vnd.ms-powerpoint
.ppa application/vnd.ms-powerpoint
.pptx application/vnd.openxmlformats-officedocument.presentationml.presentation
.potx application/vnd.openxmlformats-officedocument.presentationml.template
.ppsx application/vnd.openxmlformats-officedocument.presentationml.slideshow
.ppam application/vnd.ms-powerpoint.addin.macroEnabled.12
.pptm application/vnd.ms-powerpoint.presentation.macroEnabled.12
.potm application/vnd.ms-powerpoint.presentation.macroEnabled.12
.ppsm application/vnd.ms-powerpoint.slideshow.macroEnabled.12

显示详细信息

 

 

 

完结!

 

 

 

 


相关文章
|
24天前
|
缓存 easyexcel Java
Java EasyExcel 导出报内存溢出如何解决
大家好,我是V哥。使用EasyExcel进行大数据量导出时容易导致内存溢出,特别是在导出百万级别的数据时。以下是V哥整理的解决该问题的一些常见方法,包括分批写入、设置合适的JVM内存、减少数据对象的复杂性、关闭自动列宽设置、使用Stream导出以及选择合适的数据导出工具。此外,还介绍了使用Apache POI的SXSSFWorkbook实现百万级别数据量的导出案例,帮助大家更好地应对大数据导出的挑战。欢迎一起讨论!
139 1
|
13天前
|
Java API Apache
|
17天前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
24 4
|
22天前
|
Web App开发 Java
使用java操作浏览器的工具selenium-java和webdriver下载地址
【10月更文挑战第12天】Selenium-java依赖包用于自动化Web测试,版本为3.141.59。ChromeDriver和EdgeDriver分别用于控制Chrome和Edge浏览器,需确保版本与浏览器匹配。示例代码展示了如何使用Selenium-java模拟登录CSDN,包括设置驱动路径、添加Cookies和获取页面源码。
|
22天前
|
存储 安全 Java
深入理解Java中的FutureTask:用法和原理
【10月更文挑战第28天】`FutureTask` 是 Java 中 `java.util.concurrent` 包下的一个类,实现了 `RunnableFuture` 接口,支持异步计算和结果获取。它可以作为 `Runnable` 被线程执行,同时通过 `Future` 接口获取计算结果。`FutureTask` 可以基于 `Callable` 或 `Runnable` 创建,常用于多线程环境中执行耗时任务,避免阻塞主线程。任务结果可通过 `get` 方法获取,支持阻塞和非阻塞方式。内部使用 AQS 实现同步机制,确保线程安全。
|
1月前
阿里云国际版购买了服务器后如何下载发票?
阿里云国际版购买了服务器后如何下载发票?
|
1月前
|
Java
java 文件上传和下载
java 文件上传和下载
21 0
|
5天前
|
机器学习/深度学习 人工智能 弹性计算
什么是阿里云GPU云服务器?GPU服务器优势、使用和租赁费用整理
阿里云GPU云服务器提供强大的GPU算力,适用于深度学习、科学计算、图形可视化和视频处理等多种场景。作为亚太领先的云服务提供商,阿里云的GPU云服务器具备灵活的资源配置、高安全性和易用性,支持多种计费模式,帮助企业高效应对计算密集型任务。
|
7天前
|
存储 分布式计算 固态存储
阿里云2核16G、4核32G、8核64G配置云服务器租用收费标准与活动价格参考
2核16G、8核64G、4核32G配置的云服务器处理器与内存比为1:8,这种配比的云服务器一般适用于数据分析与挖掘,Hadoop、Spark集群和数据库,缓存等内存密集型场景,因此,多为企业级用户选择。目前2核16G配置按量收费最低收费标准为0.54元/小时,按月租用标准收费标准为260.44元/1个月。4核32G配置的阿里云服务器按量收费标准最低为1.08元/小时,按月租用标准收费标准为520.88元/1个月。8核64G配置的阿里云服务器按量收费标准最低为2.17元/小时,按月租用标准收费标准为1041.77元/1个月。本文介绍这些配置的最新租用收费标准与活动价格情况,以供参考。
|
5天前
|
机器学习/深度学习 人工智能 弹性计算
阿里云GPU服务器全解析_GPU价格收费标准_GPU优势和使用说明
阿里云GPU云服务器提供强大的GPU算力,适用于深度学习、科学计算、图形可视化和视频处理等场景。作为亚太领先的云服务商,阿里云GPU云服务器具备高灵活性、易用性、容灾备份、安全性和成本效益,支持多种实例规格,满足不同业务需求。