下载word报表

ops/2025/1/7 15:13:13/

1.引入依赖

        <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.示例代码

//动态表格策略类
public class ItemTablePolicy extends DynamicTableRenderPolicy {@Overridepublic 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();
}}}}


http://www.ppmy.cn/ops/147825.html

相关文章

jmeter分布式启动

https://www.cnblogs.com/qtclm/p/11082081.html 1、代理机&#xff1a;输入“ipconfig”&#xff0c;找到IP地址&#xff0c;在Jmeter/bin/jmeter.properties设置remote host 启动jmeter server 1、控制机&#xff1a;输入“ipconfig”&#xff0c;找到IP地址&#xff0c;在J…

List-顺序表--1

目录 1、List介绍 2、线性表 3、顺序表 4、实现自己的顺序表 4.1、display方法 4.2、add方法 4.3、contains方法 4.4、indexOf方法 4.5、get方法 4.6、set方法 4.7、remove方法 4.8、size方法 4.9、clear方法 1、List介绍 List是一个接口&#xff0c;继承自Collec…

HTTP vs HTTPS

HTTP 协议 HTTP 协议介绍 HTTP 协议&#xff0c;全称超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff09;。顾名思义&#xff0c;HTTP 协议就是用来规范超文本的传输&#xff0c;超文本&#xff0c;也就是网络上的包括文本在内的各式各样的消息&#xff0c;具…

【数据分析实战】24年T4某二手车交易平台数据分析

文章目录 引言数据概述与处理数据特征介绍数据预处理 数据分析1. 价格与折旧率分析折旧率分析计算折旧率 可视化 2. 品牌构成分析品牌分布可视化 3. 地域分布与市场分析城市交易分布可视化 4. 车龄对价格的影响车龄与价格的关系可视化 主要发现写在最后 引言 二手车市场近年来…

实时记录和查看Apache 日志

Apache 是一个开源的、广泛使用的、跨平台的 Web 服务器&#xff0c;保护 Apache Web 服务器平台在很大程度上取决于监控其上发生的活动和事件&#xff0c;监视 Apache Web 服务器的最佳方法之一是收集和分析其访问日志文件。 Apache 访问日志提供了有关用户如何与您的网站交互…

[读书日志]8051软核处理器设计实战(基于FPGA)第三篇:8051 keil编程配置 C语言开发流程 中断程序实例

第一篇https://blog.csdn.net/m0_74021449/article/details/144796689 第二篇https://blog.csdn.net/m0_74021449/article/details/144813103 3.8051中断与keil开发流程 3.1 keil的下载与概述 关于keil&#xff0c;大家都并不陌生&#xff0c;它是开发51单片机和ARM架构的32…

enzymejest TDD与BDD开发实战

一、前端自动化测试需要测什么 1. 函数的执行逻辑&#xff0c;对于给定的输入&#xff0c;输出是否符合预期。 2. 用户行为的响应逻辑。 - 对于单元测试而言&#xff0c;测试粒度较细&#xff0c;需要测试内部状态的变更与相应函数是否成功被调用。 - 对于集成测试而言&a…

大数据-266 实时数仓 - Canal 对接 Kafka 客户端测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; MyBatis 更新完毕目前开始更新 Spring&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; H…