SpringBoot+POI报表批量导出

由于servletResponse 获取的输出流对象在一次请求中只能输出一次,所以要想实现批量导出报表,需要将excel文件打包成zip格式然后输出。

好了,废话不多说,上代码。

1. 首先,需要导入引用的包。pom文件如下所示(点击“+”号展开)

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.alan.demo</groupId>
    <artifactId>office2007-export</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <!-- Web 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 测试依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.15</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.15</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.ant/ant -->
        <dependency>
            <groupId>org.apache.ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.8.2</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <!-- Spring Boot Maven 插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <name>Spring Snapshots</name>
            <url>https://repo.spring.io/libs-snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

2. Controller 实现

package com.alan.demo.controller;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.tools.zip.ZipOutputStream;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.alan.demo.util.FileUtil;

/**
 * export batch Excel files.
 *
 * */
@RestController
public class DataExportController {
    private static final String BASE_PATH = System.getProperty("java.io.tmpdir") + "Resource" + File.separator;
    @RequestMapping(value = "/export",method = RequestMethod.GET)
    public void export(HttpServletRequest request,  HttpServletResponse response) {
        ZipOutputStream out = null;
        BufferedInputStream bis =  null;
        InputStream in = null;
        String tip = UUID.randomUUID().toString() + File.separator;
        try {
            createAllWorkbooks(tip);
            response.setHeader("content-type", "application/octet-stream");
            response.setContentType("application/octet-stream;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + "EXCEL2016.zip");
            File tempZip = new File(BASE_PATH + tip + "temp.zip");
            FileUtil.createZipFile(new File(BASE_PATH+ tip), new ZipOutputStream(tempZip));
            System.out.println("Created ZIP File");
            OutputStream os = response.getOutputStream();
            in = new FileInputStream(tempZip);
            bis = new BufferedInputStream(in);
            byte buff[] = new byte[1024];
            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 (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bis != null) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            FileUtil.deleteDir(BASE_PATH);
        }
    }

    /**
     * create mock data
     *
     * */
    public List<Workbook> createAllWorkbooks(String tip) {
        List<Workbook> workbooks = new ArrayList<>();
        OutputStream out = null;
        try {
            for (int i=0;i<100;i++) {
                File tempFile = new File(BASE_PATH + tip + i + ".xlsx");
                tempFile.getParentFile().mkdirs();
                tempFile.createNewFile();
                out = new FileOutputStream(tempFile);
                Workbook workbook = new XSSFWorkbook();
                workbook.createSheet("summary");
                workbook.getSheetAt(0).createRow(0);
                Row row = workbook.getSheetAt(0).getRow(0);
                Cell cell = row.createCell(0);
                cell.setCellValue("Hello Spring Boot.");
                workbooks.add(workbook);
                workbook.write(out);
                out.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (out!= null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return workbooks;
    }
}

3. FileUtil 工具类

package com.alan.demo.util;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;

public class FileUtil {
    /**
     * Compress all .xlsx Files under original path.
     *
     * */
    public static void compress(File original, ZipOutputStream out) {
        try {
            if (original == null) {
                System.err.println("Null original file is not allowed.");
            }
            if (!original.isFile()) {
                File[] files = original.listFiles();
                for (File file : files) {
                    compress(file, out);
                }
            } else if (original.isFile() && original.getName().endsWith(".xlsx")) {

                FileInputStream fis = new FileInputStream(original);
                int j = 0;
                byte[] buffer = new byte[1024];
                out.putNextEntry(new ZipEntry(original.getName()));
                while ((j = fis.read(buffer)) > 0) {
                    out.write(buffer, 0, j);
                }
                fis.close();
                out.flush();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Delete all files under path.
     *
     * */
    public static boolean deleteDir(String path){
        File file = new File(path);
        if(!file.exists()){
            System.err.println("The dir are not exists!");
            return false;
        }  

        String[] content = file.list();
        for(String name : content){
            File temp = new File(path, name);
            if(temp.isDirectory()){
                deleteDir(temp.getAbsolutePath());
                temp.delete();
            }else{
                if(!temp.delete()){
                    System.err.println("Failed to delete " + name);
                }
            }
        }
        return true;
    }  

    /**
     * Create zip file
     * @param originalFile : the directory contains all files prepared to compress.
     * @param ZipOutputStream : ZIP file out put stream
     * */
    public static void createZipFile(File originalFile, ZipOutputStream out) {

        FileUtil.compress(originalFile, out);
        if (out != null) {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * clone input stream
     *
     * */
    public static ByteArrayOutputStream cloneInputStream(InputStream in) {
        try {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while((len=in.read(buffer)) >0) {
                out.write(buffer, 0, len);
            }
            out.flush();
            return out;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
    /*public static void main(String[] args) {
        deleteDir("C:\\Users\\mh\\Desktop\\TEMP");
    }*/
}

测试结果:

原文地址:https://www.cnblogs.com/alan0521/p/9136591.html

时间: 2024-11-07 23:26:16

SpringBoot+POI报表批量导出的相关文章

设备资源管理系统-poi报表

设备资源管理系统-poi报表 POI报表的导出形式 部分代码 POI实现excel文件的导出: 1.导入使用poi的jar包. 2.添加类文件ExcelFileGenerator.java 3.修改userIndex.jsp,在Form2中添加: * <td class="ta_01" align="right"> <input style="font-size:12px; color:black; height=20;width=80&

java使用POI操作excel文件,实现批量导出,和导入

一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel. POI全称 Poor Obfuscation Implementation,直译为"可怜的模糊实现",利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能.官网:htt

lotus notes 数据库中附件的批量导出 2

Lotus Notes 数据库中附件的批量导出 Lotus Notes 数据库是一种文档型数据库,其中文档的富文本域中往往嵌入许多附件(如 Word 文档.PDF 文档.Excel 文档等).用户时常需要将这些附件导出到其他系统中进行使用处理.然而当需要导出许多文档中的附件时,只能手动逐个打开各个文档并将附件导出,然后再将附件导入到其他系统中,那么,当附件数量很大时则会大大降低效率.本文从用户角度出发,分析了若干附件批量导出的需求并给出了相应的解决方案. 引言 Notes 数据库是一种文档型数据

Powershell管理系列(二十六)PowerShell操作之批量导出&导入邮箱

-----提供AD\Exchange\Lync\Sharepoint\CRM\SC\O365等微软产品实施及外包,QQ:185426445.电话18666943750 项目中有时候做跨林邮箱迁移的时候,条件不成熟,比如安全考虑或者其他考虑,不能做双林信任,这样就提出了一个问题,历史邮件需要使用的话怎么办,一个简单高效的解决办法就是从源森林批量导出邮件为.pst文件,在批量导入到目的域森林,具体操作如下: 1.赋予管理账号邮件导入导出权限,命令如下: cls whoami New-Manageme

Azure PowerShell (14) 批量导出Azure ASM ACL和ARM NSG配置信息

<Windows Azure Platform 系列文章目录> 最近有一个客户需求,需要批量导出Azure Classic VM的ACL (Access Control List), 还有ARM VM的NSG (Network Security Group) 设置. 我花了一点时间,写了一个PowerShell脚本,发布在我的GitHub上: https://github.com/leizhang1984/AzureChinaPowerShell/blob/master/ARM/ExportA

fusioncharts批量导出图片之后自动提交表单

最近一个项目  一个页面有多个fusioncharts,需要将他们一次性导出之后再利用图片做一下操作,制作一个可以客户下载的质检简报. 对客户效果来说,我只需要点击一个按钮就能生成简报并且下载,对开发人员来说就需要,先将图片导出(当然不能挨个导出,要同时执行导出,因为fusioncharts导出太慢了),要确认全部导出了才能提交表单,要不然提交表单之后,图片没有生成出来必然产生异常.下面我们来看一下实现 首先我给每一个fusionchartschart指定一个有规律的id,作用有两个: 一个是导

怎么把百度(或高德)地图上查询的电话批量导出

怎么把百度地图上查询的电话批量导出呢? 怎么把高德地图上查询的电话批量导出呢? 这是很多做销售工作的业界精英们 迫切需要解决的问题. 因为他们需要大数据,作为他们微信销售,短信销售,电话销售的资源. 笔者经过一段时间的琢磨,经过一年多时间的反复测试,做出了导出高德地图的商家电话的软件. 界面尽量做到简洁,操作简单: 首先,选择需要采集的省份,城市: 输入需要采集的关键词,比如:汽车维修,宠物店,美容店.电动车 点击按钮[开始处理],系统将开始采集并处理采集到的商家数据,汇总成为一个EXCEL文件

分享一个批量导出当前实例下的所有linkedserver脚本

原文:分享一个批量导出当前实例下的所有linkedserver脚本 分享一个批量导出当前实例下的所有linkedserver脚本 很多时候,我们都需要导出实例下面的登录用户,job,linkedserver等等 导出job比较复杂,下午写了一个脚本把所有的linkedserver导出来,但是密码不会显示出来 下面脚本在SQL2008 R2下面测试通过 -- ============================================= -- Author: <桦仔> -- Blog

报表XML导出rtf格式,结果在浏览器中打开XML文件。用360浏览器下载rtf文件打开后出现Authentication failed 问题

报表XML导出rtf格式,结果在浏览器中打开XML文件.用360浏览器下载rtf文件打开后出现Authentication failed 问题 直接上问题图: 问题描述:在Oracle EBS中执行"资源事务处理 XML"请求,选择输出rtf格式,完成后查看输出,却在浏览器中打开了XML文件.        提示:需要检查一下是否有对应的模板文件和模板定义有效时间.        解决方案:1. 查看日志. 从中可以看出出错原因,以及模板代码.2. 添加Oracle XML Publi