EasyExcel压缩包导出excel,动态生成多表头或多sheet

首先声明,不是通用的,是和我的业务进行结合的,但是拿去只要改一改,肯定能够用,我会详细的把参数说一遍;

方法是肯定能用的,因为我已经部署到公司的生产环境了,所以有什么问题随时在下面留言,我每天都会看csdn;

首先是主方法;
我这里list的数据,存的第一个字段是阀门的名称,所以下面在进行分类的时候是用这个分类的,即一个阀门就生成一个table或者sheet,你们拿去之后,想按那个分类,就把哪个放第一个参数就可以了

/**
     * 压缩导出
     * @param response res
     * @param headerList 头集合
     * @param list 数据集合
     * @param fileName 文件名称
     */
    public static String zipData(HttpServletResponse response, List<String> headerList, List<List<Object>> list, int type, String fileName) {
        // 用于存放文件路径
        List<String> filePaths = new ArrayList<>();
        //生成的ZIP文件名为Demo.zip
        String tmpFileName = fileName + ".zip";
        // zip文件路径
        filePaths.add(tmpFileName);
        try {
            //创建zip输出流
            ZipOutputStream out = new ZipOutputStream(new FileOutputStream(tmpFileName));
            //声明文件集合用于存放excel文件
            List<File> fileList = new ArrayList<>();
            //生成excel文件集合

            // 生成随机文件名
            fileName = fileName + ".xlsx";
            File newFile = creatFile(fileName);
            // 将文件路径保存
            fileList.add(creatFile(fileName));
            filePaths.add(fileName);


            writeExcel(newFile, headerList, list, type);

            byte[] buffer = new byte[1024];
            //将excel文件放入zip压缩包
            for (File file : fileList) {
                FileInputStream fis = new FileInputStream(file);
                out.putNextEntry(new ZipEntry(file.getName()));
                int len;
                // 读入需要下载的文件的内容,打包到zip文件
                while ((len = fis.read(buffer)) > 0) {
                    out.write(buffer, 0, len);
                }
                out.closeEntry();
                fis.close();
            }
            out.close();
            //下载zip文件
            downFile(response, tmpFileName, filePaths);
            return "";
        } catch (Exception e) {
            // 下载失败删除生成的文件
            deleteFile(filePaths);
            log.error("文件下载出错", e);
            e.printStackTrace();
            return e.getMessage();
        }
    }

主方法调用的第一个方法
就如上面说的,datalist的里面的集合第一个字段是分类标准,type等于1是多sheet,等于2是多table

 private static void writeExcel(File newFile, List<String> headerList, List<List<Object>> datalist, int type) {
        //初始化excel
        ExcelWriter excelWriter = EasyExcel.write(newFile).build();
        //获取阀门名称
        List<String> valveNameList = new ArrayList<>();
        for (List<Object> objectList : datalist) {
            valveNameList.add((String) objectList.get(0));
        }
        //去重
        List<String> collectList = valveNameList.stream().distinct().collect(Collectors.toList());
        //按阀门创建sheet
        // 创建一个表格
        if (type == 1) {
            //多sheet
            //创建表头
            List<List<String>> headList = new ArrayList<>();
            // 第 n 行 的表头
            for (String s : headerList) {
                List<String> headTitle = new ArrayList<>();
                headTitle.add(s);
                headList.add(headTitle);
            }
            WriteTable writeTable = EasyExcel.writerTable(0).head(headList).needHead(true).build();
            String ifValveName;
            for (int i = 0; i < collectList.size(); i++) {
                //创建新数据集合
                List<List<Object>> newList = new ArrayList<>();
                for (List<Object> objects : datalist) {
                    //取出阀门名称
                    ifValveName = (String) objects.get(0);
                    //获取相符合的数据
                    if (collectList.get(i).equals(ifValveName)) {
                        newList.add(objects);
                    }
                }
                WriteSheet writeSheet = EasyExcel.writerSheet(i, collectList.get(i)).build();
                excelWriter.write(newList, writeSheet, writeTable);
            }
        } else {
            //多表头
            String ifValveName;
            for (int i = 0; i < collectList.size(); i++) {
                List<List<Object>> newList = new ArrayList<>();
                for (List<Object> objects : datalist) {
                    ifValveName = (String) objects.get(0);
                    if (collectList.get(i).equals(ifValveName)) {
                        newList.add(objects);
                    }
                }
                //创建表头
                // 第 n 行 的表头
                List<List<String>> headList = new ArrayList<>();
                for (String s : headerList) {
                    List<String> headTitle = new ArrayList<>();
                    headTitle.add(s);
                    headList.add(headTitle);
                }
                WriteTable writeTable = EasyExcel.writerTable(i).head(headList).needHead(true).build();
                WriteSheet writeSheet = EasyExcel.writerSheet(0, "sheet1").build();
                excelWriter.write(newList, writeSheet, writeTable);
            }
        }

        excelWriter.finish();
    }

