下载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();
}
 
}
 
}
 
 
}
相关推荐
间彧3 分钟前
Java中T类型详解与实际使用
java
凯子坚持 c6 分钟前
C++ 连接 Redis:redis-plus-plus 安装与使用入门指南
java·c++·redis
没有bug.的程序员12 分钟前
Redis vs Memcached vs MongoDB:深入对比与选型指南
java·redis·mongodb·memcached
半桔13 分钟前
【Linux手册】管道通信:从内核底层原理到使用方法
java·linux·服务器·网络·c++
BeyondCode程序员15 分钟前
苹果内购 V1 与 V2 支付流程对比(附示例java代码)
java·后端
叫我阿柒啊16 分钟前
从全栈工程师视角解析Java与前端技术在电商场景中的应用
java· 消息队列· spring boot· 微服务· vue3· 安全· 前端框架
华仔啊16 分钟前
Redis 不只是缓存!Java 打工人必知的 10 个真实工作场景,第 5 个太香了
java·后端
|CXHAO|32 分钟前
使用tomcat本地部署draw.io
java·tomcat·draw.io
祈祷苍天赐我java之术41 分钟前
Maven 从入门到精通
java·maven
没有bug.的程序员43 分钟前
Redis 内存管理机制:深度解析与性能优化实践
java·数据库·redis·性能优化·内存管理机制