支持正版!这里把官网放在开头:http://deepoove.com/poi-tl/
思想:前端端写一个word类似的前端操作台,把数据存在数据库里(一般公司里的word格式都是固定的!),在用户下载文件时调用poi-tl对应把数据填到word里面。
引入maven库
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.12.1</version>
</dependency>
注意:版本号是有要求的 不配套是会报错的!
其实只引入最后一个就行了,既然做了不如一不到位把excel表格需要的jar包一起导入进来了
不需要配置类jar里自带,用起来十分方便!
只需要你创建一个word模板即可
例如:
样式在word里调整好就行,要注意一{{table}}是一个列表,下面是遍历的一个表格这里表格我隐藏了!字体的样式等格式都是可以在word里预设好的非常方便!
来看代码:
/**
* 下载 会议纪要doc
* @return
*/
@GetMapping("/export/{mettingId}")
public void exportCrew(HttpServletResponse response,@PathVariable Long mettingId) throws Exception {
// 行循环实例
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
//这里可以指定一个config类,用来指定一些规则,
Configure config = Configure.builder()
.bind("table", policy).build();
// 模板文件
XWPFTemplate template = XWPFTemplate.compile( resourceLoader.getResource("classpath:/docx/" + "mettingTemplate.docx").
getInputStream(), config);
response.setContentType("application/octet-stream");
response.setHeader("Content-disposition","attachment;filename=\""+ "mettingTemplate.docx" +"\"");
response.setHeader("filename","mettingTemplate.docx");
OutputStream out = response.getOutputStream();
YyMettingRecord yyMettingRecord = yyMettingRecordService.selectYyMettingRecordByMettingRecordId(mettingId);
MettingDocx data = new MettingDocx();
List<MettingEndDocx> mettingEndDocxs = new ArrayList<>();
//第一个参数是你的源数据,第二个参数是你要复制的目标对象
BeanUtils.copyProperties(yyMettingRecord,data);
if (StringUtils.isNotNull(yyMettingRecord.getMettingEnd())){
JSONArray mettingEnd = yyMettingRecord.getMettingEnd();
List<MettingEndInfo> busLineList = JSON.parseObject(mettingEnd.toString(),new TypeReference<List<MettingEndInfo>>(){});
for (MettingEndInfo metting: busLineList){
StringBuffer stringBuffer = new StringBuffer();
for (SysUser user : metting.getUsers()){
stringBuffer.append(user.getNickName()+" ");
}
MettingEndDocx tempMettingEnd = new MettingEndDocx();
tempMettingEnd.setTaskName(metting.getTaskName());
tempMettingEnd.setUserNames(new String(stringBuffer));
mettingEndDocxs.add(tempMettingEnd);
}
data.setTable(mettingEndDocxs);
}
if (StringUtils.isNotNull(yyMettingRecord.getMettingJoin())){
JSONArray mettingJoin = yyMettingRecord.getMettingJoin();
List<SysUser> userJoins = JSON.parseObject(mettingJoin.toString(),new TypeReference<List<SysUser>>(){});
StringBuffer stringBuffer = new StringBuffer();
for (SysUser user : userJoins){
stringBuffer.append(user.getNickName()+" ");
}
data.setMettingJoin(new String(stringBuffer));
}
SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
data.setMettingTime(sim.format(yyMettingRecord.getMettingTime()));
List<SysDictData> projectManages = dictTypeService.selectDictDataByType("project_manage");
for (SysDictData dictData : projectManages){
if (dictData.getDictValue().equals(data.getMettingType())){
data.setMettingType(dictData.getDictLabel());
}
}
template.render(data);
BufferedOutputStream bos = new BufferedOutputStream(out);
template.write(bos);
String exportFilePath = profile + "/file/upload/" + System.currentTimeMillis() + ".docx";
template.writeToFile(exportFilePath);
yyMettingRecordService.updateYyMettingRecord(yyMettingRecord);
bos.flush();
out.flush();
PoitlIOUtils.closeQuietlyMulti(template, bos, out);
}
注://这里可以指定一个config类,用来指定一些规则,
Configure config = Configure.builder()
.bind(“table”, policy).build();
这就是自带的配置类,bind绑定的列表,就是前面说的要遍历的列表!
获取模板后数据要与模板一一对应
data类
@Data
public class MettingDocx
{
/** 会议名称 */
@Excel(name = "会议名称")
private String mettingName;
/** 会议类型(00系统用户) */
@Excel(name = "会议类型", readConverterExp = "0=0系统用户")
private String mettingType;
/** 会议主题 */
private String mettingTheme;
/** 参会人员 */
@TableField(typeHandler = JsonTypeHandler.class)
private String mettingJoin;
/** 会议纪要 */
private String mettingContent;
/** 会后任务 */
@TableField(typeHandler = JsonTypeHandler.class)
private String mettingEnd;
/** 会后总结 */
private String mettingSummary;
/** 会议时间 */
private String mettingTime;
/** 任务名称 */
private String taskName;
/** 用户列表 */
private ArrayList<SysUser> users;
private List<MettingEndDocx> table;
}
名称要与word文档里定义的占位符一一对应!重要事说三遍!!!!
不过没对应出问题了 错误提醒也很清晰一下就能看得到!
再往下就是生成输出流,在网页就行下载了。