文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java如何实现超大Excel文件解析

2023-07-02 18:14

关注

今天小编给大家分享一下Java如何实现超大Excel文件解析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

一、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文件中,创建新的sheetSheet 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文件解析

二、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文件中,创建新的sheetSheet 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();}} }

三、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文件解析

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

以上就是“Java如何实现超大Excel文件解析”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