EasyExcel 批量导出

这篇具有很好参考价值的文章主要介绍了EasyExcel 批量导出。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

上篇写了数据导入,本文补充一下EasyExcel 批量导出
包括常规excel和复杂excel

一、EasyExcel 导出封装

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
import com.alibaba.excel.write.handler.WriteHandler;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.google.common.base.Charsets;
import com.gsafety.bg.gsdss.common.contants.CommonConstants;
import com.gsafety.bg.gsdss.common.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicReference;

/**
 * AbstractExcelView
 */
@Slf4j
public abstract class AbstractExcelView<T> {

    private String excelName;

    private ExcelTypeEnum excelType;

    private HttpServletResponse response;

    public AbstractExcelView(HttpServletResponse response, String excelName, ExcelTypeEnum excelType) {
        this.excelName = excelName;
        this.excelType = excelType;
        this.response = response;
    }

    protected OutputStream prepareResponse(HttpServletResponse response) throws Exception {
        response.setContentType(CommonConstants.CONTENT_TYPE_EXCEL);
        response.setCharacterEncoding(Charsets.UTF_8.name());
        response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(excelName, Charsets.UTF_8.name()) + excelType.getValue());
        return response.getOutputStream();
    }

    public void exportExcel() {
        ExcelWriter excelWriter = null;
        try {
            List<Sheet<T>> sheets = this.sheets();
            if (CollectionUtils.isEmpty(sheets)) {
                return;
            }
            excelWriter = EasyExcel.write(this.prepareResponse(response)).excelType(excelType).build();
            for (Sheet s : sheets) {
                ExcelWriterSheetBuilder sb = EasyExcel.writerSheet(s.getIndex(), s.getName()).head(s.getClz());
                if (CollectionUtils.isNotEmpty(s.getHandlers())) {
                    List<WriteHandler> l = s.getHandlers();
                    l.forEach(h -> sb.registerWriteHandler(h));
                }
                if (CollectionUtils.isNotEmpty(this.sheetDynamicHead(s.getIndex()))){
                    sb.head(this.sheetDynamicHead(s.getIndex()));
                }
                excelWriter.write(this.sheetData(s.getIndex()), sb.build());
            }
        } catch (Exception e) {
            log.error(" 导出失败! ", e);
            throw new BusinessException(" 导出失败! ");
        } finally {
            if (Objects.nonNull(excelWriter)) {
                excelWriter.finish();
            }
        }
    }

    public String asyncExport(ThreadPoolTaskExecutor executor) {
        AtomicReference<String> result = new AtomicReference<>(StringUtils.EMPTY);
        ExcelWriter excelWriter = null;
        try {
            List<Sheet<T>> sheets = this.sheets();
            if (CollectionUtils.isEmpty(sheets)) {
                return result.get();
            }
            excelWriter = EasyExcel.write(this.prepareResponse(response)).excelType(excelType).build();
            WriteSheet[] writeSheets = sheets.stream().map(sheet -> {
                ExcelWriterSheetBuilder sb = EasyExcel.writerSheet(sheet.getIndex(), sheet.getName())
                        .head(sheet.getClz());
                if (CollectionUtils.isNotEmpty(sheet.getHandlers())) {
                    List<WriteHandler> l = sheet.getHandlers();
                    l.forEach(h -> sb.registerWriteHandler(h));
                }
                if (CollectionUtils.isNotEmpty(this.sheetDynamicHead(sheet.getIndex()))){
                    sb.head(this.sheetDynamicHead(sheet.getIndex()));
                }
                return sb.build();
            }).toArray(WriteSheet[]::new);
            ExcelWriter finalExcelWriter = excelWriter;
            CompletableFuture[] cfs = sheets.stream()
                    .map(sheet -> CompletableFuture.runAsync(
                            () -> {
                                log.info(" 当前sheet {} {} ", sheet.getIndex(), sheet.getName());

                                log.info(" 当前sheet {} ", writeSheets[sheet.getIndex()]);
                                finalExcelWriter.write(this.sheetData(sheet.getIndex()), writeSheets[sheet.getIndex()]);
                            }, executor)
                                    .exceptionally((e) -> {
                                                result.set(sheet.getName() + " 导出失败 ");
                                                log.error(sheet.getName() + " 导出失败 ", e);
                                                return null;
                                            }
                                    )
                    ).toArray(CompletableFuture[]::new);

            CompletableFuture.allOf(cfs).join();
        } catch (Exception e) {
            log.error(" 导出失败! ", e);
            throw new BusinessException(" 导出失败! ");
        } finally {
            if (Objects.nonNull(excelWriter)) {
                excelWriter.finish();
            }
        }
        return result.get();
    }

    protected abstract List<Sheet<T>> sheets();

    protected abstract List<T> sheetData(int sheetIndex);

    protected List<List<String>> sheetDynamicHead(int sheetIndex){
        return null;
    }

}

