下载word报表

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>
        <!--&lt;!&ndash; Poi-tl Word 模板引擎&ndash;&gt;-->
        <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();
}
 
}
 
}
 
 
}
相关推荐
天河归来9 小时前
第三方接口不稳定,如何让核心任务继续完成
java·大数据
Knight_AL10 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
砚底藏山河11 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
猿究院_夏燊12 小时前
MySQL 的四种隔离级别
java·数据库·mysql
码流子12 小时前
移动收费怎么做?手持终端+App+收费中心的架构实践
java·开发语言·架构
霸道流氓气质12 小时前
AI 流式对话与实时聊天平台:SSE 解码竞态、有状态会话隔离与背压取消的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
云创智城-yuncitys13 小时前
YunParking 4.0:JDK 17 与 Spring Boot 3.2 的停车云升级
java·开发语言·spring boot
文丑颜不良啊13 小时前
LeetCode1661~1680题目解析
java·leetcode
子非鱼@Itfuture13 小时前
关于前后端联调中登录状态/登录信息失效?
java·前端
郭小李13 小时前
openFeign入门
java·开发语言·前端