赞
踩
目录
最近在做一个word导出功能,需求非常简单,只需要将内容导出到word文件里即可,对于word的格式并没有要求。功能不复杂,想快速实现这个功能,但是使用POI的话,比较麻烦。本文记录一下通过一个工具类即可实现简单的word导出的功能。
项目架构:Springboot + mybatis-plus + MySQL + Maven
通过原生的POI实现这个功能感觉有点大材小用,实现起来也比较复杂。可参考一篇写的比较好的博客:Apache POI使用详解。已经有其他人写的很好了,这里就不再赘述。
POI读写Excel功能强大、操作简单。但是POI操作时,一般只用它读取word文档,POI只能能够创建简单的word文档,相对而言POI操作时的功能太少。
如果以下内容看不懂,可参考Hutool工具包关于poi的介绍:Hutool工具包的使用方法
- <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>

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();
完成前两步即可导出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文档的解决方案(适用于从服务器上下载到本地电脑)
完结!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。