Java预览下载word文档(poi-tl、thymeleaf模板)

主要功能

  • 预览word文档
  • 生成并下载word文档

实现

  • 前端Vue代码
    预览功能主要使用的是docx-preview下载方式如下:
npm install docx-preview --save
<template>
  <div class="hello">
    <el-button type="primary" round @click="preview">预览el-button>
    <el-button type="success" round @click="download">下载el-button>
    <el-button type="success" round @click="downloadThymeleaf">下载thymeleafel-button>
    <el-dialog :visible.sync="dialogVisible" :fullscreen="true">
      <div ref="file">div>
      
    el-dialog>
    <div style="margin: 0 auto;width: 80vw; margin-top: 20px;">
      <el-table :data="showTable" border>
        <el-table-column prop="id" label="ID" width="180" align="center"/>
        <el-table-column prop="date" label="Date" width="180" />
        <el-table-column prop="name" label="Name" width="180" />
        <el-table-column prop="address" label="Address" />
        <el-table-column label="Operation" align="center">
          <template slot-scope="scope">
            <i class="el-icon-delete" @click="removeActive(scope.$index)">i>
          template>
        el-table-column>
      el-table>
      <div class="block" style="margin-top: 10px;">
        <el-pagination
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          :current-page="page"
          :page-sizes="[5, 10]"
          :page-size="size"
          layout="total, sizes, prev, pager, next, jumper"
          :total="getTotalCount">
        el-pagination>
      div>
    div>
  div>
template>

<script>
import axios from 'axios'
// 引入docx-preview插件
let docx = require("docx-preview");

