【实战】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");
    }
}
相关推荐
遥不可及~~斌3 分钟前
基于Redis实现短信防轰炸的Java解决方案
java·数据库·redis
AronTing28 分钟前
300%性能提升!CompletableFuture异步编排四大核心模式与避坑指南
java·后端·安全
java奋斗者37 分钟前
基于Java的人脸识别在线考试系统(jsp+springboot+mysql8.x)
java·开发语言·spring boot
Moso_Rx1 小时前
JavaEE——Thread类的基本用法
java·java-ee
魔道不误砍柴功1 小时前
Jakarta EE 11发布:云原生Java企业应用的新标准
java·开发语言·云原生
bug菌1 小时前
经理突然问我为什么BigDecimal可以不丢失精度?我表示...😨
java·后端·java ee
创码小奇客1 小时前
MongoDB:数据库界的 “狂野西部牛仔”
java·mongodb·trae
Spring-wind1 小时前
【golang】为什么协程开销小于线程
java·开发语言·golang
隔壁小查2 小时前
【后端开发】Spring MVC-常见使用、Cookie、Session
java·spring·mvc
呦呦鹿鸣Rzh2 小时前
SpringMVC的请求-文件上传
java·前端·html