下载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();
}
 
}
 
}
 
 
}
相关推荐
水宝的滚动歌词4 小时前
设计模式之建造者模式
java·设计模式·建造者模式
孤蓬&听雨4 小时前
Java SpringBoot使用Apache POI导入导出Excel文件
java·spring boot·apache·excel导出·excel导入
紫琪软件工作室5 小时前
自定义有序Map
java
刘婉晴5 小时前
【蓝桥杯研究生组】第14届Java试题答案整理
java·蓝桥杯
Upuping6 小时前
「全网最细 + 实战源码案例」设计模式——外观模式
java·后端·设计模式
等一场春雨6 小时前
Java 21 使用新的日期和时间 API (java.time) 计算当前日期是某活动起始时间的第几天
java·开发语言
南宫生7 小时前
力扣-数据结构-12【算法学习day.83】
java·数据结构·学习·算法·leetcode
KeyPan7 小时前
【数据结构与算法:五、树和二叉树】
java·开发语言·数据结构·人工智能·算法·机器学习·计算机视觉
工业甲酰苯胺7 小时前
Java Web学生自习管理系统
java·开发语言·前端
晚上睡不着!7 小时前
Java程序命令行调用Python矩阵算法
java·开发语言·python·numpy