文件解析_Excel文件解析

Excel文件解析

可以进行Excel文件处理的主流技术:

  • Apache PO(基于DOM方式进行解析,将文件直接加载内存,所有比较快)
  • JXL(适合文件Excel文件数据量不打的应用场景)
  • Alibaba EasyExcel(采用逐行读取的解析模式,比较适合数据量较大的Excel文件解析

1. Apache PO

  • HSSF - 提供读写Microsoft Excel格式档案的功能。
  • XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。
  • HWPF - 提供读写Microsoft Word格式档案的功能。
  • HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
  • ●HDGF - 提供读写Microsoft Visio格式档案的功能。

2.XSSF解析Excel文件

 HSSF用于解析旧版本(*.xls)Excel文件,由于旧版本的Excel文件只能存在65535行数据,所以目前已经不常用。所以目前主要采用XSSF进行新版本(*.xlsx)Exce文件的解析。

 Workbook(Excel文件)

(1)创建Excel文件

try (Workbook workbook = new XSSFWorkbook();
				FileOutputStream fos = new FileOutputStream("c:\\test\\temp.xlsx")) {
    workbook.write(fos);
} catch (IOException e) {
    e.printStackTrace();
}

(2)加载(解析)Excel文件

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

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

 Sheet(工作簿)

通过Workbook来进行工作簿Sheet对象的获取或创建

 (1)创建工作簿

// 按照默认名称创建工作簿
Sheet sheet1 = workbook.createSheet();

// 按照自定义名称创建工作簿
Sheet sheet2 = workbook.createSheet("自定义工作簿2");

(2) 获取工作簿

// 按照工作簿下标获取Sheet
Sheet sheet01 = workbook.getSheetAt(0);

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

(3)获取工作簿的数量

int n = workbook.getNumberOfSheets();

Row(数据行)

通过Sheet来进行数据行Row对象的获取或创建 

 (1)创建数据行

Row row = sheet.createRow(0);
Row row = sheet.getRow(0);

(2)获取首行下标

int first = sheet.getFirstRowNum();

(3) 获取尾行下标

int last = sheet.getLastRowNum();

 (4)根据下标获取指定行

Row row = sheet.getRow(0);

 (5)遍历所有行

for(Row row : sheet) {
    System.out.println(row);
}

(6)遍历指定区域行

Cell(单元格)

通过Row来进行单元格Cell对象的获取或创建 

(1)创建单元格

Cell cell0 = row.createCell(0);

 (2)设置单元格值

cell0.setCellValue(UUID.randomUUID().toString());

 (3)遍历所有单元格

for(Cell cell : row) {
				
}

(4)获取单元格的类型

CellType type = cell.getCellType();

(5)设置单元格样

// 创建单元格样式
DataFormat dataFormat = workbook.createDataFormat();
Short formatCode = dataFormat.getFormat("yyyy-MM-dd HH:mm:ss");
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setDataFormat(formatCode);

// ...

// 为当前行创建单元格
Cell cell1 = row.createCell(1);
cell1.setCellStyle(cellStyle); // 设置单元格样式
cell1.setCellValue(new Date()); // 保存当前日期时间至本单元格

(6)设置单元格对齐

// 创建单元格样式
CellStyle cellStyle = workbook.createCellStyle();

//设置单元格的水平对齐类型。 此时水平居中
cellStyle.setAlignment(HorizontalAlignment.CENTER);

// 设置单元格的垂直对齐类型。 此时垂直靠底边
cellStyle.setVerticalAlignment(VerticalAlignment.BOTTOM);

XSSFWorkbook,SXSSFWorkbook以及EasyExcel读取Excel文件的比较 

 1.EasyExcel

package com.apesource;
 
import java.util.ArrayList;
import java.util.List;
 
import com.alibaba.excel.EasyExcel;
import com.apesource.entity.Order;
 
 
public class Demo01 {
	public static void main(String[] args) {
		long begin = System.currentTimeMillis();
        // 写入100w
        EasyExcel.write("E:\\test\\demo05.xlsx", Order.class)
                 .sheet("订单列表")
                 .doWrite(data());
        
        long end = System.currentTimeMillis();
        
        System.out.println("EasyExcel读取30w文件共耗时" +(end - begin) +"毫秒");
    }
    
    // 创建100w条订单数据
    private static List<Order> data() {
        List<Order> list = new ArrayList<Order>();
        for (int i = 0; i < 300000; i++) {
            list.add(new Order());
        }
        return list;
    }
}

 

2.XSSFWorkbook

package com.apesource;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
 
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
public class Demo10 {
	public static void main(String[] args) {
		long begin = System.currentTimeMillis();
		// 使用
		try (Workbook workbook = new XSSFWorkbook();
				FileOutputStream out = new FileOutputStream("E:\\test\\demo03.xlsx")) {
			
					
			Sheet sheet = workbook.createSheet();
			
			Row headrow = sheet.createRow(0);
			Cell headcell0 = headrow.createCell(0);
			headcell0.setCellValue("序号");
			Cell headcell1 = headrow.createCell(1);
			headcell1.setCellValue("姓名");
			Cell headcell2 = headrow.createCell(2);
			headcell2.setCellValue("日期");
			Cell headcell3 = headrow.createCell(3);
			headcell3.setCellValue("红包金额");
			
			// 获取格式编码值
			DataFormat dataFormat = workbook.createDataFormat();
			short dataFormatCode = dataFormat.getFormat("yyyy年MM月dd日 HH:mm:ss");
			short moneyFormatCode = dataFormat.getFormat("¥#,###");
			
			// 创建日期格式对象
			CellStyle dataCellStyle = workbook.createCellStyle();
			dataCellStyle.setDataFormat(dataFormatCode);
			
			
			// 创建货币格式对象
			CellStyle moneyCellStyle =  workbook.createCellStyle();
			moneyCellStyle.setDataFormat(moneyFormatCode);
			
			
			for(int i = 0 ;i < 300000;i++) {
				String name  = "A" + i;
				
				// 创建行
				Row row = sheet.createRow(i+1);
				
				// 创建单元格
				Cell cell0 = row .createCell(0); // 序号
				cell0.setCellValue(String.valueOf(i+1));
				
				Cell cell1 = row.createCell(1); // 姓名
				cell1.setCellValue(name);
				
				Cell cell2 = row.createCell(2);// 日期
				cell2.setCellStyle(dataCellStyle);// 日期格式对象
				cell2.setCellValue(new Date());
				
				Cell cell3 = row.createCell(3);
				cell3.setCellStyle(moneyCellStyle);
				cell3.setCellValue((int)(Math.random() *1000000));
		
			}
		
			// 写入文件
			workbook.write(out);
			long end = System.currentTimeMillis();
	        
	        System.out.println("XSSFWorkbook读取30w文件共耗时" +(end - begin) +"毫秒");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
 
}

 

 

 3.SXSSFWorkbook

package com.apesource;
 
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
 
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
public class Demo10 {
	public static void main(String[] args) {
		long begin = System.currentTimeMillis();
		// 使用
		try (Workbook workbook = new SXSSFWorkbook(100);
				FileOutputStream out = new FileOutputStream("E:\\test\\demo03.xlsx")) {
			
					
			Sheet sheet = workbook.createSheet();
			
			Row headrow = sheet.createRow(0);
			Cell headcell0 = headrow.createCell(0);
			headcell0.setCellValue("序号");
			Cell headcell1 = headrow.createCell(1);
			headcell1.setCellValue("姓名");
			Cell headcell2 = headrow.createCell(2);
			headcell2.setCellValue("日期");
			Cell headcell3 = headrow.createCell(3);
			headcell3.setCellValue("红包金额");
			
			// 获取格式编码值
			DataFormat dataFormat = workbook.createDataFormat();
			short dataFormatCode = dataFormat.getFormat("yyyy年MM月dd日 HH:mm:ss");
			short moneyFormatCode = dataFormat.getFormat("¥#,###");
			
			// 创建日期格式对象
			CellStyle dataCellStyle = workbook.createCellStyle();
			dataCellStyle.setDataFormat(dataFormatCode);
			
			
			// 创建货币格式对象
			CellStyle moneyCellStyle =  workbook.createCellStyle();
			moneyCellStyle.setDataFormat(moneyFormatCode);
			
			
			for(int i = 0 ;i < 300000;i++) {
				String name  = "A" + i;
				
				// 创建行
				Row row = sheet.createRow(i+1);
				
				// 创建单元格
				Cell cell0 = row .createCell(0); // 序号
				cell0.setCellValue(String.valueOf(i+1));
				
				Cell cell1 = row.createCell(1); // 姓名
				cell1.setCellValue(name);
				
				Cell cell2 = row.createCell(2);// 日期
				cell2.setCellStyle(dataCellStyle);// 日期格式对象
				cell2.setCellValue(new Date());
				
				Cell cell3 = row.createCell(3);
				cell3.setCellStyle(moneyCellStyle);
				cell3.setCellValue((int)(Math.random() *1000000));
		
			}
		
			// 写入文件
			workbook.write(out);
			long end = System.currentTimeMillis();
	        
	        System.out.println("SXSSFWorkbook读取30w文件共耗时" +(end - begin) +"毫秒");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
 
}

 ​​​​​​​

 综上数据可见:同是30w数据SXSSFWorkbook运行速度最快,CPU占比最小;EasyExcel次之;XSSFWorkbook运行速度最慢,CPU占比最大;

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想早起.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值