二、食用步骤

1.自定义excel样式

import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import org.apache.poi.ss.usermodel.*;

/**
 * @description excel样式策略类
 */

public class ExcelCustomStyleStrategy {

    public static HorizontalCellStyleStrategy getSimpleStyle(){
        // 头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 设置对齐
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        // 背景色
        headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE1.getIndex());
        // 字体策略
        WriteFont headWriteFont = new WriteFont();
        headWriteFont.setBold(false);
        headWriteFont.setFontName("微软雅黑");
        headWriteFont.setFontHeightInPoints((short) 12);
        headWriteCellStyle.setWriteFont(headWriteFont);

        // 内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
        // 背景色
        // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色。头默认了 FillPatternType所以可以不指定。
        contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
        //背景设置白色
        contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE1.getIndex());
        // 字体策略
        WriteFont contentWriteFont = new WriteFont();
        //contentWriteFont.setFontHeightInPoints((short) 12);
        contentWriteCellStyle.setWriteFont(contentWriteFont);
        //设置 自动换行
        contentWriteCellStyle.setWrapped(false);
        //设置 垂直居中
        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        //设置 水平居中
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        //设置边框样式
        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
        return horizontalCellStyleStrategy;
    }

}

2.导出数据

import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.style.column.SimpleColumnWidthStyleStrategy;
import com.google.common.collect.Lists;
import com.gsafety.bg.gsdss.common.excel.out.AbstractExcelView;
import com.gsafety.bg.gsdss.common.excel.out.Sheet;
import com.gsafety.bg.sv.controller.excel.strategy.ExcelCustomStyleStrategy;
import com.gsafety.bg.sv.model.dto.resp.AccidentEduExcelResp;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

public class AccidentEduExcelView extends AbstractExcelView<AccidentEduExcelResp> {
	//导出数据list对象 对象属性用@ExcelProperty("事故名称")即可生成表头
    private final List<AccidentEduExcelResp> data;

    public AccidentEduExcelView(HttpServletResponse response, List<AccidentEduExcelResp> data, String excelName) {
        super(response, excelName, ExcelTypeEnum.XLSX);
        this.data = data;
    }
	
	//定义excel样式、sheet名称等
    @Override
    protected List<Sheet<AccidentEduExcelResp>> sheets() {
        return Lists.newArrayList(Sheet.<AccidentEduExcelResp>builder().name("事故警示教育")
                .handlers(Lists.newArrayList(ExcelCustomStyleStrategy.getSimpleStyle(), new SimpleColumnWidthStyleStrategy(30))).clz(AccidentEduExcelResp.class).build());
    }
	
	//指定sheet页
    @Override
    protected List<AccidentEduExcelResp> sheetData(int sheetIndex) {
        return data;
    }

}

    @ApiOperation(value = "列表导出")
    @PostMapping("/v1/list/export")
    public void downLoadList(@RequestBody AccidentEduQO req, HttpServletResponse response) {
    	//查询导出数据list 对象
        List<AccidentEduExcelResp> data = service.list(req);
        new AccidentEduExcelView(response,data,"事故警示教育").exportExcel();
    }

三、复杂excel导出

3.1. 自定义复杂表头

通过重写sheetDynamicHead方法自定义复杂表头
@ExcelProperty(order = 0)注解指定excel列即可填充到指定单元格
EasyExcel 批量导出

