Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)


Posted in Java/Android onJuly 15, 2022

一、XSSF

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文件解析(XSSF,SXSSF,easyExcel)

二、SXSSF

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文件解析(XSSF,SXSSF,easyExcel)

三、easyExcel

准备实体类

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

写入300000条数据

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文件解析(XSSF,SXSSF,easyExcel)

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

以上就是Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)的详细内容,更多关于Java Excel文件解析的资料请关注三水点靠木其它相关文章!


Tags in this post...

Java/Android 相关文章推荐
idea搭建可运行Servlet的Web项目
Jun 26 Java/Android
SpringBoot实现异步事件驱动的方法
Jun 28 Java/Android
JavaWeb 入门篇(3)ServletContext 详解 具体应用
Jul 16 Java/Android
springboot集成springCloud中gateway时启动报错的解决
Jul 16 Java/Android
SpringCloud之@FeignClient()注解的使用方式
Sep 25 Java/Android
Java 实现限流器处理Rest接口请求详解流程
Nov 02 Java/Android
Java中try catch处理异常示例
Dec 06 Java/Android
mybatis源码解读之executor包语句处理功能
Feb 15 Java/Android
spring注解 @PropertySource配置数据源全流程
Mar 25 Java/Android
Java 超详细讲解数据结构中的堆的应用
Apr 02 Java/Android
利用正则表达式匹配浮点型数据
May 30 Java/Android
Java代码规范与质量检测插件SonarLint的使用
Aug 05 Java/Android
向Spring IOC 容器动态注册bean实现方式
Jul 15 #Java/Android
SpringBoot详解执行过程
Jul 15 #Java/Android
spring 项目实现限流方法示例
SpringBoot详解整合Redis缓存方法
Jul 15 #Java/Android
maven 解包依赖项中的文件的解决方法
Jul 15 #Java/Android
SpringBoot详解自定义Stater的应用
Jul 15 #Java/Android
MyBatis XPathParser解析器使用范例详解
Jul 15 #Java/Android
You might like
弹出模态框modal的实现方法及实例
2017/09/19 PHP
yii2 开发api接口时优雅的处理全局异常的方法
2019/05/14 PHP
getElementById在任意一款浏览器中都可以用吗的疑问回复
2007/05/13 Javascript
JavaScript iframe的相互操作浅析
2009/10/14 Javascript
js继承的实现代码
2010/08/05 Javascript
JavaScript实现点击按钮后变灰避免多次重复提交
2013/07/15 Javascript
JS 使用for循环遍历子节点查找元素
2014/09/06 Javascript
javascript trim函数在IE下不能用的解决方法
2014/09/12 Javascript
浅谈Node.js中的定时器
2015/06/18 Javascript
jQuery实现表单步骤流程导航代码分享
2015/08/28 Javascript
Bootstrap的图片轮播示例代码
2015/08/31 Javascript
基于Bootstrap重置输入框内容按钮插件
2016/05/12 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
2016/11/16 Javascript
在 Angular2 中实现自定义校验指令(确认密码)的方法
2017/01/23 Javascript
js使用xml数据载体实现城市省份二级联动效果
2017/11/08 Javascript
在vue项目中使用Nprogress.js进度条的方法
2018/01/31 Javascript
layDate日期控件使用方法详解
2018/11/15 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
2018/12/30 Javascript
JavaScript实现切换多张图片
2021/01/27 Javascript
[40:48]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第二局
2016/02/28 DOTA
python网络编程学习笔记(九):数据库客户端 DB-API
2014/06/09 Python
windows下python之mysqldb模块安装方法
2017/09/07 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
2018/03/05 Python
Python设计模式之状态模式原理与用法详解
2019/01/15 Python
windows下numpy下载与安装图文教程
2019/04/02 Python
Python企业编码生成系统之主程序模块设计详解
2019/07/26 Python
对django2.0 关联表的必填on_delete参数的含义解析
2019/08/09 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
2020/03/25 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
2020/07/30 Python
Python生成并下载文件后端代码实例
2020/08/31 Python
html5 canvas移动浏览器上实现图片压缩上传
2016/03/11 HTML / CSS
美国一家专业的太阳镜网上零售商:Solstice太阳镜
2016/07/25 全球购物
2014年学前班工作总结
2014/12/08 职场文书
领导欢迎词致辞
2015/01/23 职场文书
三峡大坝导游词
2015/01/31 职场文书
mybatis 解决从列名到属性名的自动映射失败问题
2021/06/30 Java/Android