解析Excel文件

目录

一、简单引入

二、Apache POI

      下面先重点介绍XSSF解析Excel文件的方法:

   XSSF生成Excel文件的方法: 

三、Alibaba EasyExcel

四、超大Excel文件读写

五、使用XSSFWorkbook、SXSSFWorkbook、EasyExcel进行Excel文件写入对比


一、简单引入

       在我们日常应用程序的开发过程中,经常会使用Excel文件来进行数据的导入或导出,因此用Java语言实现此类需求就会面临着Excel文件的解析(导入)或生成(导出)。在Java技术生态圈中,当今比较流行的处理Excel的技术有 Apache POI和Alibaba EasyExcel等。

二、Apache POI

       首先它是基于DOM方式进行解析,将文件直接加载内存,因此速度较快,适合Excel文件数据量不大的应用场景。它提供给Java程序对Microsoft Office格式进行读写功能的API开源类库,使用比较频繁的主要是HSSF和XSSF解析Excel文件,说一点,HSSF主要针对解析.xls的Excel文件,而XSSF主要解析.xlsx的Excel文件。

      下面先重点介绍XSSF解析Excel文件的方法:

      1.加载解析Excel文件

// 输入流
FileInputStream fis = new FileInputStream("c:\\test\\1627356554991.xlsx");

// Excel文件对象
Workbook workbook = new XSSFWorkbook(fis);

     2.获取工作簿数量 

int sheetNumber = workbook.getNumberOfSheets();

System.out.println("工作簿数量" + sheetNumber);

     3.按照名称获取工作簿

//按照表名获取工作簿
Sheet sheet0 = workbook.getSheet("Sheet0"); 

//按照表的下标获取工作簿
Sheet sheet1 = workbook.getSheetAt(1);

    4. 获取并遍历工作簿中的所有行

//获取工作簿中的所有行
Row row = sheet.getRow(i);


//遍历工作簿中的所有行
//方法1
for(Row row : sheet) {
 
}

//方法2
for(int i = 0;i <= sheet.getLastRowNum();i++) {

}

    5.获取行里面的单元格并获取相应单元格的值

Cell cell = row.getCell(0)

//单元格值类型为STRING
cell.getStringCellValue()

//单元格值类型为NUMERIC
cell.getNumericCellValue()

    6.遍历单元格

for(Cell cell : row) {
				
}

   XSSF生成Excel文件的方法: 

   1.创建Workbook对象,传入数据流

Workbook workbook = new XSSFWorkbook();
FileOutputStream out = new FileOutputStream("c:\\test\\test.xlsx")

    2. 创建Sheet

//创建sheet0,并命名为01
Sheet sheet0 = workbook.createSheet("01");

    3. 创建数据行

Row row = sheet0.createRow(0);

    4.创建单元格

//创建单元格并传入值
Cell cell = row.createCell(0);
cell.setCellValue();

    5.将Workbook对象中包含的数据,通过输出流,写入至Excel 

workbook.write(out);

三、Alibaba EasyExcel

       它是采用逐行读取的解析模式,将每一行的解析结果以观察者的模式通知处理,比较适合数据体量较大的Excel文件解析,下面介绍的超大Excel文件读写实现方式就是使用EasyExcel的。

四、超大Excel文件读写

       1.写操作

EasyExcel.write("c:\\test\\easy.xlsx", Order.class)
         .sheet("订单列表")
         .doWrite(data());

       2.读操作

//用于保存读取到的结果
List<Order> orderList = new ArrayList<Order>();
		
//读取
EasyExcel.read("E:\\yuanjiuyuan\\easy.xlsx", Order.class,new AnalysisEventListener<Order>() {
    @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();
		
//遍历
for(Order order : orderList) {
	System.out.println(order);
}

五、XSSFWorkbook、SXSSFWorkbook、EasyExcel进行Excel文件写入对比

     1.XSSFWorkbook(数据量=100000,10万)

     2. SXSSFWorkbook(数据量=100000,10万)

     

      3. EasyExcel(数据量=100000,10万)

       通过以上对比,SXSSFWorkbook写入10万条数据速度非常快,耗时非常少;XSSFWorkbook写入10万条数据速度快,耗时少;而前两者书写更大数据量的数据可能会出现内存溢出,进而抛出栈溢出异常。 EasyExcel通过异步加载的方式,一次取1000条(有限的条数),异步读取,所以不会内存溢出,而且速度足够快。以上就是今天分享的所有内容,如有不当之处,还请大家多多指正,一起学习,一起进步!

    

  • 24
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值