一、Apache - poi

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

添加相关jar包

Java 解析大excel java解析excel文件流_eclipse

 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();
			}
}

}

Java 解析大excel java解析excel文件流_大数据_02

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();
				}
	}

}

Java 解析大excel java解析excel文件流_后端_03

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;
    }
}

Java 解析大excel java解析excel文件流_eclipse_04

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