iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >JAVA解析EXCEL(JExcelAPI,POI,EasyExcel)
  • 597
分享到

JAVA解析EXCEL(JExcelAPI,POI,EasyExcel)

javaexcel 2023-10-04 06:10:36 597人浏览 泡泡鱼
摘要

前言 文章目录 前言JExcelAPIDemo POIHSSFWorkBookXSSFWorkBookDemo SXSSFWorkBookDemo XSSFReaderD

前言

文章目录


在这里插入图片描述

demo代码:https://github.com/RwTo/excel-demo
JAVA解析excel 一般有三种方式

JExcelapi
POI
EasyExcel

JExcelAPI

官网:https://jexcelapi.sourceforge.net/

  1. 仅支持 2003 版本的Excel 也就是 后缀名为 xls 的文件
  2. 采用流式处理模型,逐行读取和写入 ——因此 可以处理大量数据,一般不会出现OOM

Demo

<dependency><groupId>net.sourceforge.jexcelapigroupId><artifactId>jxlartifactId><version>2.6.12version>dependency>

读xls 文件

public class ReadExcelDemo {    public static void main(String[] args) {        try {            // 1. 打开 Excel 文件            String filePath = ExcelConstant.EXCEL_PATH_XLS;            Workbook workbook = Workbook.getWorkbook(new java.io.File(filePath));            // 2. 获取第一个工作表            Sheet sheet = workbook.getSheet(0);                        // 3. 遍历每一行,并读取数据            for (int row = 0; row < sheet.getRows(); row++) {                for (int col = 0; col < sheet.getColumns(); col++) {                    Cell cell = sheet.getCell(col, row);                    String content = cell.getContents();                    content += cell.getCellFORMat().getBackgroundColour().getDescription();                    System.out.print(content+"\t");                }                System.out.println();            }            // 4. 关闭工作簿            workbook.close();        } catch (Exception e) {            e.printStackTrace();        }    }}

写xls 文件

public class WriteExcelDemo {    public static void main(String[] args) {        try {            String filePath = ExcelConstant.EXCEL_PATH_XLS;            // 1. 创建工作簿            WritableWorkbook workbook = Workbook.createWorkbook(new File(filePath));            // 2. 创建工作表            WritableSheet sheet = workbook.createSheet("Sheet1", 0);            // 3. 定义单元格颜色            WritableCellFormat greenFormat = new WritableCellFormat();            greenFormat.setBackground(jxl.format.Colour.GREEN);            WritableCellFormat yellowFormat = new WritableCellFormat();            yellowFormat.setBackground(jxl.format.Colour.YELLOW);                        // 4. 写入数据            for (int row = 0; row < 4000; row++) {                for (int col = 0; col < 50; col++) {                    if(col%2 == 0){                        Label label = new Label(col, row, "Cell " + (row + 1) + "-" + (col + 1),yellowFormat);                        sheet.addCell(label);                    }else{                        Label label = new Label(col, row, "Cell " + (row + 1) + "-" + (col + 1),greenFormat);                        sheet.addCell(label);                    }                }            }            // 5. 保存工作簿            workbook.write();            workbook.close();        } catch (Exception e) {            e.printStackTrace();        }    }}

POI

官网:https://poi.apache.org/
功能比较丰富,使用较为广泛,问题也比较多(比如OOM)
四种API 操作Excel
官网介绍:https://poi.apache.org/components/spreadsheet/how-to.html

文档对象模型
HSSFWorkBook (功能丰富,但会OOM)
XSSFWorkBook (功能丰富,但易OOM)
事件处理模型(流式处理)
SXSSFWorkBook (只支持xlsx 的写入)
XSSFReader(仅提供模板,需要使用者自己编写)

POM 文件

<dependency><groupId>org.apache.poigroupId><artifactId>poiartifactId><version>4.1.2version>dependency><dependency><groupId>org.apache.poigroupId><artifactId>poi-ooxmlartifactId><version>4.1.2version>dependency>

HSSFWorkBook

