java中Excel文件解析及超大Excel文件解析

一、Apache - poi

1.Apache - poi是java编写的免费开源的跨平台的Java-API,Java-POI,提供给java程序的Microsoft Office格式档案进行读写功能的API开源类库

添加相关jar包

 jar包:http://链接:https://pan.baidu.com/s/1O6-6dYINbGqFCe_kEgkITg 提取码:20vc

2.提供不同文件格式的解析:

HSSF

XSSF:Workbook对象实现它

eg:

Workbook workbook = new XSSFWorkbook(传入excel路径文件流);

3.方法:

//将Workbook对象中包含的数据,通过输出流,写入至Excel
Workbook workbook = new XSSFWorkbook(new                                                  
                                   FileInputStream("D:\\1627356552686.xlsx"));

workbook.write(out);

(1)sheet:工作簿
     获取工作簿数量

Sheet sheet0 = workbook.getSheet("Sheet0");
Sheet sheet1 = workbook.getSheetAt(0);

       

System.out.println("工作簿1中的数据行:" + sheet0.getLastRowNum());
System.out.println("工作簿2中的数据行:" + sheet1.getLastRowNum());

            

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

Row row = sheet.getsheeAt(0);//第一行下标为0

(2.1)遍历所有行

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

(2.2)遍历所有区域行

for (int i = 1; i <= sheet.getLastRowNum(); i++) {
    Row row = sheet.getRow(i);
    System.out.println(row);
}

(3)根据下标获取指定单元格

Cell cell = row.getCell(0);//第一个下标为0

(3.1)获得单元格内的值

cell.getStringCellValue();

注意:返回值为数字时调用cell.getNumericCellValue();此方法返回值为double

(3.1)遍历所有单元格

for(Cell cell : row) {
                
}

Workbook workbook = new XSSFWorkbook(FileOutputStream out = new FileOutputStream("D:\\1\\demo.xlsx"));

(1)创建sheet工作簿

           

 sheet sheet0 = workbook.createSheet();
 Sheet sheet1 = workbook.createSheet();
 Sheet sheet2 = workbook.createSheet();

(2)  创建数据行Row
           

 Row row = sheet0.createRow(0);


            
(3)    创建单元格
           

 Cell cell0 = row.createCell(0);

   创建单元格的值

          

  cell0.setCellValue();

(4)创建单元格格式
          获取格式编码

// 创建单元格样式
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()); // 保存当前日期时间至本单元格

(5)获取列头
         

Row headRow = sheet.getRow(0);

 
   遍历列头单元格
          

  for(Cell headCell : headRow) {
                System.out.print(headCell + "\t");
            }

(6)获取当前单元格类型(运用switch循环可以跟单元格类型匹配填入相应的单元格中)
       

CellType type = cell.getCellType();

        例如;根据当前单元格的类型获取其中的值

 switch(cellType) {
                    case STRING:
                        String strVal = cell.getStringCellValue();
                        System.out.print(strVal + "\t");
                        break;
                    case NUMERIC:
                        double numVal = cell.getNumericCellValue();
                        System.out.print(numVal + "\t");
                        break;
                    }
                }    


                  

(7)   在“已存在”的Excel文件中,创建新的sheet
            

Sheet sheet = workbook.createSheet();//每运行一遍程序,创建一个新的sheet

(8)设置单元格对齐

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

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

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

二、java中关于超大Excel文件解析,XSSF,SXSSF,以及easyExcel的速度比较及其代码实现

1.XSSF类写入30万条数据

package com.yy.demo01;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;

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 dd {public static void main(String[] args) {
	//开始时间
	long begin = System.currentTimeMillis();
	try (//读取一个已存在的Excel文件
			 Workbook workbook = new XSSFWorkbook(new FileInputStream("D:\\1\\demo-data.xlsx"));
					FileOutputStream out = new FileOutputStream("D:\\1\\100w.xlsx")) {
			  
			    //在“已存在”的Excel文件中,创建新的sheet
				Sheet sheet = workbook.createSheet();
				
				//获取格式编码值
				DataFormat dataFormat = workbook.createDataFormat();
				Short dateFormatCode = dataFormat.getFormat("yyyy年MM月dd日 HH:mm:ss");
				Short moneyFormatCode = dataFormat.getFormat("¥#,###");
				
				//创建日期格式对象
				CellStyle dateCellStyle = workbook.createCellStyle();
				dateCellStyle.setDataFormat(dateFormatCode);//设置格式编码
				
				//创建货币格式对象
				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(dateCellStyle);//货币金额格式对象
			    	cell2.setCellValue(new Date());
			    	
			    	Cell cell3 = row.createCell(3);//红包金额
			    	cell3.setCellStyle(moneyCellStyle);//货币金额格式对象
			    	cell3.setCellValue((int)(Math.random()*10000));
			    	
			    }
			    //写入文件
				workbook.write(out);
				//结束时间
				long end = System.currentTimeMillis();
				
				System.out.println("共耗时:" +(end - begin) + "毫秒");
			
			} catch (IOException e) {

				e.printStackTrace();
			}
}

}

bf351b0c5f1b4a53b2690014bd5fdce5.png

2.SXSSF类(Workbook workbook = new SXSSFWorkbook(100);
                        FileOutputStream out = new FileOutputStream("D:\\1\\100w.xlsx"))

                            ............                     

                        写入文件
                        workbook.write(out);

