POI 的 Excel 读写操作教程

news2025/2/19 10:45:45

POI 的 Excel 读写操作教程

一、POI 简介

Apache POI 是一款在 Java 开发中广受欢迎的开源库,主要用于处理各种 Microsoft Office 文件格式,Excel 文件便是其中之一。凭借其功能强大的 API,POI 不仅支持对 Excel 文件的读取、写入和修改,还为 Java 开发者在处理 Excel 相关业务时提供了极大的便利。

二、POI 的 Excel 读写操作案例

(一)引入依赖

在 Maven 项目中使用 POI 时,需要在 pom.xml 文件中添加 POI 相关的依赖。以下是配置示例:

<dependencies>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.0.0</version>
    </dependency>
</dependencies>

添加上述依赖后,Maven 会自动下载并管理 POI 及其相关依赖项,确保项目能够顺利使用 POI 的功能。

(二)写入 Excel 文件

以下是一个基础的示例,展示如何使用 POI 将数据写入 Excel 文件:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;

public class ExcelWriteExample {
    public static void main(String[] args) {
        // 创建一个新的 Excel 工作簿,使用 XSSFWorkbook 表示 Excel 2007 及以上版本的 .xlsx 格式
        Workbook workbook = new XSSFWorkbook();
        // 在工作簿中创建一个名为 "Sheet1" 的工作表
        Sheet sheet = workbook.createSheet("Sheet1");

        // 定义要写入的数据,采用二维数组的形式
        String[][] data = {
            {"姓名", "年龄", "性别"},
            {"张三", "25", "男"},
            {"李四", "30", "女"}
        };

        // 遍历数据数组,逐行逐列将数据写入工作表
        for (int i = 0; i < data.length; i++) {
            Row row = sheet.createRow(i);
            for (int j = 0; j < data[i].length; j++) {
                Cell cell = row.createCell(j);
                cell.setCellValue(data[i][j]);
            }
        }

        // 将数据保存到文件系统中
        try (FileOutputStream fos = new FileOutputStream("example.xlsx")) {
            workbook.write(fos);
            System.out.println("文件写入成功!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                workbook.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

运行该代码后,会在项目根目录下生成一个名为 example.xlsx 的 Excel 文件,文件中包含预定义的数据。

(三)读取 Excel 文件

以下是读取上述 Excel 文件内容的代码示例:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.io.IOException;

public class ExcelReadExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("example.xlsx")) {
            // 通过文件输入流创建工作簿对象
            Workbook workbook = new XSSFWorkbook(fis);
            // 获取工作簿中的第一个工作表
            Sheet sheet = workbook.getSheetAt(0);

            // 遍历工作表中的每一行
            for (Row row : sheet) {
                // 遍历当前行中的每一个单元格
                for (Cell cell : row) {
                    switch (cell.getCellType()) {
                        case STRING:
                            System.out.print(cell.getStringCellValue() + "\t");
                            break;
                        case NUMERIC:
                            if (DateUtil.isCellDateFormatted(cell)) {
                                System.out.print(cell.getDateCellValue() + "\t");
                            } else {
                                System.out.print(cell.getNumericCellValue() + "\t");
                            }
                            break;
                        case BOOLEAN:
                            System.out.print(cell.getBooleanCellValue() + "\t");
                            break;
                        default:
                            System.out.print("\t");
                    }
                }
                System.out.println();
            }

            workbook.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行该代码,控制台将输出 Excel 文件中的所有数据,按行列顺序展示。

三、内存问题及优化

(一)内存问题示例

在处理大文件时,如果将整个 Excel 文件加载到内存中,可能会导致内存溢出。例如:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.io.IOException;

public class MemoryProblemExample {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("large_file.xlsx")) {
            Workbook workbook = new XSSFWorkbook(fis);
            Sheet sheet = workbook.getSheetAt(0);
            // 大文件加载到内存可能会导致 OutOfMemoryError
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

当文件 large_file.xlsx 很大时,调用 XSSFWorkbook(fis) 可能会消耗大量内存,导致 OutOfMemoryError

(二)优化方法
  1. 使用 SXSSFWorkbook 写入大文件SXSSFWorkbookXSSFWorkbook 的流式写入版本,它采用了逐行写入的方式,避免将所有数据一次性加载到内存中。如下示例:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;

public class ExcelWriteLargeFileExample {
    public static void main(String[] args) {
        Workbook workbook = new SXSSFWorkbook(100);  // 设置内存中最多保留 100 行
        Sheet sheet = workbook.createSheet("Sheet1");

        for (int i = 0; i < 10000; i++) {
            Row row = sheet.createRow(i);
            for (int j = 0; j < 3; j++) {
                Cell cell = row.createCell(j);
                cell.setCellValue("数据" + i + "-" + j);
            }
        }

        try (FileOutputStream fos = new FileOutputStream("large_example.xlsx")) {
            workbook.write(fos);
            System.out.println("大文件写入成功!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                workbook.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
  1. 分批读取大文件:对于大文件的读取,可以通过分批读取的方式逐步加载数据,降低内存压力。例如,可以设置每次读取固定数量的行,处理完成后再继续读取下一批数据。开发者可以根据实际需求灵活实现。

四、常见 Excel 操作工具

除了 POI,Java 生态中还有其他一些常用的 Excel 操作库,下面简要介绍几种:

  1. Hutool:Hutool 是一个功能丰富的 Java 工具包,提供了对 POI 的封装,简化了 Excel 文件的操作。示例代码如下:
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;

import java.util.List;
import java.util.Map;

public class HutoolExcelExample {
    public static void main(String[] args) {
        ExcelReader reader = ExcelUtil.getReader("example.xlsx");
        List<Map<String, Object>> rows = reader.readAll();
        for (Map<String, Object> row : rows) {
            System.out.println(row);
        }
    }
}
  1. JXL:JXL 是一个较为简单的 Excel 操作库,适用于处理 .xls 格式的文件。由于对 .xlsx 格式支持较弱,它更适用于旧版 Excel 文件。

  2. EasyExcel:EasyExcel 是阿里巴巴开源的一个高效 Excel 处理工具,特别适用于大数据量的 Excel 文件,内存消耗较低。以下是使用 EasyExcel 写入文件的示例:

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;

import java.util.ArrayList;
import java.util.List;

public class EasyExcelExample {
    public static void main(String[] args) {
        String fileName = "easyexcel_example.xlsx";
        List<Data> dataList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Data data = new Data("姓名" + i, i, "性别" + i);
            dataList.add(data);
        }

        EasyExcel.write(fileName, Data.class).sheet("Sheet1").doWrite(dataList);
    }

    public static class Data {
        private String name;
        private int age;
        private String gender;

        public Data(String name, int age, String gender) {
            this.name = name;
            this.age = age;
            this.gender =

 gender;
        }

        // Getters and Setters
    }
}

总结

本文详细介绍了如何使用 Apache POI 进行 Excel 文件的读写操作,包括常见的使用场景和一些优化建议。对于需要处理大数据量的 Excel 文件,介绍了 SXSSFWorkbook 的使用方法,避免内存溢出问题。此外,还简要介绍了其他流行的 Excel 操作工具,如 Hutool、JXL 和 EasyExcel,它们各具特色,适合不同的需求。

通过掌握这些工具和技巧,你可以在 Java 项目中高效地处理 Excel 文件,提升开发效率和应用性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2299097.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS2 话题通信

1. 基本概念 发布-订阅模型&#xff1a;节点间通过话题&#xff08;Topic&#xff09;异步通信&#xff0c;发布者&#xff08;Publisher&#xff09;发送消息&#xff0c;订阅者&#xff08;Subscriber&#xff09;接收消息。 话题&#xff08;Topic&#xff09;&#xff1a;…

【学习资源】时间序列数据分析方法(1)

时间序列数据分析是一个有趣的话题&#xff0c;让我们多花一些时间来研究。此篇为第一篇文章。主要介绍特征提取方法、深度学习时序数据分析模型、参考资源。期望能帮助大家解决工业领域的相关问题。 1 特征提取方法&#xff1a;信号处理 (来源:INTELLIGENT FAULT DIAGNOSIS A…

Streamlit与Qlib:量化投资策略可视化实战

Streamlit与Qlib&#xff1a;量化投资策略可视化实战 1. 项目背景 在量化投资领域&#xff0c;数据可视化是理解和展示投资策略的关键。本文将详细介绍如何使用Streamlit和Qlib构建一个交互式的量化投资策略可视化应用。 2. 环境准备 2.1 安装依赖 # 安装必要的库 pip ins…

Ceph集群搭建2025(squid版)

squid版本维护年限 apt install -y cephadmecho >> "deb http://mirrors.163.com/ceph/debian-squid/ bookworm main" echo >> "deb-src http://mirrors.163.com/ceph/debian-squid/ bookworm main"#安装源 cephadm install #开始初始化一个最…

机器学习实战(3):线性回归——预测连续变量

第3集&#xff1a;线性回归——预测连续变量 在机器学习的世界中&#xff0c;线性回归是最基础、最直观的算法之一。它用于解决回归问题&#xff0c;即预测连续变量&#xff08;如房价、销售额等&#xff09;。尽管简单&#xff0c;但线性回归却是许多复杂模型的基石。今天我们…

【漫话机器学习系列】093.代价函数和损失函数(Cost and Loss Functions)

代价函数和损失函数&#xff08;Cost and Loss Functions&#xff09;详解 1. 引言 在机器学习和深度学习领域&#xff0c;代价函数&#xff08;Cost Function&#xff09;和损失函数&#xff08;Loss Function&#xff09;是核心概念&#xff0c;它们决定了模型的优化方向。…

LabVIEW 天然气水合物电声联合探测

天然气水合物被认为是潜在的清洁能源&#xff0c;其储量丰富&#xff0c;预计将在未来能源格局中扮演重要角色。由于其独特的物理化学特性&#xff0c;天然气水合物的探测面临诸多挑战&#xff0c;涉及温度、压力、电学信号、声学信号等多个参数。传统的人工操作方式不仅效率低…

【记忆化搜索】最长递增子序列

文章目录 300. 最长递增子序列解题思路&#xff1a;递归 -> 记忆化搜索 300. 最长递增子序列 300. 最长递增子序列 ​ 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 ​ 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&am…

Tomcat的升级

一、为什么Tomcat需要升级 在生产环境中&#xff0c;我们都会指定对应的Tomcat版本进行安排配置&#xff0c;但是由于Tomcat厂商对于小版本的更新迭代会将一些Bug修复&#xff0c;这个时候在生产中出现问题/预防出现问题&#xff0c;可以通过小版本的升级解决前提&#xff1a;…

4-制作UI

创建模块文件夹 Unity编辑器->Tools->YIUI自动化工具&#xff0c;在新增模块名称那里输入模块名字并点击创建。便可看到在GameRes/YIUI文件夹下有新建的文件夹与内容了。里面包含图集、预制体、Sprites。如果进行预制体的修改&#xff0c;则需要双击进入再修改&#xff0…

vue3+element-plus中的el-table表头和el-table-column内容全部一行显示完整(hook函数)

hook函数封装 export const useTableColumnWidth _this > {const { refTable } _thisconst columnWidthObj ref()const getTableColumnWidth cb > {nextTick(() > {columnWidthObj.value {}// 获取行rowsconst tableEle refTable?.refBaseTable?.$elif (!tab…

DeepSeek 助力 Vue 开发:打造丝滑的开关切换(Switch)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

使用Python爬虫实时监控行业新闻案例

目录 背景环境准备请求网页数据解析网页数据定时任务综合代码使用代理IP提升稳定性运行截图与完整代码总结 在互联网时代&#xff0c;新闻的实时性和时效性变得尤为重要。很多行业、技术、商业等领域的新闻都可以为公司或者个人发展提供有价值的信息。如果你有一项需求是要实时…

语言大模型基础概念 一(先了解听说过的名词都是什么)

SFT&#xff08;监督微调&#xff09;和RLHF&#xff08;基于人类反馈的强化学习&#xff09;的区别 STF&#xff08;Supervised Fine-Tuning&#xff09;和RLHF&#xff08;Reinforcement Learning from Human Feedback&#xff09;是两种不同的模型训练方法&#xff0c;分别…

DeepSeek v3 技术报告阅读笔记

注 本文参考 DeepSeek-v3 / v2 / v1 Technical Report 及相关参考模型论文本文不包括基础的知识点讲解&#xff0c;为笔记/大纲性质而非教程&#xff0c;建议阅读技术报告原文交流可发送至邮箱 henryhua0721foxmail.com 架构核心 核心&#xff1a; MLA 高效推理DeepSeekMOE 更…

GESP2024年9月认证C++七级( 第三部分编程题(1)小杨寻宝)

参考程序&#xff1a; #include <bits/stdc.h> using namespace std; const int N 1e510; vector<int> g[N]; // 图的邻接表 int col[N], dep[N], has[N];// 深度优先遍历&#xff0c;计算每个节点的深度 void dfs(int x, int fa) {dep[x] dep[fa] 1; // 计算…

解锁电商数据宝藏:淘宝商品详情API实战指南

在电商蓬勃发展的今天&#xff0c;数据已成为驱动业务增长的核心引擎。对于商家、开发者以及数据分析师而言&#xff0c;获取精准、实时的商品数据至关重要。而淘宝&#xff0c;作为国内最大的电商平台&#xff0c;其海量商品数据更是蕴含着巨大的价值。 本文将带你深入探索淘…

webshell通信流量分析

环境安装 Apatche2 php sudo apt install apache2 -y sudo apt install php libapache2-mod-php php-mysql -y echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php sudo ufw allow Apache Full 如果成功访问info.php&#xff0c;则环境安…

在 rtthread中,rt_list_entry (rt_container_of) 已知结构体成员的地址,反推出结构体的首地址

rt_list_entry (rt_container_of)宏定义&#xff1a; /*** rt_container_of - return the start address of struct type, while ptr is the* member of struct type.*/ #define rt_container_of(ptr, type, member) \((type *)((char *)(ptr) - (unsigned long)(&((type *…

趣味魔法项目 LinuxPDF —— 在 PDF 中启动一个 Linux 操作系统

最近&#xff0c;一位开源爱好者开发了一个LinuxPDF 项目&#xff08;ading2210/linuxpdf: Linux running inside a PDF file via a RISC-V emulator&#xff09;&#xff0c;它的核心功能是在一个 PDF 文件中启动并运行 Linux 操作系统。它通过巧妙地使用 PDF 文件格式中的 Ja…