  1. 支持 xls 文件的解析和写入
  2. 基于DOM ,将整个 Excel 文件加载到内存中,构建一个完整的 Excel 文档对象模型树,再进行解析和操作,当文件较大时,可能会出现内存溢出
    但因为 xls 文件支持的样式和单元格数量较少,一般不会出现OOM

XSSFWorkBook

  1. 支持 xlsx 文件的解析和写入
  2. 基于DOM ,将整个 Excel 文件加载到内存中,构建一个完整的 Excel 文档对象模型树,再进行解析和操作,当文件较大时,可能会出现内存溢出
Demo

写入excel(xls,xlsx)

public class WriteExcelDemo {    public static void main(String[] args) {        try {            String filePath = ExcelConstant.EXCEL_PATH_XLS;            //String filePath = ExcelConstant.EXCEL_PATH_XLSX;            //Workbook workbook = new XSSFWorkbook(); //支持xlsx文件的写入            Workbook workbook = new HSSFWorkbook(); //支持xls文件的写入            Sheet sheet = workbook.createSheet("Sheet1");                        for (int row = 0; row < 4000; row++) {                Row excelRow = sheet.createRow(row);                for (int col = 0; col < 50; col++) {                    Cell cell = excelRow.createCell(col);                    cell.setCellValue("Cell " + (row + 1) + "-" + (col + 1));                }            }            FileOutputStream fileOutputStream = new FileOutputStream(filePath);            workbook.write(fileOutputStream);            fileOutputStream.close();            workbook.close();        } catch (Exception e) {            e.printStackTrace();        }    }}

读excel(xls,xlsx)

public class ReadExcelDemo {    public static void main(String[] args) {        try {            String filePath = ExcelConstant.EXCEL_PATH_XLSX;            //String filePath = ExcelConstant.EXCEL_PATH_XLSX;            FileInputStream fileInputStream = new FileInputStream(filePath);            //WorkbookFactory会根据文件类型自动选择使用HSSFWorkBook 或 XSSFWorkBook            Workbook workbook = WorkbookFactory.create(fileInputStream);            Sheet sheet = workbook.getSheetAt(0);                        for (Row row : sheet) {                for (Cell cell : row) {                    String cellValue = getCellValueAsString(cell);                    System.out.print(cellValue + "\t");                }                System.out.println();            }            fileInputStream.close();            workbook.close();        } catch (Exception e) {            e.printStackTrace();        }    }    private static String getCellValueAsString(Cell cell) {        if (cell == null) {            return "";        }        switch (cell.getCellType()) {            case STRING:                return cell.getStrinGCellValue();            case NUMERIC:                return String.valueOf(cell.getNumericCellValue());            case BOOLEAN:                return String.valueOf(cell.getBooleanCellValue());            default:                return "";        }    }}

SXSSFWorkBook

  1. 仅支持xlsx 的写入
  2. 基于流式处理,逐行对excel 处理,用磁盘空间换取内存,可以高效地写入数据到 Excel 文件中,同时减少内存占用。
  3. SXSSFWorkbook 采用了内存优化的设计,避免了将所有数据加载到内存的需求。它仅将有限数量的行缓冲在内存中,写入到输出流后即丢弃缓冲的数据,从而减少了内存占用。
  4. SXSSFWorkbook 支持设置在写入数据之前保留在内存中的行数。通过控制分页大小,可以灵活地控制内存使用,特别适合处理超大型的 Excel 文件。
Demo

写入xlsx

public class SXSSFWriteExcelDemo {    public static void main(String[] args) {        try {            // Set custom temporary directory            String customTempDirPath = "temp";            System.setProperty("java.io.tmpdir", customTempDirPath);            String filePath = ExcelConstant.EXCEL_PATH_XLSX_BIG;            SXSSFWorkbook workbook = new SXSSFWorkbook(500);//rowAccesswindowsize为内存中缓存的记录数,默认100            Sheet sheet = workbook.createSheet("Sheet1");            for (int row = 0; row < 100000; row++) {                Row excelRow = sheet.createRow(row);                for (int col = 0; col < 3; col++) {                    Cell cell = excelRow.createCell(col);                    cell.setCellValue("Cell " + (row + 1) + "-" + (col + 1));                }            }            FileOutputStream fileOutputStream = new FileOutputStream(filePath);            workbook.write(fileOutputStream);            fileOutputStream.close();            //使用 dispose() 方法释放(删除) SXSSFWorkbook 使用的临时资源,特别是在写入大量数据后,这一步骤很重要。            workbook.dispose();                        //程序执行结束后,手动删除临时文件目录(看是否需要)            deleteTempFiles(new File(customTempDirPath));        } catch (Exception e) {            e.printStackTrace();        }    }    private static void deleteTempFiles(File directory)  {        if (directory.isDirectory()) {            File[] files = directory.listFiles();            if (files != null) {                for (File file : files) {                    deleteTempFiles(file);                }            }        }        if (!directory.delete()) {            System.err.println("Failed to delete temp file: " + directory.getAbsolutePath());        } else {            System.out.println("Deleted temp file: " + directory.getAbsolutePath());        }    }}

XSSFReader

官网案例:https://poi.apache.org/components/spreadsheet/how-to.html#xssf_sax_api

