1. 程式人生 > 其它 >Spring整合POI匯出100W excel資料(簡單、簡潔、原生POI)

Spring整合POI匯出100W excel資料(簡單、簡潔、原生POI)

技術標籤:Javapoi

excel2007格式的單sheet,最高支援1048576 條記錄 約100W+條 1024*1024=1048576

引入POI依賴,只要這個一個就OK了

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.0.0</version>
</dependency>

直接看程式碼 一個三個類 一個User類 一個匯出excel程式碼類 一個Controller,程式碼加上了引入的包名,複製下面三個類可直接在spring 專案中使用

User類:

import lombok.Data;
import java.util.Date;

/**
 * @author XXX
 * @since 2021/2/8 15:30
 * Description 使用者資訊表
 */
@Data
public class User {

    private Integer id;
    private String name;
    private Date createTime;
}

匯出excel程式碼核心程式碼類:

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.servlet.view.document.AbstractXlsxStreamingView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author XXX
 * @since 2021/2/8 15:12
 * Description 模擬匯出使用者資訊excel
 */
public class UserExcel extends AbstractXlsxStreamingView {

    @Override
    protected void buildExcelDocument(Map<String, Object> map, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception {

        // 1. 模擬100W+條使用者資訊
        List<User> list = new ArrayList<>(1048575);
        for (int i = 0; i < 1048575; i++) {
            User user = new User();
            user.setId(i);
            user.setName(UUID.randomUUID().toString());
            user.setCreateTime(new Date());
            list.add(user);
        }

        Sheet sheet = workbook.createSheet("測試sheet");
        int rowNum = 0;

        // 2. 建立excel表頭行
        Row titleRow = sheet.createRow(rowNum++);
        titleRow.createCell(0).setCellValue("編號");
        titleRow.createCell(1).setCellValue("名字");
        titleRow.createCell(2).setCellValue("建立時間");

        // 3. 填充使用者資料
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for (User excel : list) {
            Row row = sheet.createRow(rowNum++);
            row.createCell(0).setCellValue(excel.getId());
            row.createCell(1).setCellValue(excel.getName());
            row.createCell(2).setCellValue(simpleDateFormat.format(excel.getCreateTime()));
        }
    }

}

Controller類:

import com.example.spring.excel.excel.UserExcel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.view.document.AbstractXlsxStreamingView;

/**
 * @author XXX
 * @since 2021/2/8 14:47
 * Description 測試excel控制器
 */
@Slf4j
@RestController
public class TestExcelController {

    @GetMapping(value = "/exportExcel")
    public AbstractXlsxStreamingView exportExcel() {
        return new UserExcel();
    }

}

是不是很簡單?

這裡只是模擬了最簡單的匯出100W條資料,耗時大概4-5秒左右。匯出的資料大概40M