模拟业务场景:假设有一个OA系统,员工在里面填了请假申请,填好后可以通过下载自动生成一个word文档的请假条。比如数据表有姓名,请假原因,时间等字段,将这些字段填充到一个word模板中。
1. 准备word模板
注意:模板是通过 {{}} 双括号的格式来表明哪些字段是代码实现自动填充的,比如我表里面的请假原因字段名叫 reason ,那么在模板中就写 {{reason}},这样就可以识别了,其他格式暂未测试。
将模板放到项目中resources下面的template文件夹中
位置如下:
2. maven依赖(某些版本有冲突)
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.5.1</version>
</dependency>
<!-- 1.5.1版本对应poi 3.16版本-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.16</version>
</dependency>
3. 代码实现
3.1 实体类
import java.io.Serializable;
import java.util.Date;
/**
* @author YuePeng
* @date 2022/12/28 15:12
* 这里只是模拟部分字段,并非真实表结构
*/
public class LeaveForm implements Serializable {
private static final long serialVersionUID = -5652177874505967327L;
private String id;
// 请假人
private String name;
// 请假原因
private String reason;
// 请假时间
private Date leaveDate;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
public Date getLeaveDate() {
return leaveDate;
}
public void setLeaveDate(Date leaveDate) {
this.leaveDate = leaveDate;
}
}
3.2 Dao层
package com.worm.dao;
import com.worm.backup.LeaveForm;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface LeaveFormDao extends tk.mybatis.mapper.common.Mapper<LeaveForm> {
}
3.3 ServiceImpl实现类
package com.worm.service.impl;
import com.deepoove.poi.XWPFTemplate;
import com.worm.backup.LeaveForm;
import com.worm.dao.LeaveFormDao;
import com.worm.service.LeaveFormService;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;
public class LeaveFormServiceImpl implements LeaveFormService {
@Autowired
private LeaveFormDao leaveFormDao;
@Override
public byte[] downloadWord(String id) {
LeaveForm query = new LeaveForm();
query.setId(id);
//根据id查找数据
LeaveForm leaveForm = leaveFormDao.selectByPrimaryKey(query);
// 获取文件流
InputStream stream = LeaveFormServiceImpl.class.getClassLoader().getResourceAsStream("template/downloadWord.docx");
// 填充数据
Map<String, String> data = new HashMap<>();
data.put("name", leaveForm.getName());
data.put("reason", leaveForm.getReason());
data.put("date", new SimpleDateFormat("yyyy年MM月dd日").format(leaveForm.getLeaveDate()));
XWPFTemplate template = XWPFTemplate.compile(stream).render(data);
//输出流
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
return getBytes(template, outputStream);
}
private byte[] getBytes(XWPFTemplate template, ByteArrayOutputStream os) {
byte[] bytes = new byte[0];
try {
template.write(os);
bytes = os.toByteArray();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
template.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return bytes;
}
}
3.4 Service接口层
public interface LeaveFormService {
byte[] downloadWord(String id);
}
3.5 Controller层
package com.worm.controller;
import com.worm.service.LeaveFormService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.nio.charset.StandardCharsets;
@RestController
@RequestMapping("/leaveFrom")
public class LeaveFormController {
@Autowired
private LeaveFormService leaveFormService;
@RequestMapping(value = "/downloadWord", method = RequestMethod.GET)
public ResponseEntity downloadWord(
@RequestParam(required = true) String id) {
byte[] bytes = leaveFormService.downloadWord(id);
String fileName = "downloadWord.docx";
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", fileName, StandardCharsets.UTF_8);
return new ResponseEntity(bytes, headers, HttpStatus.OK);
}
}