import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.style.column.SimpleColumnWidthStyleStrategy;
import com.google.common.collect.Lists;
import com.gsafety.bg.gsdss.common.excel.out.AbstractExcelView;
import com.gsafety.bg.gsdss.common.excel.out.Sheet;
import com.gsafety.bg.sv.controller.excel.strategy.ExcelCustomStyleStrategy;
import com.gsafety.bg.sv.model.dto.resp.AccidentEduSLResp;
import com.gsafety.bg.sv.model.dto.resp.AccidentEduStatisticResp;

import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;

public class AccidentEduSExcelView extends AbstractExcelView<AccidentEduSLResp> {

    private AccidentEduStatisticResp data;

    private Integer total;

    public AccidentEduSExcelView(HttpServletResponse response, AccidentEduStatisticResp data, String excelName) {
        super(response, excelName, ExcelTypeEnum.XLSX);
        this.data = data;
        this.total = data.getTotal();
    }

    @Override
    protected List<Sheet<AccidentEduSLResp>> sheets() {
        return Lists.newArrayList(Sheet.<AccidentEduSLResp>builder().name("警示教育信息")
                .handlers(Lists.newArrayList(ExcelCustomStyleStrategy.getSimpleStyle(),new SimpleColumnWidthStyleStrategy(30))).clz(AccidentEduSLResp.class).build());
    }

    @Override
    protected List<AccidentEduSLResp> sheetData(int sheetIndex) {
        return data.getList();
    }
	
	//这里是动态表头,需要读取数据库计算数据数量做表头,所以中间走了一层,如果不是动态数据可直接返回sheetDynamicHead(Integer total)方法的内容
    @Override
    protected List<List<String>> sheetDynamicHead(int sheetIndex) {
        return sheetDynamicHead(this.total);
    }

    private List<List<String>> sheetDynamicHead(Integer total){
        List<List<String>> head = Lists.newArrayList();
        head.add(new ArrayList() {{
            add(" ");
            add(" ");
            add(" ");
        }});
        head.add(new ArrayList() {{
            add("参与执法持证人员数");
            add("参与执法持证人员数");
            add("参与执法持证人员数");
        }});
        head.add(new ArrayList() {{
            add("执法检查次数(次)");
            add("合计");
            add("合计");
        }});
        head.add(new ArrayList() {{
            add("执法检查次数(次)");
            add("检查");
            add("检查");
        }});
        head.add(new ArrayList() {{
            add("执法检查次数(次)");
            add("复查");
            add("复查");
        }});
        return head;
    }

}

2. 多sheet

protected List sheets() 方法内返回多个sheet
protected List sheetData(int sheetIndex)方法内指定sheet填充的数据

import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.style.column.SimpleColumnWidthStyleStrategy;
import com.google.common.collect.Lists;
import com.gsafety.bg.emis.base.utils.ExcelCustomStyleStrategy;
import com.gsafety.bg.emis.euip.model.resp.EuipExcelListResp;
import com.gsafety.bg.emis.fpln.model.dto.resp.UavInfoResp;
import com.gsafety.bg.gsdss.common.excel.out.AbstractExcelView;
import com.gsafety.bg.gsdss.common.excel.out.Sheet;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

public class EuipExcelView extends AbstractExcelView {
    private final List<EuipExcelListResp> euip;
    private final List<UavInfoResp> uva;
    
    public EuipExcelView(HttpServletResponse response, List<EuipExcelListResp> euip, List<UavInfoResp> uav, String excelName) {
        super(response, excelName, ExcelTypeEnum.XLSX);
        this.euip = euip;
        this.uva = uav;
    }
    
    @Override
    protected List<Sheet> sheets() {
        return Lists.newArrayList(Sheet.<EuipExcelListResp>builder().name("通讯装备信息")
                        .index(0)
                        .handlers(Lists.newArrayList(ExcelCustomStyleStrategy.getSimpleStyle(), new SimpleColumnWidthStyleStrategy(30))).clz(EuipExcelListResp.class).build(),
                Sheet.<UavInfoResp>builder().name("无人机信息").index(1)
                        .handlers(Lists.newArrayList(ExcelCustomStyleStrategy.getSimpleStyle(), new SimpleColumnWidthStyleStrategy(30))).clz(UavInfoResp.class).build());
        
    }
    
    @Override
    protected List sheetData(int sheetIndex) {
        if (0 == sheetIndex) {
            return euip;
        } else {
            return uva;
        }
    }
    
}

