大数据量Excel导出优化,2024大厂大数据开发面试题精选

69 阅读2分钟

img img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

用SXSSF来解决

因为SXSSFWorkbook这种方式是将数据写入临时文件,而不是保存在内存中。

import java.util.List;

public class ByteArrayOutputStreamExport {
    private List<Data> dataList;

    public ByteArrayOutputStreamExport(List<Data> dataList) {
        this.dataList = dataList;
    }

    public void exportToFile() {
        SXSSFWorkbook workbook = new SXSSFWorkbook(100); // 使用SXSSFWorkbook并保留100行数据在内存中,其余写入磁盘
        Sheet sheet = workbook.createSheet("Data");
        sheet.setRow(0);
        for (Data data : dataList) {
            sheet.createRow(sheet.getLastRowNum() + 1); // 创建新的行对象
            row.addCell(data.getName()); // 添加单元格数据
            // ... 其他填充数据的操作
        }
        workbook.write(); // 将workbook写入输出流
        workbook.close(); // 关闭workbook
    }

    public static void main(String[] args) {
        List<Data> dataList = // 获取数据列表的代码...
        ByteArrayOutputStreamExport byteArrayOutputStreamExport = new ByteArrayOutputStreamExport(dataList);
        byteArrayOutputStreamExport.exportToFile();
    }
}

基于EasyExcel和线程池解决

  • 导出excel的任务用线程池异步去执行,先给前端返回导出开始,文件生成后会通知您下载链接
@RestController
@RequestMapping("/export")
public class DataExportController {

    @Autowired
    private ExcelExportService exportService;

    @GetMapping("/data")
    public ResponseEntity<String> exportData() {
        List<DataModel> data = fetchData();
        String fileUrl = exportService.exportDataAsync(data);

        return ResponseEntity.ok("导出任务开始,文件生成后会通知您下载链接");
    }

    private List<DataModel> fetchData() {
        // 获取需要导出的数据
        // ...
    }
}

  • 线程池创建
@Configuration
@EnableAsync
public class AsyncConfig {
    @Bean(name = "exportExecutor")
    public Executor exportExecutor() {
        ThreadFactory namedThreadFactory = new ThreadFactory(new Runnable() {
            @Override
            public void run() {
                System.out.println("Thread name: " + Thread.currentThread().getName());
            }
        }, "ExportExecutor-%d");
        return new ThreadPoolExecutor(10, 20, 1L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), namedThreadFactory);
    }
}

  • 生成excel文件,上传到云存储,邮件通知用户

img img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!