export default {
  name: 'HelloWorld',
  data() {
    return {
      vHtml: "",
      dialogVisible: false,
      showTable: [],
      tableData: [
        {
          id: 1,
          date: '2016-05-03',
          name: 'Tom',
          address: 'No. 189, Grove St, Los Angeles',
        },
        {
          id: 2,
          date: '2016-05-02',
          name: 'Tom',
          address: 'No. 189, Grove St, Los Angeles',
        },
        {
          id: 3,
          date: '2016-05-04',
          name: 'Tom',
          address: 'No. 189, Grove St, Los Angeles',
        },
        {
          id: 4,
          date: '2016-05-01',
          name: 'Tom',
          address: 'No. 189, Grove St, Los Angeles',
        },
        {
          id: 5,
          date: '2016-05-01',
          name: 'Tom',
          address: 'No. 189, Grove St, Los Angeles',
        },
        {
          id: 6,
          date: '2016-05-01',
          name: 'Tom',
          address: 'No. 189, Grove St, Los Angeles',
        },
        {
          id: 7,
          date: '2016-05-01',
          name: 'Tom',
          address: 'No. 189, Grove St, Los Angeles',
        },
        {
          id: 8,
          date: '2016-05-01',
          name: 'Tom',
          address: 'No. 189, Grove St, Los Angeles',
        },
        {
          id: 9,
          date: '2016-05-01',
          name: 'Tom',
          address: 'No. 189, Grove St, Los Angeles',
        },
        {
          id: 10,
          date: '2016-05-01',
          name: 'Tom',
          address: 'No. 189, Grove St, Los Angeles',
        },
        {
          id: 11,
          date: '2016-05-01',
          name: 'Tom',
          address: 'No. 189, Grove St, Los Angeles',
        },
      ],
      page: 1,
      size: 5
    }
  },
  props: {
    msg: String
  },
  mounted() {
    this.getPageList()
  },
  computed: {
    getTotalCount() {
      return this.tableData.length;
    }
  },
  methods: {
    getPageList() {
      let start = (this.page - 1) * this.size
      let end = start + this.size
      if (start < 0) {
        start = 0
        end = this.size
      }
      if (end > this.getTotalCount) {
        end = this.getTotalCount
      }
      this.showTable = this.tableData.slice(start, end)
    },
    preview() {
      this.dialogVisible = true
      axios({
        url: '/api/downloadWord',
        method: 'post',
        responseType: "arraybuffer"
      }).then(res => {
        this.$nextTick(()=>{
          docx.renderAsync(res.data, this.$refs.file, null, {
            className: "docx", //默认和文档样式类的类名/前缀
            inWrapper: true, //启用围绕文档内容呈现包装器
            ignoreWidth: false, //禁用页面的渲染宽度
            ignoreHeight: false, //禁用页面的渲染高度
            ignoreFonts: false, //禁用字体渲染
            breakPages: true, //在分页符上启用分页
            ignoreLastRenderedPageBreak: true, //在lastRenderedPageBreak元素上禁用分页
            experimental: false, //启用实验功能(制表符停止计算)
            trimXmlDeclaration: true, //如果为true,则在解析之前将从xml文档中删除xml声明
            useBase64URL: false, //如果为true,图像、字体等将转换为base 64 URL,否则使用URL.createObjectURL
            useMathMLPolyfill: false, //包括用于铬、边等的MathML多填充。
            showChanges: false, //启用文档更改的实验渲染(插入/删除)
            debug: false, //启用额外的日志记录
          });
        })
      }).catch(err => {
        console.log(err)
        this.$message.error('预览失败');
      })
    },
    download() {
      axios.defaults.responseType = "blob";
      axios({
        url: '/api/downloadWord',
        method: 'post'
      }).then(res => {
        let contentDisposition = res.headers['content-disposition'];
        // 将URL参数数值转成汉字        
        let fileName = decodeURI(contentDisposition.substring(contentDisposition.indexOf('=') + 1));
        // 处理IE以及IE内核的浏览器兼容问题        
        if (window.navigator && window.navigator.msSaveOrOpenBlob) {
          navigator.msSaveBlob(res.data, fileName);
        } else {
          // 处理google firefox浏览器兼容问题            
          let url = window.URL.createObjectURL(new Blob([res.data]));
          let a = document.createElement('a');
          a.style.display = 'none';
          a.href = url;
          a.setAttribute('download', fileName);
          document.body.appendChild(a);
          a.click();
          document.body.removeChild(a);
          window.URL.revokeObjectURL(url);
        }
        this.$message({
          message: '下载成功',
          type: 'success'
        });
      }).catch(err => {
        console.log(err)
        this.$message.error('下载失败');
      })
    },
    downloadThymeleaf() {
      axios.defaults.responseType = "blob";
      axios({
        url: '/api/downloadThymeleafWord',
        method: 'post'
      }).then(res => {
        let contentDisposition = res.headers['content-disposition'];
        // 将URL参数数值转成汉字        
        let fileName = decodeURI(contentDisposition.substring(contentDisposition.indexOf('=') + 1));
        // 处理IE以及IE内核的浏览器兼容问题        
        if (window.navigator && window.navigator.msSaveOrOpenBlob) {
          navigator.msSaveBlob(res.data, fileName);
        } else {
          // 处理google firefox浏览器兼容问题            
          let url = window.URL.createObjectURL(new Blob([res.data]));
          let a = document.createElement('a');
          a.style.display = 'none';
          a.href = url;
          a.setAttribute('download', fileName);
          document.body.appendChild(a);
          a.click();
          document.body.removeChild(a);
          window.URL.revokeObjectURL(url);
        }
        this.$message({
          message: '下载成功',
          type: 'success'
        });
      }).catch(err => {
        console.log(err)
        this.$message.error('下载失败');
      })
    },
    handleSizeChange(val) {
      this.size = val
      this.getPageList()
    },
    handleCurrentChange(val) {
      this.page = val
      this.getPageList()
    },
    removeActive(index) {
      let rmIndex = (this.page - 1) * this.size + index
      this.tableData.splice(rmIndex, 1)
      this.showTable.splice(index, 1)
      if (this.showTable.length === 0 && this.page >= 1) {
        this.page = this.page - 1
      }
      this.getPageList()
    }
  }
}
script>
<style scoped>
/deep/.el-dialog__body {
  padding: 0;
}
/deep/.el-dialog__header {
  padding: 0;
}
/deep/.el-dialog__headerbtn .el-dialog__close{
  color: #fff;
} 
style>
  • 后端代码
    方法一:使用poi-tl这个工具很方便 他是一个word的模板引擎 主旨即所见即所得 大概意思是:你的word模板什么样 生成的word文件也是什么样
  • 参考文档如下:poi-tl参考手册
  • 模板大致长这样
    Java预览下载word文档(poi-tl、thymeleaf模板)_第1张图片
    需要注意的点在于:在给图表配置变量时WPS的配置位置在 右键->设置图标标题格式->文本选项->可选文字
    Java预览下载word文档(poi-tl、thymeleaf模板)_第2张图片
  • poi-tl依赖