  1. 仅支持 xlsx 的解析
  2. 基于流式处理,逐行读取单元格,不会将整个excel 存到内存,适合大型excel的处理
Demo

读xlsx

public class SAXWriteExcelDemo {    public static void main(String[] args) throws Exception {        String filePath = ExcelConstant.EXCEL_PATH_XLSX_BIG;        InputStream is = new FileInputStream(filePath);        OPCPackage opcPackage = OPCPackage.open(is);        try {            // 读取 Excel 文件            XSSFReader reader = new XSSFReader(opcPackage);            // 使用事件处理器处理 Sheet 数据            SAXSheetHandler sheetHandler = new SAXSheetHandler();            XSSFSheetXMLHandler xmlHandler = new XSSFSheetXMLHandler(reader.getStylesTable(), reader.getSharedStringsTable(), sheetHandler, false);            XMLReader sheetParser = XMLReaderFactory.createXMLReader();            sheetParser.setContentHandler(xmlHandler);            Iterator<InputStream> sheetsData = reader.getSheetsData();            while(sheetsData.hasNext()){                InputStream sheetIs = sheetsData.next();                InputSource sheet = new InputSource(sheetIs);                //开始解析sheet页                System.out.println("=====================================开始处理sheet页==============================================");                long start = System.currentTimeMillis();                sheetParser.parse(sheet);                System.out.println("=====================================处理sheet结束==============================================");                long end = System.currentTimeMillis();                List<List<SAXCell>> curSheet = sheetHandler.getCurSheet();                curSheet.forEach(System.out::println);                System.out.println("处理行数:"+sheetHandler.getRowCount());                System.out.println("处理单元格数:"+sheetHandler.getCellCount());                System.out.println("处理时间(ms):"+(end-start));                sheetHandler.clear();            }        } catch (IOException e) {            e.printStackTrace();        } catch (OpenXML4JException e) {            e.printStackTrace();        } catch (SAXException e) {            e.printStackTrace();        }finally {            // 关闭输入流和 OPCPackage            is.close();            opcPackage.close();        }    }}class SAXSheetHandler implements XSSFSheetXMLHandler.SheetContentsHandler {    //当前页    private List<List<SAXCell>> curSheet;    //当前行    private List<SAXCell> curRow;    //总单元格数    private int cellCount;    public SAXSheetHandler() {        this.curSheet = new LinkedList<>();    }        @Override    public void startRow(int i) {        //开始处理新的一行,初始化当前行        curRow = new LinkedList<>();    }        @Override    public void endRow(int i) {        //一行处理结束,将这一行数据存入sheet        curSheet.add(curRow);    }        @Override    public void cell(String cellReference, String formattedValue, XSSFComment xssfComment) {        SAXCell cell = new SAXCell(cellReference, formattedValue);        curRow.add(cell);        cellCount++;    }    @Override    public void headerFooter(String text, boolean isHeader, String tagName) {        // 头部和页脚    }    @Override    public void endSheet() {        //sheet处理结束    }    public List<List<SAXCell>> getCurSheet() {        return curSheet;    }    public int getCellCount() {        return cellCount;    }    public int getRowCount() {        return curSheet.size();    }    public void clear(){        curSheet = new LinkedList<>();        cellCount = 0;    }}@Dataclass SAXCell {    private String cellName;    private String value;    public SAXCell(String cellName, String value) {        this.cellName = cellName;        this.value = value;    }}

EasyExcel

官网:https://easyexcel.opensource.alibaba.com/

