美文网首页
jeecgBoot导出Word

jeecgBoot导出Word

作者: 中v中 | 来源:发表于2021-06-26 13:15 被阅读0次

1、在jeecg-boot-parent的pom.xml中添加以下依赖:

<!-- easypoi word工具类-->
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-base</artifactId>
    <version>3.0.3</version>
</dependency>

<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-web</artifactId>
    <version>3.0.3</version>
</dependency>

<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-annotation</artifactId>
    <version>3.0.3</version>
</dependency>

2、添加导出Word的方法:

/**

  • 导出word
  • <p>第一步生成替换后的word文件,只支持docx</p> * <p>第二步下载生成的文件</p> * <p>第三步删除生成的临时文件</p>* 模版变量中变量格式:{{foo}}
  • @param templatePath word模板地址
  • @param temDir 生成临时文件存放地址
  • @param fileName 文件名
  • @param params 替换的参数
  • @param request HttpServletRequest
  • @param response HttpServletResponse
    */

public static void exportWord(String templatePath, String temDir, String fileName, Map params, HttpServletRequest request, HttpServletResponse response) {
Assert.notNull(templatePath,"模板路径不能为空");
Assert.notNull(temDir,"临时文件路径不能为空");
Assert.notNull(fileName,"导出文件名不能为空");
Assert.isTrue(fileName.endsWith(".docx"),"word导出请使用docx格式");
if (!temDir.endsWith("/")) {
temDir = temDir + File.separator;
}
File dir =new File(temDir);
if (!dir.exists()) {
dir.mkdirs();
}

try {
    String userAgent = request.getHeader("user-agent").toLowerCase();
    if (userAgent.contains("msie") || userAgent.contains("like gecko")) {
        fileName = URLEncoder.encode(fileName,"UTF-8");
    }else {
        fileName =new String(fileName.getBytes("utf-8"),"ISO-8859-1");
    }

    XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params);
    String tmpPath = temDir + fileName;
    FileOutputStream fos =new FileOutputStream(tmpPath);
    doc.write(fos);

    response.setContentType("application/force-download");
    response.addHeader("Content-Disposition","attachment;fileName=" + fileName);
    OutputStream out = response.getOutputStream();
    doc.write(out);
    out.close();
}catch (Exception e) {
    e.printStackTrace();
}

}

3、将模板放入某一个文件夹下,模板中的变量用两个英文大括号{{}}包裹:

image

4、调用导出Word的方法:

public void exportSysStatistic(HttpServletRequest request, HttpServletResponse response) {
    Map params =new HashMap<>();
    params.put("year", year);
    params.put("month", month);
    params.put("day", day);
    exportWord("static/tmp/statisticWord.docx","D:/export","word.docx", params, request, response);
}

5、在ShiroConfig.java中放开访问控制:

filterChainDefinitionMap.put("/analyze/**","anon");

6、调试,浏览器中直接输入接口地址(如 http://localhost:8080/jeecg-boot/analyze/exportSysStatistic)测试。

7、如果第6步自动下载不成功,则可能为模板生成后乱码(检查编译后在target目录下的子目录中生成的模板文件是否能正常打开),需要在配置文件中进行如下配置:

image
    <!-- 避免font文件的二进制文件格式压缩破坏 -->

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <configuration>
            <nonFilteredFileExtensions>
                <nonFilteredFileExtension>xls</nonFilteredFileExtension>
                <nonFilteredFileExtension>woff</nonFilteredFileExtension>
                <nonFilteredFileExtension>woff2</nonFilteredFileExtension>
                <nonFilteredFileExtension>eot</nonFilteredFileExtension>
                <nonFilteredFileExtension>ttf</nonFilteredFileExtension>
                <nonFilteredFileExtension>svg</nonFilteredFileExtension>
                <nonFilteredFileExtension>docx</nonFilteredFileExtension>
            </nonFilteredFileExtensions>
        </configuration>
</plugin>

<resource>
    <directory>src/main/resources</directory>
    <filtering>false</filtering>
    <includes>
        <include>**/**/*.docx</include>
    </includes>
</resource>

8、重新进行第6步操作,成功。

参考改编自:https://blog.csdn.net/weixin_34310785/article/details/89650505


实际代码(后端):

@RequestMapping(value = "downReport", method = RequestMethod.GET)
    public void downReport(@RequestParam(name = "id", required = true) String id, HttpServletRequest request, HttpServletResponse response) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String curTime = format.format(new Date());
        String templateFile = "classpath:download-templates/inspect-report.docx";
        ResourceLoader resourceLoader = new DefaultResourceLoader();
        Resource resource = null;
        resource = resourceLoader.getResource(templateFile);
        log.info(this.uploadPath);
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("s1", "北京石油化工科技有限责任公司");
        map.put("s2", "北京石油化工科技有限责任公司");
        map.put("s3", "北京石油化工科技有限责任公司");
        map.put("s4", "被");
        map.put("s5", "净");
        for (int i = 6; i < 51; i++) {
            map.put("s" + i, "test" + i);
        }
        try {
            String pat = resource.getFile().getPath();
            XWPFDocument doc = WordExportUtil.exportWord07(pat, map);
//            FileOutputStream fos = new FileOutputStream(basePath + "自查及风险评估报告new.docx");
//            doc.write(fos);
//            fos.close();
            response.setContentType("application/force-download");
            response.addHeader("Content-Disposition", "attachment;fileName=" + java.net.URLEncoder.encode("自查及风险评估报告.docx", "UTF-8"));
            OutputStream out = response.getOutputStream();
            doc.write(out);
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

前后端分离的前端代码

downReport() {
      this.$axios({
        method: 'get',
        url: `${this.url.downReport}?id=${this.inspectRow.id}`,
        responseType: 'blob',
      }).then((res) => {
        if (res.type == 'application/force-download') {
          if (!res) {
            return
          }
          const url = window.URL.createObjectURL(res)
          const link = document.createElement('a')
          link.style.display = 'none'
          link.href = url
          link.setAttribute('download', '责任自查风险评估.docx')
          document.body.appendChild(link)
          link.click()
          this.$info('下载成功')
        } else {
          this.$error('下载失败')
        }
      })
    },

其中第7步的maven配置很重要*

相关文章