<dependency>
    <groupId>com.deepoovegroupId>
    <artifactId>poi-tlartifactId>
    <version>1.12.1version>
dependency>
  • poi-tl模板解析
	@RequestMapping(value = "/downloadWord", method = {RequestMethod.GET, RequestMethod.POST})
    public void downloadWord(HttpServletResponse response){

        List<TableEntity> list = new ArrayList<>();
        TableEntity tableEntity = null;
        for (int i = 1; i <= 100; i++) {
            tableEntity = new TableEntity();
            Class<? extends TableEntity> aClass = tableEntity.getClass();
            Field[] fields = aClass.getDeclaredFields();
            int index = 1;
            for (Field field : fields) {
                String fieldName = StrUtil.upperFirst(field.getName());
                try {
                    Method declaredMethod = aClass.getDeclaredMethod("set" + fieldName, String.class);
                    declaredMethod.invoke(tableEntity, "列-" + i + "-" + index);
                } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
                    throw new RuntimeException("文件生成失败");
                }
                index++;
            }
            list.add(tableEntity);
        }
        Map<String, Object> dataMap = new HashMap<>();
        dataMap.put("title1", "关于劳动时间变化通知");
        dataMap.put("title11", "标题1");
        dataMap.put("title12", "标题2");
        dataMap.put("title13", "标题3");
        dataMap.put("tblShowFlg", true);
        dataMap.put("tables", list);
        ChartMultiSeriesRenderData chart = Charts
                .ofMultiSeries("ChartTitle", new String[] { "中文", "English" })
                .addSeries("countries", new Double[] { 15.0, 6.0 })
                .addSeries("speakers", new Double[] { 223.0, 119.0 })
                .create();
        dataMap.put("image", "https://img2.baidu.com/it/u=1539597884,2048746071&fm=253&fmt=auto&app=138&f=JPEG?w=505&h=500");
        dataMap.put("barChart", chart);
        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
        Configure config = Configure.builder()
                .bind("tables", policy).build();
        ClassPathResource templateFile = new ClassPathResource("/static/doc/word_template.docx");

        try (OutputStream out = response.getOutputStream();
             BufferedOutputStream bos = new BufferedOutputStream(out)) {
            String fileName = "【社会保障部】关于上班时长变化通知.docx";
            response.setContentType("application/octet-stream");
            response.setHeader("Content-disposition","attachment;filename="
                    + URLEncoder.encode(fileName, "UTF-8"));
            String filePath = templateFile.getFile().getPath();
            XWPFTemplate template = XWPFTemplate.compile(filePath, config).render(dataMap);
            template.write(bos);
            bos.flush();
            out.flush();
            PoitlIOUtils.closeQuietlyMulti(template, bos, out);
        } catch (IOException e) {
            throw new RuntimeException("文件生成失败");
        }
    }
  • 方法一 最终效果如下:
    Java预览下载word文档(poi-tl、thymeleaf模板)_第3张图片

*方法二:使用模板引擎(thymeleaf、freemarker等)这里我使用的是thymeleaf 其实大致原理差不多 只是语法上的差别 相对于上边的poi-tl的模板制作过程这个要麻烦一些 *

  • 上代码(不要被吓到)模板
    其实也很简单,word文件修改一下后缀变成.xml就会变成这样,我们仅需将所需要的标签位置修改成thymeleaf的语法即可(在下面搜th:即可找到我修改的位置)


