Excel文件解析

在应用程序的开发过程中,经常需要使用Excel文件来进行数据的导入或导出。所以,在通过Java语言实现此类需求的时候,往往会面临着Excel文件的解析(导入)或生出(导出)。

在Java技术生态圈中,可以进行Excel文件处理的主流技术包括:Apache POIAlibaba EasyExcel等。

今天我们就来分别介绍一下这两种技术如何来进行解析文件和生成文件。

Apache POI

Apache POI 是一种免费开源的跨平台的Java API ,在Apache POI 中我们常用的解析文件的类有 HSSF 和 XSSF。        

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

 POI技术所需的Jar包

Excel文件解析_第1张图片

 

WorkBook文件(Excel文件)

        Workbook接口代表一个Excel文件,用于创建或者加载(解析)Excel文件。常见的实现类是XSSFWorkbook。

Sheet(工作簿)

        Sheet代表Excel表格中的一个工作簿,通过Workbook来进行Sheet对象的获取或创建。

Row(数据行) 

        Row代表Sheet工作簿中一行,通过Sheet来进行Row对象的获取和创建。

Cell(单元格)

        Cell代表一个数据行中的一个单元格,通过Row来进行Cell对象的获取和创建。

Apache POI的创建流程与解析流程

创建流程:

1,创建一个Workbook ,通过输出流写入Excel 文件

//输出流
FileOutputStream out = new FileOutputStream("c:\\test\\2022.xlsx");

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

//通过输出流进行写入
workbook.write(out);

//关闭资源


2,通过Workbook创建一个工作簿Sheet

Sheet sheet = workbook.creatSheet();

3,通过Sheet创建一个工作行Row

Row row = sheet.createRow();

4,通过Row创建一个单元格Cell

//在row这行中创建第一个单元格
Cell cell = Row.createCell(0);

解析流程

1创建一个Workbook ,通过输入流加载 (解析) Excel 文件

//输入流
FileInputStream in = new FileInputStream(c:\\test\\2022.xlsx);

//Excel文件对象
Workbook workbook = new XFFSWorkbook(in)

2,通过Workbook获取工作簿Sheet

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

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

3,通过Sheet获取行Row

//获取首行下标
int first = sheet.getFirstRowNum();

//获取尾行下标
int last = sheet.getLastRowNum();

//根据下标获取指定行
Row row = sheet.getRow(0);

4,通过Rowt获取单元格Cell

//根据下表获取单元格
Cell cell = row.getCell(1);

//获取单元格类型
CellType type = cell.getCellType();

//设置单元格样式
//创建格式编码值
DataFormat dataFormat = workbook.createDataFormat();
short dateFormatCode = dataFormat.getFormat("yyyy年MM月dd日 HH时mm分ss秒");

//创建日期格式对象
CellStyle dataCellStyle = workbook.createCellStyle();
dataCellStyle.setDataFormat(dateFormatCode);

//创建单元格,并未单元格设置格式			
Cell cell = row.createCell(2);//日期
cell.setCellStyle(dataCellStyle);
cell.setCellValue(new Date());

部分代码实现如下

public class Demo {
	public static void main(String[] args) {
		try (FileOutputStream out = new FileOutputStream("C:\\POI\\data.xlsx");
				Workbook workbook = new XSSFWorkbook()) {
			//创建工作簿
			Sheet sheet01 = workbook.createSheet("2020数据列表");
			Sheet sheet02 = workbook.createSheet("2021数据列表");
			Sheet sheet03 = workbook.createSheet("2022数据列表");
			
			//创建行
			Row row = sheet01.createRow(0);
			
			//创建单元格
			Cell cell0 = row.createCell(0);
			cell0.setCellValue(UUID.randomUUID().toString());
			Cell cell1 = row.createCell(1);
			cell1.setCellValue(Math.random() * 10000);
			Cell cell2 = row.createCell(2);
			cell2.setCellValue(LocalDateTime.now());
			
			//将workbook对象中包含的数据,通过输出流,写入至Excel文件
			workbook.write(out);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

Alibaba EasyExcel

当我们需要读取或者写入一个超大Excel文件时,Apache POI技术已经无法快速的对文件进行读取和写入,此时我们需要使用Alibaba EasyExcel技术对文件进行操作,下来我们看一组两种技术对大文件进行读写的CPU和内存占用的对比图。

Excel文件解析_第2张图片 

Excel文件解析_第3张图片

 

 下面我们来看一下EasyExcel的部分代码实现

public class Demo {
	public static void main(String[] args) {
        long begin = System.currentTimeMillis();
		// 写入100w
        EasyExcel.write("E:\\easyExcel\\easy.xlsx", Order.class)
                 .sheet("订单列表")
                 .doWrite(data());
        long end = System.currentTimeMillis();
        
        System.out.println("共耗时" + (end - begin) + "毫秒");
    }
    
    // 创建100w条订单数据
    private static List data() {
        List list = new ArrayList();
        for (int i = 0; i < 1000000; i++) {
            list.add(new Order());
        }
        return list;
    }
}

Excel文件解析_第4张图片

 

你可能感兴趣的:(java,eclipse)