EasyExcel 批量导出文章来源地址https://www.toymoban.com/news/detail-485808.html

到了这里,关于EasyExcel 批量导出的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • EasyExcel导出带下拉选数据的Excel数据导入模板

    #因为项目中需要导入一些信息,但是这些信息比较不常见,且在项目字典数据中维护有这些数据,所以在导出模板的时候,把这些数据一并导出,可以减少用户的编写,避免在导入的时候因为数据错误,发生一些业务问题 直接开始 1、以岗位类型为例,展示数据的实现方式

    2024年02月03日
    浏览(50)
  • 【前端】批量导入和导出Excel数据

    excel导入功能需要使用npm包 xlsx ,所以需要安装 xlsx 插件,读取和写入都依赖她 vue-element-admin模板提供了一个导入excel数据的文件,我们只需用即可 代码地址: https://github.com/PanJiaChen/vue-element-admin/blob/master/src/components/UploadExcel/index.vue 将vue-element-admin提供的导入功能新建一个组件

    2024年02月09日
    浏览(49)
  • EasyExcel 批量导出

    上篇写了数据导入,本文补充一下EasyExcel 批量导出 包括常规excel和复杂excel 通过重写 sheetDynamicHead 方法自定义复杂表头 @ExcelProperty(order = 0) 注解指定excel列即可填充到指定单元格 protected List sheets() 方法内返回多个sheet protected List sheetData(int sheetIndex)方法内指定sheet填充的数据

    2024年02月09日
    浏览(40)
  • R语言13-R语言中的数据导入导出和批量导入

    CSV 文件: 使用 read.csv() 函数导入逗号分隔的文本文件。 Excel 文件: 使用 readxl 包中的函数 read_excel() 导入 Excel 文件。 文本文件: 使用 readLines() 函数读取文本文件的内容。 CSV 文件: 使用 write.csv() 函数将数据写入逗号分隔的文件。 Excel 文件: 使用 openxlsx 包中的函数 writ

    2024年02月11日
    浏览(34)
  • JAVA实现easyExcel批量导入

    注解 类型 描述 ExcelProperty 导入 指定当前字段对应excel中的那一列。可以根据名字或者Index去匹配。当然也可以不写,默认第一个字段就是index=0,以此类推。千万注意,要么全部不写,要么全部用index,要么全部用名字去匹配。千万别三个混着用,除非你非常了解源代码中三个

    2024年04月27日
    浏览(40)
  • EasyExcel实现execl导入导出

    在实际开发中,处理 Excel 文件是一个常见的需求。EasyExcel 是一个基于 Java 的开源库,提供了简单易用的 API,可以方便地读取和写入 Excel 文件。本文将介绍如何使用 EasyExcel 实现 Excel 导入功能,以及一些相关的技巧和注意事项。 在开始之前,我们需要准备好 EasyExcel 的环境。

    2024年02月09日
    浏览(38)
  • 使用EasyExcel实现导入和导出

    简单实现导入和导出 POM FileUtil controller Service ServiceImpl ExceptionPersonListener ExceptionPersonImportExcel

    2024年02月13日
    浏览(37)
  • EasyExcel 三分钟搞定导入导出

    前言:本文章教你从零开始,三分钟搞定excel单sheet导出、导入、多sheet导出、导入、excel模板导入单个sheet、多个sheet,废话不多说,直接上代码 1.引入依赖 2.工具类-ExcelHandler 3.工具类-ExcelTemplateEnum 4.工具类-UploadDataListener 5.实体类-ExcelVO 6.业务层-ExcelService 7.实现层-ExcelService

    2024年02月15日
    浏览(30)
  • 使用EasyExcel实现Excel的导入导出

    在真实的开发者场景中,经常会使用excel作为数据的载体,进行数据导入和导出的操作,使用excel的导入和导出有很多种解决方案,本篇记录一下EasyExcel的使用。 EasyExcel是一个开源的项目,是阿里开发的。EasyExcel可以简化Excel表格的导入和导出操作,使用起来简单快捷,易上手

    2023年04月15日
    浏览(51)
  • EasyExcel实现Excel文件导入导出功能

    Java领域解析、生成Excel比较有名的框架有Apache poi、jxl等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM或者JVM频繁的full gc。 EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称。

    2024年02月02日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包