1、首先自己新建一个word文档,将需要导出的文档格式事先编辑好,设置宏变量后,后续替换成对应的数据;
例如:
后面##就是宏变量需要替换对应的数据;
2、由于导出docx文档,需要使用到XWPFDocument对象,需引入依赖:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.16</version>
</dependency>
poi-ooxml 是 poi的升级版本,所以之前excel导入时引的poi依赖也可以用这个依赖替代
3、service核心代码
wordInfo方法:给controller层调用的方法
public void wordInfo(HttpServletResponse response){
//获取用户信息
UserEntity userEntity = testMapper.queryUser("1");
//生成word文档
XWPFDocument xwpfDocument = this.exportWord(userEntity);
//5、输出流
BufferedOutputStream fos = null;
try{
String fileName = "学生信息表.docx";
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment;filename=" + new String( fileName.getBytes("UTF-8"), "ISO8859-1" ));
fos = new BufferedOutputStream(response.getOutputStream());
xwpfDocument.write(fos);
fos.close();
}catch (Exception e){
log.error("新债信息模板数据转字节输出流异常!"+e);
}
}
生成word文件的方法:exportWord
private XWPFDocument exportWord(UserEntity userEntity) {
//通过文件路径获取到文件流转化为word,并将其中的宏变量替换成对应的数据
XWPFDocument xwpfDocument = null;
try {
String fileName = "file_model" + File.separator + "学生信息表.docx";
ClassPathResource classPathResource = new ClassPathResource(fileName);
InputStream is = classPathResource.getInputStream();
xwpfDocument = new XWPFDocument(is);
List<XWPFTable> tables = xwpfDocument.getTables();
for (XWPFTable table : tables) {
List<XWPFTableRow> rows = table.getRows();
for (XWPFTableRow row : rows) {
List<XWPFTableCell> cells = row.getTableCells();
for (XWPFTableCell cell : cells) {
List<XWPFParagraph> paragraphs = cell.getParagraphs();
for (XWPFParagraph paragraph : paragraphs) {
String paragraphText = paragraph.getText();
List<XWPFRun> runs = paragraph.getRuns();
Iterator<XWPFRun> xwpfRunIterator = runs.iterator();
while (xwpfRunIterator.hasNext()) {
XWPFRun xwpfRun = xwpfRunIterator.next();
xwpfRun.setText("", 0);
}
this.replaceXwpfRunsText(paragraphText, runs, userEntity);
}
}
}
}
} catch (Exception e) {
log.error("生成学生信息表异常!" + e);
}
return xwpfDocument;
}
替换word文本中的宏变量的方法:replaceXwpfRunsText
public void replaceXwpfRunsText(String xwpfParagraphText, List<XWPFRun> runs,
UserEntity entity) {
if (!StringUtils.hasText(xwpfParagraphText) || CollectionUtils.isEmpty(runs)) {
return;
}
if (xwpfParagraphText.contains("#USER_ID#")) {
String userId = entity.getUserId();
if (!StringUtils.hasText(userId)) {
userId = "";
}
xwpfParagraphText = xwpfParagraphText.replaceAll("#USER_ID#", userId);
}
if (xwpfParagraphText.contains("#NAME#")) {
String userName = entity.getUserName();
if (!StringUtils.hasText(userName)) {
userName = "";
}
xwpfParagraphText = xwpfParagraphText.replaceAll("#NAME#", userName);
}
if (xwpfParagraphText.contains("#STATUS#")) {
String userStatus = entity.getUserStatus();
if (!StringUtils.hasText(userStatus)) {
userStatus = "";
}
xwpfParagraphText = xwpfParagraphText.replaceAll("#STATUS#", userStatus);
}
runs.get(0).setText(xwpfParagraphText, 0);
}
4、运行结果:
导出的word文档效果如下: