Excel文件的读写

本文介绍了使用Java中的XSSF解析Excel文件,包括读操作如加载和创建工作簿,写操作如创建行和单元格。接着讨论了处理超大Excel文件的方法,如使用SXSSFWorkbook以降低内存占用,以及引入EasyExcel进行高效的数据读写操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

01- 概述

   在应用程序的开发过程中,经常需要使用Excel文件来进行数据的导入或到出。所以,在通过java语言实现此类需求的时候,往往面临着Excel文件的解析(导入)或生成(导出)。
    而Excel文件有大有小,在处理Excel文件时,我们有不同的处理方法。

02-XSSF解析Excel文件

    Apache POI 提供给Java程序对Microsoft Office格式档案进行读写功能的API开源类库。XSSF就是其中的一种。
    **一、添加Jar包依赖**

在这里插入图片描述
Workbook接口代表一个Excel文件,用于加载和创建Excel文件。常用的实现类是XSSFWorkbook。

读操作

创建Excel文件

//解析一个excel对象
		
		//通过输入流,读取excel文件
		FileInputStream in = new FileInputStream("E:\\QQ\\2646121219\\FileRecv\\16.xlsx");
		
		//将输入流传入Workbook
		Workbook workbook = new XSSFWorkbook(in);

获取工作簿数量

//sheet:工作簿
		//获取工作部数量
		int sheetNumber = workbook.getNumberOfSheets();
		System.out.println("工作簿数量"+sheetNumber);

按照名称获取工作簿

//按照名称获取工作簿
		Sheet sheet0 = workbook.getSheet("Sheet0");
		Sheet sheet1 = workbook.getSheetAt(1);
		System.out.println("工作簿1中的数据行"+sheet0.getLastRowNum());
		System.out.println("工作簿2中的数据行"+sheet1.getLastRowNum());
	

写操作
创建工作簿

Sheet sheet0 = workbook.createSheet("2022");
			Sheet sheet1 = workbook.createSheet("2021");
			Sheet sheet2 = workbook.createSheet("2020");

创建行

Row row = sheet0.createRow(0);

创建单元格

Cell cell0 = row.createCell(1);

往单元格里添加值

cell0.setCellValue(UUID.randomUUID().toString());
			Cell cell1 = row.createCell(2);
			cell1.setCellValue(LocalDateTime.now());
			Cell cell2 = row.createCell(3);
			cell2.setCellValue(Math.random()*10);

03-超大Excel文件的读写

使用POI写入
使用SXSSFWorkbook进行写入,通过设置SXXFWorkbook的构造参数,可以设置每次在内存中保持的行数,当达到这个值的时候,那么会把这些数据flush到磁盘上,这样就会出现内存不够的情况。

try (Workbook workbook = new SXSSFWorkbook(100);
				FileOutputStream fos = new FileOutputStream("c:\\test\\temp.xlsx")) {
    Sheet sheet1 = workbook.createSheet();

    for (int i = 0; i <= 1000000; i++) {
        Row row = sheet1.createRow(i);
        Cell cell0 = row.createCell(0);
        cell0.setCellValue(UUID.randomUUID().toString());

        Cell cell1 = row.createCell(1);
        cell1.setCellValue(new Date());
    }

    workbook.write(fos);
} catch (IOException e) {
    e.printStackTrace();
}

使用EasyExcel

1.下载相关alibaba easyexcel相关的jar包。

写入数据

public class Demo {
	public static void main(String[] args) {
        // 写入100w
        EasyExcel.write("c:\\test\\run\\easy.xlsx", Order.class)
                 .sheet("订单列表")
                 .doWrite(data());
    }
    
    // 创建100w条订单数据
    private static List<Order> data() {
        List<Order> list = new ArrayList<Order>();
        for (int i = 0; i < 1000000; i++) {
            list.add(new Order());
        }
        return list;
    }
}

读取数据
EasyExcel.read(“c:\test\run\easy.xlsx”, Order.class,new AnalysisEventListener() {
@Override
public void invoke(Order order, AnalysisContext arg1) {
// 读取每条数据
orderList.add(order);
}

@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
    // 读取到列头
    System.out.println(headMap);
}

@Override
public void doAfterAllAnalysed(AnalysisContext arg0) {
    // 读取完毕
    System.out.println("END");
}

}).sheet().doRead();

总结

在解析一般文件时用到的是poi解析,而解析超大Excel文件时用到的就是EasyExcel解析。

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值