当前位置:   article > 正文

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

java 读取服务器word文件 下载

本文目录

一、Controller

二、Service 接口类

三、ServiceImpl 实现类

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


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

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

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

直接上代码喽:

一、Controller

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

二、Service 接口类

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

三、ServiceImpl 实现类

  1. @Override
  2. public Word07Writer word(ExamExportDTO examExportDTO) {
  3. Integer examId = examExportDTO.getExamId();
  4. Integer isExportAnswer = examExportDTO.getIsExportAnswer();
  5. Word07Writer word07Writer = new Word07Writer();
  6. // 1、得到当前试卷信息
  7. Exam exam = this.getById(examId);
  8. // 1.1 保存试卷名称
  9. word07Writer.addText(new Font("方正小标宋简体", Font.PLAIN, 22), "试卷名称:" + exam.getTitle());
  10. // 2、得到当前试卷的题目列表
  11. List<Integer> quIds = quExamService.listByExamId(examId);
  12. // 题目列表用
  13. int count = 1;
  14. for (Integer quId : quIds) {
  15. // 3、得到当前题目信息
  16. Question question = questionMapper.selectById(quId);
  17. // 4、保存到文件中:题目 格式为( 题目2. 多选题测试(20分))
  18. word07Writer.addText(new Font("宋体", Font.PLAIN, 15),
  19. "题目" + (count++) + ". " + question.getContent() + "(" + (question.getQuScore()) + "分)");
  20. // 5、得到每个题目的选项列表
  21. List<QuAnswerDTO> quAnswerDTOList = quAnswerService.listByQu(quId);
  22. // 6、答案和解析
  23. StringBuilder answers = new StringBuilder();
  24. // 题目类型 1 单选题 2 多选题 3 判断题 4 简答题 5 填空题
  25. Integer quType = question.getQuType();
  26. for (QuAnswerDTO quAnswerDTO : quAnswerDTOList) {
  27. // 添加题目选项
  28. word07Writer.addText(new Font("宋体", Font.PLAIN, 10),
  29. quAnswerDTO.getAbc() + "、" + quAnswerDTO.getContent());
  30. if (isExportAnswer == Constants.NUMBER_ONE) {
  31. // 得到题目选项的答案 1 正确答案,0 错误答案
  32. Integer isRight = quAnswerDTO.getIsRight();
  33. String dtoAbc = quAnswerDTO.getAbc();
  34. // 得到正确答案
  35. this.getAnswers(quType, isRight, answers, dtoAbc);
  36. }
  37. }
  38. if (isExportAnswer == Constants.NUMBER_ONE) {
  39. // 7、得到答案并保存到文件中
  40. word07Writer.addText(new Font("宋体", Font.PLAIN, 10), "答案:" + answers);
  41. // 8、得到题目整体解析
  42. String analysis = question.getAnalysis();
  43. word07Writer.addText(new Font("宋体", Font.PLAIN, 10),
  44. "解析:" + (Objects.isNull(analysis) ? "暂无解析" : analysis));
  45. }
  46. }
  47. return word07Writer;
  48. }
  49. /**
  50. * 得到答案
  51. *
  52. * @param quType 题目类型 1 单选题 2 多选题 3 判断题 4 简答题 5 填空题
  53. * @param isRight 是否为正确答案 1 正确答案,0 错误答案
  54. * @param answers 得到的答案
  55. * @param dtoAbc 选项ABC
  56. */
  57. private void getAnswers(Integer quType, Integer isRight, StringBuilder answers, String dtoAbc) {
  58. if (quType == Constants.QU_TYPE_SINGLE && isRight == Constants.NUMBER_ONE) {
  59. answers.append(dtoAbc);
  60. }
  61. if (quType == Constants.QU_TYPE_MULTI && isRight == Constants.NUMBER_ONE) {
  62. answers.append(dtoAbc);
  63. }
  64. if (quType == Constants.QU_TYPE_JUDGE && isRight == Constants.NUMBER_ONE) {
  65. answers.append(dtoAbc);
  66. }
  67. if (quType == Constants.QU_TYPE_SHORT && isRight == Constants.NUMBER_ONE) {
  68. answers.append(dtoAbc);
  69. }
  70. if (quType == Constants.QU_TYPE_FILL && isRight == Constants.NUMBER_ONE) {
  71. answers.append(dtoAbc);
  72. }
  73. }

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

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

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

后缀MIME Type
.docapplication/msword
.dotapplication/msword
.docxapplication/vnd.openxmlformats-officedocument.wordprocessingml.document
.dotxapplication/vnd.openxmlformats-officedocument.wordprocessingml.template
.docmapplication/vnd.ms-word.document.macroEnabled.12
.dotmapplication/vnd.ms-word.template.macroEnabled.12
.xlsapplication/vnd.ms-excel
.xltapplication/vnd.ms-excel
.xlaapplication/vnd.ms-excel
.xlsxapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xltxapplication/vnd.openxmlformats-officedocument.spreadsheetml.template
.xlsmapplication/vnd.ms-excel.sheet.macroEnabled.12
.xltmapplication/vnd.ms-excel.template.macroEnabled.12
.xlamapplication/vnd.ms-excel.addin.macroEnabled.12
.xlsbapplication/vnd.ms-excel.sheet.binary.macroEnabled.12
.pptapplication/vnd.ms-powerpoint
.potapplication/vnd.ms-powerpoint
.ppsapplication/vnd.ms-powerpoint
.ppaapplication/vnd.ms-powerpoint
.pptxapplication/vnd.openxmlformats-officedocument.presentationml.presentation
.potxapplication/vnd.openxmlformats-officedocument.presentationml.template
.ppsxapplication/vnd.openxmlformats-officedocument.presentationml.slideshow
.ppamapplication/vnd.ms-powerpoint.addin.macroEnabled.12
.pptmapplication/vnd.ms-powerpoint.presentation.macroEnabled.12
.potmapplication/vnd.ms-powerpoint.presentation.macroEnabled.12
.ppsmapplication/vnd.ms-powerpoint.slideshow.macroEnabled.12

 

 

 

完结!

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/43572
推荐阅读
相关标签
  

闽ICP备14008679号