aliEasyexcel 导出表格,无表头,动态表头导出,导出多个sheet表头

本文介绍了如何利用aliEasyexcel库在Java环境中导出Excel表格,包括无表头和动态表头的设置,以及如何从数据库查询数据并导出到多个sheet。通过提供的工具类,可以方便地实现数据导出功能。
     最近在做数据的导出 ,有的导出是一个对象 有的是无对象 ,并且有的是动态的表头

在这我使用的eaxyexcle 最新版

依赖

		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.1</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.poi</groupId>
                    <artifactId>poi</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.poi</groupId>
                    <artifactId>poi-ooxml</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.poi</groupId>
                    <artifactId>poi-ooxml-schemas</artifactId>
                </exclusion>
            </exclusions>
       	<dependency>     
		<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>

导出表格数据

工具类
/**
 * @Title: SheetDTO
 * @Description:  这里是为了接受不同的实体对象,直接循环集合写入
 * @Date: 2023/4/13 15:17
 */
@Data
public class SheetDTO {

    /**
     * 类型 区分有没有表头 1对象 2无表头 3定义表头
     */
    private Integer type;
    /**
     * sheet页面
     */
    private Integer index;
    /***
     * sheet名字
     */
    private String fileName;
    /**
     * 类型
     */
    private Class<? extends Object> classType;
    /**
     * 数据
     */
    private List<? extends Object> dataList;

}

package com.jianfan.module.edc.util;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.jianfan.module.edc.excel.conver.CustomSheetWriteHandler;
import com.jianfan.module.edc.vo.statistic.dto.SheetDTO;
import com.jianfan.module.edc.vo.statistic.excleVo.DatabaseVisitTableExportVO;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

import java.net.URLEncoder;
import java.util.List;



public class EasyExcelUtils {


    /**
     * 单个表格数据导出
     * @param response
     * @param sheetFileName sheet名
     * @param classVo 表格实体对象
     * @param dataList 表格数据
     * @throws IOException
     */
    public  static void responseExcel(HttpServletResponse response, String sheetFileName, Integer no,Class<? extends Object> classVo,
                                      List<? extends Object> dataList)
            throws IOException {
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 防止中文乱码
        String fileName = URLEncoder.encode(sheetFileName, "UTF-8")
                .replaceAll("\\+","%20");
        response.setHeader("Content-disposition", "attachment;filename*=UTF-8''" + fileName + ExcelTypeEnum.XLSX.getValue());
        //响应的输入流
        ServletOutputStream outputStream = response.getOutputStream();
        // workbook
        ExcelWriterBuilder writeWorkBook = EasyExcel.write(outputStream, classVo).head(classVo)
                .useDefaultStyle(false)
                .registerWriteHandler(new CustomSheetWriteHandler());
        // sheet
        writeWorkBook.sheet().sheetName(sheetFileName).sheetNo(no).doWrite(dataList);
    }

