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

作者:无解的黑眼圈 时间:2023-11-27 11:02:17 

一、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最高

来源:https://blog.csdn.net/weixin_49187233/article/details/125772491

标签:Java,Excel,文件,解析
0
投稿

猜你喜欢

  • java开发实现订阅到货通知帮我们买到想买的东西

    2022-05-01 18:55:11
  • C#开发Winform控件之打开文件对话框OpenFileDialog类

    2023-04-19 10:53:16
  • Android中handler使用浅析

    2022-08-22 23:45:16
  • SpringBoot嵌入式Servlet容器与定制化组件超详细讲解

    2023-03-31 09:07:05
  • 浅谈c#.net中巧用ToString()将日期转成想要的格式

    2022-02-02 18:14:07
  • java基础的详细了解第五天

    2023-06-02 16:54:04
  • 详解Android实现定时器的几种方法

    2021-10-17 17:37:17
  • android实现图片闪烁动画效果的两种实现方式(实用性高)

    2022-06-29 14:18:32
  • Android实现简单MD5加密的方法

    2021-10-06 19:51:04
  • java设计模式之简单工厂模式详解

    2021-12-21 22:16:34
  • Quartz与Spring集成的两种方法示例

    2022-05-22 05:15:41
  • Android保持屏幕常亮2种实现方法

    2022-09-08 11:22:43
  • Spring JPA 增加字段执行异常问题及解决

    2023-06-25 23:55:58
  • C#实现简化QQ聊天窗口

    2023-01-18 19:01:20
  • Spring MVC 使用支付宝接口完成在线支付的示例代码

    2023-11-29 04:07:55
  • 详解Android中Runtime解决屏幕旋转问题(推荐)

    2022-04-03 03:12:02
  • 关于C# Math 处理奇进偶不进的实现代码

    2023-03-25 09:30:29
  • c# 开机启动项的小例子

    2022-11-30 02:16:43
  • asp.net实现遍历Request的信息操作示例

    2022-11-15 23:15:18
  • C#中FileStream的对比及使用方法

    2023-10-17 21:09:41
  • asp之家 软件编程 m.aspxhome.com