  1. 支持xlsx和xls 文件的解析和写入
  2. 流式处理,节省内存,可以处理大型excel
  3. 支持注解,简单易用

Demo

POM

<dependency><groupId>com.alibabagroupId><artifactId>easyexcelartifactId><version>2.2.0-beta2version>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starterartifactId>dependency>

实例

@Datapublic class UserData {    private String name;    private int age;    private String email;    public UserData() {    }    public UserData(String name, int age, String email) {        this.name = name;        this.age = age;        this.email = email;    }}

写入excel(xls,xlsx)

public class EasyWriteExcelDemo {    public static void main(String[] args) {        String filePath = ExcelConstant.EE_EXCEL_PATH_XLSX_BIG;        // 创建写入的数据列表        List<UserData> dataList = new ArrayList<>();        dataList.add(new UserData("Alice", 25, "alice@example.com"));        dataList.add(new UserData("Bob", 30, "bob@example.com"));        dataList.add(new UserData("Charlie", 28, "charlie@example.com"));        // 使用 EasyExcel 写入 Excel 文件        EasyExcel.write(filePath, UserData.class).sheet("Sheet1").doWrite(dataList);    }}

读取excel(xls,xlsx)

public class EasyReadExcelDemo {    public static void main(String[] args) {        String filePath = ExcelConstant.EE_EXCEL_PATH_XLSX_BIG;        // 使用 EasyExcel 读取 Excel 文件        EasyExcel.read(filePath, UserData.class, new UserDataListener()).sheet().doRead();    }    public static class UserDataListener extends AnalysisEventListener<UserData> {        private List<UserData> dataList = new ArrayList<>();        @Override        public void invoke(UserData data, AnalysisContext context) {            dataList.add(data);        }        @Override        public void doAfterAllAnalysed(AnalysisContext context) {            // 在这里可以对 dataList 中的数据进行处理,比如保存到数据库或其他操作            for (UserData userData : dataList) {                System.out.println(userData.getName() + "\t" + userData.getAge() + "\t" + userData.getEmail());            }        }    }}

来源地址:https://blog.csdn.net/ren9436/article/details/131856312

--结束END--

本文标题: JAVA解析EXCEL(JExcelAPI,POI,EasyExcel)

本文链接: https://www.lsjlt.com/news/423287.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JAVA解析EXCEL(JExcelAPI,POI,EasyExcel)
    前言 文章目录 前言JExcelAPIDemo POIHSSFWorkBookXSSFWorkBookDemo SXSSFWorkBookDemo XSSFReaderD...
    99+
    2023-10-04
    java excel
  • Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
    目录一、XSSF二、SXSSF三、easyExcel一、XSSF package com.yy.demo01; import java.io.FileInputStream; i...
    99+
    2024-04-02
  • Java中Excel高效解析工具EasyExcel的实践
    目录简介读 Execl 实践写 Execl 实践模板填充文件追加总结参考资料:alibaba-easyexcel.github.io 简介 EasyExcel是一个基于Java的简单...
    99+
    2024-04-02
  • Java Poi导出Excel表格详解
    一、导出下面的表格 二、流程详解         1、导出excel需要先将数据准备好         2、创建工作傅对象SXSSFWorkbook         3、使用工作傅对象创建sheet对象(工作页)         4、使用...
    99+
    2023-09-01
    java
  • java 中 poi解析Excel文件版本问题解决办法
    poi解析Excel文件版本问题解决办法poi解析Excel文件时有两种格式: HSSFWorkbook格式用来解析Excel2003(xls)的文件 XSSFWorkbook格式用来解析Excel2007(xlsx)的文件 如果用HSSF...
    99+
    2023-05-31
    poi excel ava
  • Java中的excel文件怎么利用POI进行解析
    这篇文章给大家介绍Java中的excel文件怎么利用POI进行解析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.导入POI相关jar包org.apache.poi jar2.代码示例public List getA...
    99+
    2023-05-31
    java poi excel
  • Java使用POI解析带图片的excel,简洁好用
    一、场景         这天遇到这个这样的需求,需要导入表格中的数据,还得支持带图片;这应该难不倒咱阿里的EasyExcel,打开官网文档一看哦豁,明确表示暂时不支持解析带图片的Excel...... 好了,这下只能看POI了,然后想起...
    99+
    2023-09-01
    POI解析带图片表格 POI解析Excel EasyExcel解析表格 java解析带图片表格 java解析excel
  • Java用POI导入导出Excel实例分析
    1、异常java.lang.NoClassDefFoundError: org/apache/poi/UnsupportedFileFormatException 解决方法: 使用的...
    99+
    2024-04-02
  • Java利用poi读取Excel详解实现
    目录前言第一步导入依赖第二步实现测试类+测试实际应用前言 用户可以直接读取本地文件,也可以通过上传文件的形式读取excel 注意:poi对于读取到空白行的时候,会默认的认为是最后一行...
    99+
    2024-04-02
  • java poi解析word的方法
    之前做过用java读取word文档,获取word文本内容。但发现docx的支持,doc就异常了。后来找了很多资料发现是解析方法不一样。首先要导入poi相关的jar包我用的是maven,pom.xml引入如下:<dependency&g...
    99+
    2023-05-31
    java poi word
  • 使用java解析和读取excel表格(EasyExcel的简单使用)
    ** 解析excel的工具 ** Apache POI、JXL、Alibaba EasyExcel等。其中Apache POI基于DOM方式进行解析,将文件直接加载内存,所以速度较快,适合Excel文...
    99+
    2023-09-05
    excel java 开发语言
  • Java如何使用POI操作Excel
    这篇文章主要介绍了Java如何使用POI操作Excel,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 Java使用POI操作Excel ...
    99+
    2024-04-02
  • java使用EasyExcel导入导出excel
    目录一、准备工作 1、导包二、了解注解 1、常用注解2、@ExcelProperty注解 3、@ColumnWith注解 4、@ContentFontStyle注解 5、@Conte...
    99+
    2024-04-02
  • java怎么使用poi生成excel
    这篇文章主要介绍“java怎么使用poi生成excel”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java怎么使用poi生成excel”文章能帮助大家解决问题。使用poi生成excel通常包含一下...
    99+
    2023-06-30
  • java使用poi生成excel的步骤
    使用poi生成excel通常包含一下几个步骤 创建一个工作簿创建一个sheet创建一个Row对象创建一个cell对象(1个row+1个cell构成一个单元格)设置单元格内容设置单元格...
    99+
    2024-04-02
  • Java使用POI导出Excel(一):单sheet
    相关文章: Java使用POI导出Excel(一):单sheet Java使用POI导出Excel(二):多个sheet 相信在大部分的web项目中都会有导出导入Excel的需求,今...
    99+
    2024-04-02
  • Java利用EasyExcel读取写入Excel详情
    目录EasyExcel介绍为什么使用EasyExcel?封装使用例子EasyExcel介绍 EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具...
    99+
    2024-04-02
  • Java——使用EasyExcel导出动态列的Excel
    有些时候列表的列可能是动态的,需要根据动态表头导出Excel文件,这时候可以使用下面的方法解决: public static void exportDynamicExcel(Set includeColumnFiledNam...
    99+
    2023-09-09
    java excel
  • Java使用POI实现导出Excel的方法详解
    目录一、前景二、概念2.1. 简介2.2.Excel版本和相关对象2.3.WorkBook2.4.POI依赖三、POI - 写3.1.代码示例3.2. 性能对比3.3. 测试rowA...
    99+
    2022-11-13
    Java POI导出Excel Java POI Excel Java 导出Excel Java POI
  • java如何使用EasyExcel导入导出excel
    这篇文章主要介绍了java如何使用EasyExcel导入导出excel,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、准备工作1、导包<!-- poi&nb...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作