    /**
     * 多个sheet导出
     * @param response
     * @param fileName 表格名称
     * @param dataList 表格数据
     * @throws IOException
     */
    public  static void responseBatchExcel(HttpServletResponse response,String fileName,
                                           List<SheetDTO> dataList)
            throws IOException {
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 防止中文乱码
        String newFileName = URLEncoder.encode(fileName, "UTF-8")
                .replaceAll("\\+","%20");
        response.setHeader("Content-disposition", "attachment;filename*=UTF-8''" + newFileName + ExcelTypeEnum.XLSX.getValue());
        //响应的输入流
        ServletOutputStream outputStream = response.getOutputStream();
        // workbook 共用一个ExcelWriter对象
        ExcelWriter writeWorkBook = EasyExcel.write(outputStream)
                .useDefaultStyle(false)
                .registerWriteHandler(new CustomSheetWriteHandler()).build();
        WriteSheet writeSheet=null;
        for(SheetDTO dto:dataList){
             writeSheet=new WriteSheet();
             if(dto.getType().equals("1")){ // 这里是为了判断 集合的对象类型 判断是都是对象
                 EasyExcel.writerSheet(dto.getIndex(), dto.getFileName()).head(dto.getClassType()) // 指定表头对象
                 .build();
             }else if(dto.getType().equals("2")){
                 writeSheet = EasyExcel.writerSheet(dto.getIndex(), dto.getFileName()).needHead(false) // 不需要表头
                 .build();
             }

            writeWorkBook.write(dto.getDataList(),writeSheet);
        }
//			如果不用sheetDto对象 就使用这样访视 手动指定
//        WriteSheet writeSheet = EasyExcel.writerSheet(0, "sheet1").needHead(false).build();
//        WriteSheet writeSheet2 = EasyExcel.writerSheet(1, "sheet2").needHead(false).build();
//        writeWorkBook.write(dataList.get(0).getDataList(),writeSheet);
//        writeWorkBook.write(dataList.get(1).getDataList(),writeSheet2);
        writeWorkBook.finish();
        outputStream.close();
    }
	/**
     *  单个无表头导出
     * @param response
     * @param fileName sheet名
     * @param classDto 导出对象 
     * @param dataList 数据集合
     * @throws IOException
     */
    public  static void responseNoNeedHeadExcel(HttpServletResponse response,String fileName,
                                           Class<? extends Object> classDto,List< ? extends Object> dataList)
            throws IOException {
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 防止中文乱码
        String newFileName = URLEncoder.encode(fileName, "UTF-8")
                .replaceAll("\\+","%20");
        response.setHeader("Content-disposition", "attachment;filename*=UTF-8''" + newFileName + ExcelTypeEnum.XLSX.getValue());
        //响应的输入流
        ServletOutputStream outputStream = response.getOutputStream();
        // workbook
        ExcelWriter writeWorkBook = EasyExcel.write(outputStream)
                .useDefaultStyle(false)
                .registerWriteHandler(new CustomSheetWriteHandler()).build();
        WriteSheet writeSheet = EasyExcel.writerSheet(0, fileName).needHead(false).build();
        writeWorkBook.write(dataList,writeSheet);

        writeWorkBook.finish();
        outputStream.close();
    }
	 /**
     * 上传文件服务器
     * @param fileName
     * @param dataList
     * @throws IOException
     */
    public  static String uploadResponseBatchExcel(String fileName,
                                           List<SheetDTO> dataList)
            throws IOException {

        //响应的输入流
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        String filePath=null;
        // workbook
        ExcelWriter writeWorkBook = EasyExcel.write(stream)
                .useDefaultStyle(false)
                .registerWriteHandler(new CustomSheetWriteHandler()).build();
        WriteSheet writeSheet=null;
        for(SheetDTO dto:dataList){
            writeSheet=new WriteSheet();
            if(dto.getType().equals(NumYESNoEnums.ONE.getNum())){
                writeSheet = EasyExcel.writerSheet(dto.getIndex(), dto.getFileName()).head(dto.getClassType()).build();
            }else if(dto.getType().equals(NumYESNoEnums.TWO.getNum())){
                writeSheet = EasyExcel.writerSheet(dto.getIndex(), dto.getFileName()).needHead(false).build();
            }
            writeWorkBook.write(dto.getDataList(),writeSheet);
        }
        writeWorkBook.finish();
        FileApi fileApi = SpringUtil.getBean(FileApi.class);//文件服务器接口
        String newFileName=fileName+System.currentTimeMillis()+ExcelTypeEnum.XLSX.getValue();
        String path="file/excel/"+newFileName;
         filePath = fileApi.createFile(newFileName, path, stream.toByteArray());
        stream.close();
        return filePath;
    }


}

测试

导出单个和多个数据从数据库中查询出来,使用工具即可
测试无表头
  String projectCode = edcProject.getProjectCode();
        String projectName = edcProject.getProjectName();
        List<List<String>> dataList=new ArrayList<>();
        List<String> data=new ArrayList<>();
        data.add("项目代码");data.add(projectCode);
        dataList.add(data);
        List<String> data2=new ArrayList<>();
        data2.add("项目名称");data2.add(projectName);
        dataList.add(data2);
        List<String> data3=new ArrayList<>();
        data3.add("版本名称");data3.add(projectCode);
        dataList.add(data3);
        List<String> data4=new ArrayList<>();
        data4.add("导出人");data4.add("测试");
        dataList.add(data4);
        List<String> data5=new ArrayList<>();
        data5.add("导出时间");data5.add(DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
        dataList.add(data5);
        EasyExcelUtils.responseNoNeedHeadExcel(response,"数据库版本信息",List.class,dataList);

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值