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>
<dependency>
<groupId>com.deepoovegroupId>
<artifactId>poi-tlartifactId>
<version>1.12.1version>
dependency>
@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("文件生成失败");
}
}
*方法二:使用模板引擎(thymeleaf、freemarker等)这里我使用的是thymeleaf 其实大致原理差不多 只是语法上的差别 相对于上边的poi-tl的模板制作过程这个要麻烦一些 *
<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("文件生成失败");
}
}