<w:wordDocument xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"
    xmlns:v="urn:schemas-microsoft-com:vml"
    xmlns:w10="urn:schemas-microsoft-com:office:word"
    xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core"
    xmlns:aml="http://schemas.microsoft.com/aml/2001/core"
    xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint"
    xmlns:o="urn:schemas-microsoft-com:office:office"
    xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no" xml:space="preserve"
    xmlns:wpsCustomData="http://www.wps.cn/officeDocument/2013/wpsCustomData">
    <w:body>
        <wx:sect>
            <w:p>
                <w:pPr>
                    <w:pStyle w:val="3"/>
                    <w:jc w:val="center"/>
                    <w:rPr>
                        <w:rFonts w:hint="fareast"/>
                        <w:lang w:val="EN-US"/>
                    w:rPr>
                w:pPr>
                <w:r>
                    <w:rPr>
                        <w:rFonts w:hint="fareast"/>
                        <w:lang w:val="EN-US"/>
                    w:rPr>
                    <w:t th:text="${title1}">文档标题w:t>
                w:r>
            w:p>
            <w:p>
                <w:pPr>
                    <w:rPr>
                        <w:rFonts w:hint="default"/>
                        <w:sz w:val="24"/>
                        <w:sz-cs w:val="24"/>
                        <w:lang w:val="EN-US"/>
                    w:rPr>
                w:pPr>
                <w:r>
                    <w:rPr>
                        <w:rFonts w:hint="fareast"/>
                        <w:sz w:val="24"/>
                        <w:sz-cs w:val="24"/>
                        <w:lang w:val="EN-US"/>
                    w:rPr>
                    <w:t th:text="${title11}">公司文档w:t>
                w:r>
            w:p>
            <w:p>
                <w:pPr>
                    <w:rPr>
                        <w:rFonts w:hint="default"/>
                        <w:sz w:val="24"/>
                        <w:sz-cs w:val="24"/>
                        <w:lang w:val="EN-US"/>
                    w:rPr>
                w:pPr>
                <w:r>
                    <w:rPr>
                        <w:rFonts w:hint="fareast"/>
                        <w:sz w:val="24"/>
                        <w:sz-cs w:val="24"/>
                        <w:lang w:val="EN-US"/>
                    w:rPr>
                    <w:t th:text="${title12}">>表格内容w:t>
                w:r>
            w:p>
            <w:tbl>
                <w:tblPr>
                    <w:tblStyle w:val="a5"/>
                    <w:tblW w:w="0" w:type="auto"/>
                    <w:tblInd w:w="0" w:type="dxa"/>
                    <w:tblBorders>
                        <w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
                        <w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
                        <w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
                        <w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
                        <w:insideH w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
                        <w:insideV w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
                    w:tblBorders>
                    <w:tblCellMar>
                        <w:left w:w="108" w:type="dxa"/>
                        <w:right w:w="108" w:type="dxa"/>
                    w:tblCellMar>
                w:tblPr>
                <w:tblGrid>
                    <w:gridCol w:w="1704"/>
                    <w:gridCol w:w="1704"/>
                    <w:gridCol w:w="1704"/>
                    <w:gridCol w:w="1705"/>
                    <w:gridCol w:w="1705"/>
                w:tblGrid>
                <w:tr>
                    <w:tblPrEx>
                        <w:tblBorders>
                            <w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
                            <w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
                            <w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
                            <w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
                            <w:insideH w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
                            <w:insideV w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
                        w:tblBorders>
                        <w:tblCellMar>
                            <w:left w:w="108" w:type="dxa"/>
                            <w:right w:w="108" w:type="dxa"/>
                        w:tblCellMar>
                    w:tblPrEx>
                    <w:trPr/>
                    <w:tc>
                        <w:tcPr>
                            <w:tcW w:w="1704" w:type="dxa"/>
                            <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
                        w:tcPr>
                        <w:p>
                            <w:pPr>
                                <w:jc w:val="center"/>
                                <w:rPr>
                                    <w:rFonts w:hint="default"/>
                                    <w:sz w:val="21"/>
                                    <w:sz-cs w:val="21"/>
                                    <w:vertAlign w:val="baseline"/>
                                    <w:lang/>
                                w:rPr>
                            w:pPr>
                            <w:r>
                                <w:rPr>
                                    <w:rFonts w:hint="fareast"/>
                                    <w:sz w:val="21"/>
                                    <w:sz-cs w:val="21"/>
                                    <w:vertAlign w:val="baseline"/>
                                    <w:lang w:val="EN-US"/>
                                w:rPr>
                                <w:t>列1w:t>
                            w:r>
                        w:p>
                    w:tc>
                    <w:tc>
                        <w:tcPr>
                            <w:tcW w:w="1704" w:type="dxa"/>
                            <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
                        w:tcPr>
                        <w:p>
                            <w:pPr>
                                <w:jc w:val="center"/>
                                <w:rPr>
                                    <w:rFonts w:hint="default"/>
                                    <w:sz w:val="21"/>
                                    <w:sz-cs w:val="21"/>
                                    <w:vertAlign w:val="baseline"/>
                                    <w:lang/>
                                w:rPr>
                            w:pPr>
                            <w:r>
                                <w:rPr>
                                    <w:rFonts w:hint="fareast"/>
                                    <w:sz w:val="21"/>
                                    <w:sz-cs w:val="21"/>
                                    <w:vertAlign w:val="baseline"/>
                                    <w:lang w:val="EN-US"/>
                                w:rPr>
                                <w:t>列2w:t>
                            w:r>
                        w:p>
                    w:tc>
                    <w:tc>
                        <w:tcPr>
                            <w:tcW w:w="1704" w:type="dxa"/>
                            <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
                        w:tcPr>
                        <w:p>
                            <w:pPr>
                                <w:jc w:val="center"/>
                                <w:rPr>
                                    <w:rFonts w:hint="default"/>
                                    <w:sz w:val="21"/>
                                    <w:sz-cs w:val="21"/>
                                    <w:vertAlign w:val="baseline"/>
                                    <w:lang/>
                                w:rPr>
                            w:pPr>
                            <w:r>
                                <w:rPr>
                                    <w:rFonts w:hint="fareast"/>
                                    <w:sz w:val="21"/>
                                    <w:sz-cs w:val="21"/>
                                    <w:vertAlign w:val="baseline"/>
                                    <w:lang w:val="EN-US"/>
                                w:rPr>
                                <w:t>列3w:t>
                            w:r>
                        w:p>
                    w:tc>
                    <w:tc>
                        <w:tcPr>
                            <w:tcW w:w="1705" w:type="dxa"/>
                            <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
                        w:tcPr>
                        <w:p>
                            <w:pPr>
                                <w:jc w:val="center"/>
                                <w:rPr>
                                    <w:rFonts w:hint="default"/>
                                    <w:sz w:val="21"/>
                                    <w:sz-cs w:val="21"/>
                                    <w:vertAlign w:val="baseline"/>
                                    <w:lang/>
                                w:rPr>
                            w:pPr>
                            <w:r>
                                <w:rPr>
                                    <w:rFonts w:hint="fareast"/>
                                    <w:sz w:val="21"/>
                                    <w:sz-cs w:val="21"/>
                                    <w:vertAlign w:val="baseline"/>
                                    <w:lang w:val="EN-US"/>
                                w:rPr>
                                <w:t>列4w:t>
                            w:r>
                        w:p>
                    w:tc>
                    <w:tc>
                        <w:tcPr>
                            <w:tcW w:w="1705" w:type="dxa"/>
                            <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
                        w:tcPr>
                        <w:p>
                            <w:pPr>
                                <w:jc w:val="center"/>
                                <w:rPr>
                                    <w:rFonts w:hint="default"/>
                                    <w:sz w:val="21"/>
                                    <w:sz-cs w:val="21"/>
                                    <w:vertAlign w:val="baseline"/>
                                    <w:lang/>
                                w:rPr>
                            w:pPr>
                            <w:r>
                                <w:rPr>
                                    <w:rFonts w:hint="fareast"/>
                                    <w:sz w:val="21"/>
                                    <w:sz-cs w:val="21"/>
                                    <w:vertAlign w:val="baseline"/>
                                    <w:lang w:val="EN-US"/>
                                w:rPr>
                                <w:t>列5w:t>
                            w:r>
                        w:p>
                    w:tc>
                w:tr>
                <w:tr th:each="var: ${tables}">
                    <w:tblPrEx>
                        <w:tblBorders>
                            <w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
                            <w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
                            <w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
                            <w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
                            <w:insideH w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
                            <w:insideV w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/>
                        w:tblBorders>
                        <w:tblCellMar>
                            <w:left w:w="108" w:type="dxa"/>
                            <w:right w:w="108" w:type="dxa"/>
                        w:tblCellMar>
                    w:tblPrEx>
                    <w:trPr/>
                    <w:tc>
                        <w:tcPr>
                            <w:tcW w:w="1704" w:type="dxa"/>
                            <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
                        w:tcPr>
                        <w:p>
                            <w:pPr>
                                <w:rPr>
                                    <w:rFonts w:hint="default"/>
                                    <w:sz w:val="21"/>
                                    <w:sz-cs w:val="21"/>
                                    <w:vertAlign w:val="baseline"/>
                                    <w:lang/>
                                w:rPr>
                            w:pPr>
                            <w:r>
                                <w:rPr>
                                    <w:rFonts w:hint="fareast"/>
                                    <w:sz w:val="21"/>
                                    <w:sz-cs w:val="21"/>
                                    <w:vertAlign w:val="baseline"/>
                                    <w:lang w:val="EN-US"/>
                                w:rPr>
                                <w:t th:text="${var.td1}">w:t>
                            w:r>
                        w:p>
                    w:tc>
                    <w:tc>
                        <w:tcPr>
                            <w:tcW w:w="1704" w:type="dxa"/>
                            <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
                        w:tcPr>
                        <w:p>
                            <w:pPr>
                                <w:rPr>
                                    <w:rFonts w:hint="default"/>
                                    <w:sz w:val="21"/>
                                    <w:sz-cs w:val="21"/>
                                    <w:vertAlign w:val="baseline"/>
                                    <w:lang/>
                                w:rPr>
                            w:pPr>
                            <w:r>
                                <w:rPr>
                                    <w:rFonts w:hint="fareast"/>
                                    <w:sz w:val="21"/>
                                    <w:sz-cs w:val="21"/>
                                    <w:vertAlign w:val="baseline"/>
                                    <w:lang w:val="EN-US"/>
                                w:rPr>
                                <w:t th:text="${var.td2}">w:t>
                            w:r>
                        w:p>
                    w:tc>
                    <w:tc>
                        <w:tcPr>
                            <w:tcW w:w="1704" w:type="dxa"/>
                            <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
                        w:tcPr>
                        <w:p>
                            <w:pPr>
                                <w:rPr>
                                    <w:rFonts w:hint="default"/>
                                    <w:sz w:val="21"/>
                                    <w:sz-cs w:val="21"/>
                                    <w:vertAlign w:val="baseline"/>
                                    <w:lang/>
                                w:rPr>
                            w:pPr>
                            <w:r>
                                <w:rPr>
                                    <w:rFonts w:hint="fareast"/>
                                    <w:sz w:val="21"/>
                                    <w:sz-cs w:val="21"/>
                                    <w:vertAlign w:val="baseline"/>
                                    <w:lang w:val="EN-US"/>
                                w:rPr>
                                <w:t th:text="${var.td3}">w:t>
                            w:r>
                        w:p>
                    w:tc>
                    <w:tc>
                        <w:tcPr>
                            <w:tcW w:w="1705" w:type="dxa"/>
                            <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
                        w:tcPr>
                        <w:p>
                            <w:pPr>
                                <w:rPr>
                                    <w:rFonts w:hint="default"/>
                                    <w:sz w:val="21"/>
                                    <w:sz-cs w:val="21"/>
                                    <w:vertAlign w:val="baseline"/>
                                    <w:lang/>
                                w:rPr>
                            w:pPr>
                            <w:r>
                                <w:rPr>
                                    <w:rFonts w:hint="fareast"/>
                                    <w:sz w:val="21"/>
                                    <w:sz-cs w:val="21"/>
                                    <w:vertAlign w:val="baseline"/>
                                    <w:lang w:val="EN-US"/>
                                w:rPr>
                                <w:t th:text="${var.td4}">w:t>
                            w:r>
                        w:p>
                    w:tc>
                    <w:tc>
                        <w:tcPr>
                            <w:tcW w:w="1705" w:type="dxa"/>
                            <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
                        w:tcPr>
                        <w:p>
                            <w:pPr>
                                <w:rPr>
                                    <w:rFonts w:hint="default"/>
                                    <w:sz w:val="21"/>
                                    <w:sz-cs w:val="21"/>
                                    <w:vertAlign w:val="baseline"/>
                                    <w:lang/>
                                w:rPr>
                            w:pPr>
                            <w:r>
                                <w:rPr>
                                    <w:rFonts w:hint="fareast"/>
                                    <w:sz w:val="21"/>
                                    <w:sz-cs w:val="21"/>
                                    <w:vertAlign w:val="baseline"/>
                                    <w:lang w:val="EN-US"/>
                                w:rPr>
                                <w:t th:text="${var.td5}">w:t>
                            w:r>
                        w:p>
                    w:tc>
                w:tr>
            w:tbl>
            <w:p>
                <w:pPr>
                    <w:rPr>
                        <w:rFonts w:hint="default"/>
                        <w:sz w:val="24"/>
                        <w:sz-cs w:val="24"/>
                        <w:lang w:val="EN-US"/>
                    w:rPr>
                w:pPr>
            w:p>
            <w:sectPr>
                <w:pgSz w:w="11906" w:h="16838"/>
                <w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="851" w:footer="992" w:gutter="0"/>
                <w:cols w:space="425"/>
                <w:docGrid w:type="lines" w:line-pitch="312"/>
            w:sectPr>
        wx:sect>
    w:body>