SXSSF类写入30万条数据

package com.yy.demo01;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;

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;

public class Demo10 {
	public static void main(String[] args) {
		//开始时间
		long begin = System.currentTimeMillis();
		try (//读取一个已存在的Excel文件
				 Workbook workbook = new SXSSFWorkbook(100);
						FileOutputStream out = new FileOutputStream("D:\\1\\100w.xlsx")) {
				  
				    //在“已存在”的Excel文件中,创建新的sheet
					Sheet sheet = workbook.createSheet();
					
					//获取格式编码值
					DataFormat dataFormat = workbook.createDataFormat();
					Short dateFormatCode = dataFormat.getFormat("yyyy年MM月dd日 HH:mm:ss");
					Short moneyFormatCode = dataFormat.getFormat("¥#,###");
					
					//创建日期格式对象
					CellStyle dateCellStyle = workbook.createCellStyle();
					dateCellStyle.setDataFormat(dateFormatCode);//设置格式编码
					
					//创建货币格式对象
					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(dateCellStyle);//货币金额格式对象
				    	cell2.setCellValue(new Date());
				    	
				    	Cell cell3 = row.createCell(3);//红包金额
				    	cell3.setCellStyle(moneyCellStyle);//货币金额格式对象
				    	cell3.setCellValue((int)(Math.random()*10000));
				    	
				    }
				    //写入文件
					workbook.write(out);
					//结束时间
					long end = System.currentTimeMillis();
					
					System.out.println("共耗时:" +(end - begin) + "毫秒");
				
				} catch (IOException e) {

					e.printStackTrace();
				}
	}

}

d186c31a10b64149863769eebc95d0fc.png

2.easyExcel写入30万条数据

准备实体类

public class Order {
    @ExcelProperty("订单编号")
	private String orderId; // 订单编号
	
    @ExcelProperty("支付金额")
	@NumberFormat("¥#,###")
	private Double payment; // 支付金额
	
    @ExcelProperty(value = "创建日期",converter = LocalDateTimeConverter.class)
	private LocalDateTime creationTime; // 创建时间

	public Order() {
		this.orderId = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddhhmmss"))
				+ UUID.randomUUID().toString().substring(0, 5);
		this.payment = Math.random() * 10000;
		this.creationTime = LocalDateTime.now();
	}

	public String getOrderId() {
		return orderId;
	}

	public void setOrderId(String orderId) {
		this.orderId = orderId;
	}

	public Double getPayment() {
		return payment;
	}

	public void setPayment(Double payment) {
		this.payment = payment;
	}

	public LocalDateTime getCreationTime() {
		return creationTime;
	}

	public void setCreationTime(LocalDateTime creationTime) {
		this.creationTime = creationTime;
	}



	@Override
	public String toString() {
		return "Order [orderId=" + orderId + ", payment=" + payment + ", creationTime=" + creationTime + "]";
	}
}

 准备converter转换类(兼容LocateDateTime日期时间类)

public class LocalDateTimeConverter implements Converter<LocalDateTime> {

	@Override
	public Class<LocalDateTime> supportJavaTypeKey() {
		return LocalDateTime.class;
	}

	@Override
	public CellDataTypeEnum supportExcelTypeKey() {
		return CellDataTypeEnum.STRING;
	}

	@Override
	public LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
			GlobalConfiguration globalConfiguration) {
		return LocalDateTime.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
	}

	@Override
	public CellData<String> convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty,
			GlobalConfiguration globalConfiguration) {
		return new CellData<>(value.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
	}

}

写入30万条数据

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 < 300000; i++) {
            list.add(new Order());
        }
        return list;
    }
}

d5c261f6bc4c49a0820811f6f55722c0.png

 所以easyExcel最快,XSSF最慢且占用cpu最高

  • 68
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Java,可以使用Apache POI库来解析Excel文件。Apache POI是一个开源的Java库,提供了读取、写入和操作Microsoft Office格式文件(如Excel、Word和PowerPoint)的功能。 要解析Excel文件,首先需要导入Apache POI库的相关依赖。可以在项目的pom.xml文件添加以下依赖: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 接下来,可以使用以下代码示例来解析Excel文件: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; import java.io.IOException; public class ExcelParser { public static void main(String[] args) { try { FileInputStream file = new FileInputStream("path/to/excel/file.xlsx"); Workbook workbook = new XSSFWorkbook(file); Sheet sheet = workbook.getSheetAt(0); for (Row row : sheet) { for (Cell cell : row) { CellType cellType = cell.getCellType(); if (cellType == CellType.STRING) { System.out.print(cell.getStringCellValue() + "\t"); } else if (cellType == CellType.NUMERIC) { System.out.print(cell.getNumericCellValue() + "\t"); } else if (cellType == CellType.BOOLEAN) { System.out.print(cell.getBooleanCellValue() + "\t"); } } System.out.println(); } workbook.close(); file.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 上述代码使用FileInputStream来读取Excel文件,然后创建XSSFWorkbook对象表示整个Excel文件。通过getSheetAt方法获取第一个Sheet,然后使用两个嵌套的循环遍历每一行和每一个单元格。根据单元格的类型,可以使用getCellType方法获取单元格的值。 请注意,上述代码示例假设Excel文件的第一个Sheet是要解析的目标。如果需要解析其他Sheet,可以使用getSheet方法指定Sheet的名称或索引。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值