下载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();
}
 
}
 
}
 
 
}
相关推荐
han_hanker2 分钟前
统一拦截异常 @RestControllerAdvice
java·开发语言·数据库
忘记92617 分钟前
什么是spring boot
java·spring boot·后端
Hello World呀20 分钟前
Java实现手机号和身份证号脱敏工具类
java·开发语言
曹牧22 分钟前
Java:serialVersionUID
java·开发语言
毕设源码-钟学长44 分钟前
【开题答辩全过程】以 公寓出租系统为例,包含答辩的问题和答案
java·eclipse·echarts
Hello World呀1 小时前
Minio的替代品RustFS
java
爱笑的眼睛111 小时前
强化学习组件:超越Hello World的架构级思考与实践
java·人工智能·python·ai
悟能不能悟1 小时前
java 设置日期返回格式的几种方式
java·开发语言
爱笑的眼睛111 小时前
深入解析PyTorch nn模块:超越基础模型构建的高级技巧与实践
java·人工智能·python·ai
Smile_2542204181 小时前
解决本地 Windows 开发机无法注册到 PowerJob 服务器的问题
java·tcp/ip