1.引入依赖
XML
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.5</version>
</dependency>
<!--<!– Poi-tl Word 模板引擎–>-->
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.12.2</version>
</dependency>
2.示例代码
XML
//动态表格策略类
public class ItemTablePolicy extends DynamicTableRenderPolicy {
@Override
public void render(XWPFTable table, Object data) throws Exception {
if(data == null){
return;
}
Item item = JSON.parseObject(JSON.toJSONString(data),new TypeReference<>(){});
List<Subject> subjects = item.getSubject();
int startRow = 1;
for(Subject subject : subjects ){
XWPFTableRos insertNewTableRow = table.insertNewTableRow(startRow);
for(int j = 0; j < 5; j++) insertNewTableRow.createCell();
TableRenderPolicy.Helper.renderRow(table.getRow(startRow),Rows.of(
Texts.of(subject.getSubjectId()).create(),
Texts.of(subject.getName()).create(),
Texts.of(subject.getSource()).create(),
Texts.of(subject.getTeacherId()).create(),
Texts.of(subject.getTeacherName()).create()).create());
startRow++;
}
}
}
public void download(String id,HttpServletResponse) throws Exception{
Item item = itemService.getItemById(id);
if(null == item){
throw new RuntimeException("该报告不存在!");
}
Map<String, Object> data = getDocData(item);
Configure configure = Configure.builder().bind("table",new ItemTablePolicy()).build();
File docxFile = new File(String.format("%s%s%s",Server.HOME_PATH, File.separator, "ItemReport.docx"));
//输出流生成导出的文件
String fileName = String.format("%s_%s_年度报告.docx",record.getName(),DateUtil.today());
File file = new File(fileName);
try{
if(!docxFile.exists()){
Resource resource = new ClassPathResource("/template/item.docx");
org.apache.commons.io.FileUtils.copyToFile(resource.getInputStream(),file);
}
XWPFTemplate.compile(docxFile.exists() ? docxFile : file, configure).render(data).writeToFile(file.getAbsolutePath());
//把文件写到response的输出流中 最后再删除两个中间文件
response.reset();
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document; charset=utf-8");
response.setHeader("Content-Length",String.valueOf(file.length()));
response.setHeader("Content-Disposition", String.format("attachment; filename=%s",URLEncoder.encode(fileName, StandardCharsets.UTF_8.displayName())));
exportFile(response, new FileInputStream(file));
}finally{
file.delete();
}
}
public Map<String, Object> getDocData(Item record){
Map<String,Object> data = new HashMap<>();
data.put("title",Texts.of(String.format("%s年度报告",record.getName())).create());
data.put("studentName",Texts.of(item.getName()).create());
data.put("startTime",Texts.of(DateUtil.format(DateUtil.date(record.getStartTime()),"yyyy-MM-dd HH:mm:ss")).create());
data.put("endTime",Texts.of(DateUtil.format(DateUtil.date(record.getEndTime()),"yyyy-MM-dd HH:mm:ss")).create());
data.pue("totalNumber",Texts.of(record.getTotalNumber()).create());
ChartSingleSeriesRenderData pie = Charts
.ofSingleSeries("及格情况",new String[]{"及格数量","不及格数量"})
.series("countries",new Integer[]{ record.getTotal() - record.getAbnormal(), record.getAbnormal()})
.create();
data.put("pieChart",pie);
return data;
}
public static void exportFile(HttpServletResponse response, InputStream is){
byte[] buff = new byte[1024];
BufferedInputStream bis = null;
OutputStream os = null;
try{
os = response.getOutputStream();
bis = new BufferedInputStream(is);
int i = bis.read(buff);
while(i!=-1){
os.write(buff, 0, buff.length);
os.flush();
i = bis.read(buff);
}
}catch (IOException e){
e.printStackTrace();
}finally {
if(null != bis){
try{
bis.close();
}catch (IOException e){
e.printStackTrace();
}
}
if( os != null){
try{
os.close();
}catch (IOException e ){
e.printStackTrace();
}
}
}
}