主方法调用的操作文件方法
这个没啥好说的

 /**
     * 文件下载
     *
     * @param response  response
     * @param str       path
     * @param filePaths 生成文件
     */
    private static void downFile(HttpServletResponse response, String str, List<String> filePaths) {
        try {
            File file = new File(str);
            if (file.exists()) {
                InputStream ins = new FileInputStream(str);
                BufferedInputStream bins = new BufferedInputStream(ins);// 放到缓冲流里面
                OutputStream outs = response.getOutputStream();// 获取文件输出IO流
                BufferedOutputStream bouts = new BufferedOutputStream(outs);
                response.setContentType("application/x-download");// 设置response内容的类型
                response.setHeader(
                        "Content-disposition",
                        "attachment;filename="
                                + URLEncoder.encode(str, "UTF-8"));// 设置头部信息
                int bytesRead;
                byte[] buffer = new byte[8192];
                // 开始向网络传输文件流
                while ((bytesRead = bins.read(buffer, 0, 8192)) != -1) {
                    bouts.write(buffer, 0, bytesRead);
                }
                bouts.flush();// 这里一定要调用flush()方法
                ins.close();
                bins.close();
                outs.close();
                bouts.close();
                deleteFile(filePaths);
            }
        } catch (IOException e) {
            deleteFile(filePaths);
            log.error("文件下载出错", e);
        }
    }

    //创建文件File对象
    private static File creatFile(String filePath) {
        return new File(filePath);
    }

    //删除文件
    public static void deleteFile(List<String> filePath) {
        for (String pathname : filePath) {
            File file = new File(pathname);
            if (file.exists()) {
                file.delete();
            }
        }
    }

2022-01-14更新:看有很多人,不知道数据怎么传,这里我把数据组装发一下

		//创建表头 只是示例,不用在乎里面的内容和导出的内容不符,因为这个示例本来就不是之前的导出,只是把组装方法放到这里
        List<String> headerList = new ArrayList<>();
        headerList.add("科目");// 第一个必须是科目 已哪个为sheet名称,就是哪个是第一个
        headerList.add("税务法人");
        headerList.add("税务会计");
        //这里得表头和你的字段一一对应 一共21个 我就不写了

        //获取数据  从数据库获取 我因为是模拟的 所以直接创建了
        List<TaxInfo> taxInfoList = new ArrayList<>();

        //创建传入参数
        List<List<Object>> list = new ArrayList<>();
        //循环list
        for (TaxInfo taxInfo : taxInfoList) {
            //创建row行list
            List<Object> rowList = new ArrayList<>();
            rowList.add(taxInfo.getTaxSubject());//这里和上面的有list对应上
            rowList.add(taxInfo.getTaxLegalPerson());
            rowList.add(taxInfo.getTaxAccountPeriod());
            //后面的也一样 和表头的顺序对应上就行了
            list.add(rowList);
        }
        writeExcel(headerList,list,1,"xxxx.xlsx");

效果展示:
压缩多sheet:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
多表头
在这里插入图片描述

                                                           感谢xuanbin.zhang提供的技术指导
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
好的,您可以使用Java中的ZipOutputStream类来实现压缩多个Excel文件。以下是一个简单的示例代码: ```java import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.metadata.Sheet; import com.alibaba.excel.metadata.Table; import com.alibaba.excel.support.ExcelTypeEnum; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream; import java.io.*; import java.util.ArrayList; import java.util.List; public class ExportExcel { public static void main(String[] args) throws IOException { // 创建多个Excel文件 List<File> fileList = createExcelFiles(); // 创建压缩包文件 File zipFile = new File("excel_files.zip"); ZipArchiveOutputStream zipOutputStream = new ZipArchiveOutputStream(zipFile); zipOutputStream.setMethod(ZipArchiveOutputStream.DEFLATED); // 将多个Excel文件压缩到压缩包中 for (File file : fileList) { ZipArchiveEntry entry = new ZipArchiveEntry(file.getName()); entry.setSize(file.length()); zipOutputStream.putArchiveEntry(entry); FileInputStream fis = new FileInputStream(file); byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) > 0) { zipOutputStream.write(buffer, 0, len); } fis.close(); zipOutputStream.closeArchiveEntry(); } // 关闭ZipOutputStream流 zipOutputStream.finish(); zipOutputStream.close(); // 删除临时Excel文件 for (File file : fileList) { file.delete(); } } private static List<File> createExcelFiles() throws FileNotFoundException { List<File> fileList = new ArrayList<>(); for (int i = 1; i <= 3; i++) { // 创建Excel文件 File file = new File("excel_" + i + ".xlsx"); OutputStream out = new FileOutputStream(file); // EasyExcel导出数据 ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX); Sheet sheet = new Sheet(1, 0); sheet.setSheetName("Sheet1"); Table table = new Table(1); List<List<String>> data = new ArrayList<>(); for (int j = 1; j <= 10; j++) { List<String> row = new ArrayList<>(); row.add("Data" + j); data.add(row); } table.setData(data); writer.write0(table, sheet); writer.finish(); // 添加Excel文件到列表中 fileList.add(file); } return fileList; } } ``` 在上面的代码中,我们首先创建了3个Excel文件,然后将它们压缩到一个名为“excel\_files.zip”的压缩包中。最后,我们删除了临时的Excel文件。注意,我们使用了Apache Commons Compress库来实现压缩操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋秋秋秋秋雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值