【实战】excel分页写入导出大文件

类

java 复制代码
 @RequestMapping("export")
    @ResponseBody
    public void export(HttpServletResponse response) {
        long start = System.currentTimeMillis();
        QueryVo query = new QueryVo();

        // response响应头
        setResponseHeader(response, "excel");
        ExcelWriter writer = ExcelUtil.genExcelWriter(response);
        // 表格
        WriteTable table = new WriteTable();
        WriteSheet sheet = new WriteSheet();
        sheet.setSheetNo(1);
        sheet.setSheetName("excel");
        writer.write(Lists.newArrayList(),sheet,table);

        int pageNo=1;
        query.setPageSize(exportPageSize);
        int index = 0;

        while (true) {
            // 构造分页信息
            int offset = exportPageSize * (pageNo++ - 1);
            query.setOffset(offset);
            // 查询一页数据
            List<Pharmacist> list = mybatisDao.getList(query);
            if (CollectionUtils.isEmpty(list)) {
                break;
            }
            // 分批写入
            writer.write(list,sheet);
        }
        long end = System.currentTimeMillis();
        log.info("导出excel耗时:{}", end - start);
        writer.finish();

    }

工具类

java 复制代码
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.example.demo.utils.BizException;
import com.example.demo.utils.JsonUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;

/**
 * @Description: excel工具
 */
@Slf4j
public class ExcelUtil {

    /**
     * 读取excel并处理数据
     * @param inputStream
     * @param dataInfo  function中处理的数据文件格式为 List<List<String>>
     */
    public static void readExcel(InputStream inputStream,ExcelDataInfo dataInfo){
        log.info("------读取excel文件开始-------");
        ExcelDataListener headerListener = new ExcelDataListener(dataInfo);
        EasyExcel.read(inputStream, null,headerListener).sheet().headRowNumber(1).doRead();
        log.info("------读取excel文件结束-----\n------表头------\n" + JsonUtil.toJson(headerListener.getHeader()));

    }

    /**
     * 读取excel并处理数据
     * @param inputStream
     * @param dataInfo  function中处理的数据文件格式为 List<List<String>>
     */
    public static void readExcel(InputStream inputStream,ExcelDataInfo dataInfo, int headerRow){
        log.info("------读取excel文件开始-------");
        ExcelDataListener headerListener = new ExcelDataListener(dataInfo);
        EasyExcel.read(inputStream, null,headerListener).sheet().headRowNumber(headerRow).doRead();
        log.info("------读取excel文件结束-----\n------表头------\n" + JsonUtil.toJson(headerListener.getHeader()));
    }

    /**
     * 生成writer
     * @param response
     * @return
     */
    public static ExcelWriter genExcelWriter(HttpServletResponse response){
        WriteCellStyle wcs = new WriteCellStyle();
        // 垂直居中、 左对齐
        wcs.setVerticalAlignment(VerticalAlignment.CENTER);
        wcs.setHorizontalAlignment(HorizontalAlignment.LEFT);
        WriteFont wf = new WriteFont();
        wf.setFontHeightInPoints((short)12);
        wcs.setWriteFont(wf);
        // 表头
        WriteCellStyle hwcs = new WriteCellStyle();
        hwcs.setVerticalAlignment(VerticalAlignment.CENTER);
        hwcs.setHorizontalAlignment(HorizontalAlignment.CENTER);
        WriteFont hwf = new WriteFont();
        hwf.setFontHeightInPoints((short)12);
        hwf.setBold(Boolean.TRUE);
        hwcs.setWriteFont(hwf);

        try {
            ExcelWriter writer = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new HorizontalCellStyleStrategy(hwcs,wcs)).build();
            return writer;
        } catch (Exception e) {
            log.error("导出excel失败",e);
            throw new BizException("导出excel失败", e);
        }
    }

    /**
     * 设置导出response响应头
     * @param response
     * @param fileName
     */
    public static void setResponseHeader(HttpServletResponse response,String fileName){

        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Disposition","attachment;filename="+fileName);
        response.setHeader("Param","no-cache");
        response.setHeader("Cache-Control","no-cache");
    }
}
相关推荐
_Evan_Yao6 小时前
Redis 缓存穿透、击穿、雪崩,一次讲清!
java·spring·mybatis
梓豪csd6 小时前
消息订阅中心:谁该收到哪条通知
java·开发语言·人工智能·低代码·自动化·1024程序员节
秋饼6 小时前
Spring AI 2.1 Message Parts 深度实战:推理签名回放与跨轮记忆持久化的源码级落地
java·ai·技术分享·后端开发
thefool1122667 小时前
TCP 1
java·1024程序员节
金銀銅鐵10 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
AI人工智能+电脑小能手10 小时前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务
paopaokaka_luck11 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
2301_322414280412 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis
考虑考虑13 小时前
JDK26的JEP 500属性
java·后端·java ee
LMT流氓兔13 小时前
第五单元——第十二课:把脚本整理成项目
java·数据库·python·langchain·1024程序员节