w:wordDocument>
  • 使用模板引擎对模板进行解析赋值
	@RequestMapping(value = "/downloadThymeleafWord", method = {RequestMethod.GET, RequestMethod.POST})
    public void downloadThymeleafWord(HttpServletResponse response){

        List<TableEntity> list = new ArrayList<>();
        TableEntity tableEntity = null;
        for (int i = 1; i <= 100; i++) {
            tableEntity = new TableEntity();
            Class<? extends TableEntity> aClass = tableEntity.getClass();
            Field[] fields = aClass.getDeclaredFields();
            int index = 1;
            for (Field field : fields) {
                String fieldName = StrUtil.upperFirst(field.getName());
                try {
                    Method declaredMethod = aClass.getDeclaredMethod("set" + fieldName, String.class);
                    declaredMethod.invoke(tableEntity, "列-" + i + "-" + index);
                } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
                    throw new RuntimeException("文件生成失败");
                }
                index++;
            }
            list.add(tableEntity);
        }
        Context context = new Context();
        Map<String, Object> dataMap = new HashMap<>();
        dataMap.put("title1", "关于劳动时间变化通知");
        dataMap.put("title11", "标题1");
        dataMap.put("title12", "标题2");
        dataMap.put("tables", list);
        dataMap.put("author", "OK OK");
        context.setVariables(dataMap);
        TemplateEngine engine = new TemplateEngine();

        try {
            String fileName = "【社会保障部】关于上班时长变化通知.docx";
            response.setContentType("application/octet-stream");
            response.setHeader("Content-disposition","attachment;filename="
                    + URLEncoder.encode(fileName, "UTF-8"));
            Writer outFile = new BufferedWriter(
                    new OutputStreamWriter(response.getOutputStream(), "utf-8"),10240);
            ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
            // 设置对应的模板路径
            resolver.setPrefix("/templates/");
            resolver.setSuffix(".xml");
            engine.setTemplateResolver(resolver);
            engine.process("word_thymeleaf_template", context, outFile);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("文件生成失败");
        }
    }
  • 申生成结果如下:Java预览下载word文档(poi-tl、thymeleaf模板)_第4张图片

你可能感兴趣的:(java,vue,文件下载,word,java,vue.js)