Apache POI—读写Office格式文件

Apache POI 是一个开源的 Java 库,用于读写 Microsoft Office 格式的文件,主要包括 Excel、Word 和 PowerPoint 等文档。POI 对 Excel 文件的支持最为完善,通过 POI 可以方便地进行 Excel 文件的创建、编辑、读取等操作。

1. Apache POI 简介

Apache POI(Poor Obfuscation Implementation)是专为 Java 提供的 Office 文档处理工具。它包含多个子组件:

  • HSSF(Horrible Spreadsheet Format):用于处理 Excel 97-2003(.xls)格式的文件。
  • XSSF(XML Spreadsheet Format):用于处理 Excel 2007+(.xlsx)格式的文件。
  • HWPF(Horrible Word Processor Format):用于处理 Word 97-2003(.doc)格式的文件。
  • XWPF:用于处理 Word 2007+(.docx)格式的文件。
  • HSLFXSLF:用于处理 PowerPoint 文件。
  • SXSSF(Streaming XSSF):基于 XSSF 的流式 API,适合处理超大数据量的 Excel 文件。

2. 引入 Apache POI 依赖

在 Maven 项目中添加 POI 的依赖,通常只需要引入 Excel 相关的 poi-ooxml 包。

<dependencies>
    <!-- POI 基础包 -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.16</version>
    </dependency>
</dependencies>

3. 基本使用方法

3.1 创建 Excel 文件

import org.apache.poi.ss.usermodel.*;           // 引入通用的 POI Excel 操作类
import org.apache.poi.xssf.usermodel.XSSFWorkbook; // 引入 XSSFWorkbook 类用于创建 .xlsx 格式的工作簿

import java.io.FileOutputStream;

public class ExcelWriter {

    public static void main(String[] args) {
        // 创建一个新的 Excel 工作簿,使用 XSSFWorkbook 创建 .xlsx 格式文件
        Workbook workbook = new XSSFWorkbook();

        // 创建一个名为 "Sheet1" 的工作表
        Sheet sheet = workbook.createSheet("Sheet1");

        // 在工作表中创建第一行 (索引为 0) 并在该行中创建一个单元格 (索引为 0)
        Row row = sheet.createRow(0);         // 创建第一行
        Cell cell = row.createCell(0);        // 在第一行创建第一个单元格

        // 向单元格中写入数据 "Hello, POI!"
        cell.setCellValue("Hello, POI!");     // 设置单元格的值

        // 将工作簿内容输出到指定文件 "example.xlsx" 中
        try (FileOutputStream fos = new FileOutputStream("example.xlsx")) {
            workbook.write(fos);              // 将工作簿写入文件输出流
        } catch (Exception e) {
            e.printStackTrace();              // 捕获并打印异常,避免写入失败时程序崩溃
        }

        // 关闭工作簿以释放资源
        try {
            workbook.close();                 // 关闭工作簿
        } catch (Exception e) {
            e.printStackTrace();              // 捕获并打印异常,避免资源未释放时程序崩溃
        }
    }
}

3.2 读取 Excel 文件

import org.apache.poi.ss.usermodel.*;          // 导入 POI 通用 Excel 操作类
import java.io.FileInputStream;

public class ExcelReader {

    public static void main(String[] args) {
        // 尝试打开文件输入流读取指定的 Excel 文件
        try (FileInputStream fis = new FileInputStream("example.xlsx");
             Workbook workbook = new XSSFWorkbook(fis)) {   // 使用 XSSFWorkbook 读取 .xlsx 文件格式的工作簿

            // 获取 Excel 文件中的第一个工作表,索引从 0 开始
            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:                        // 若单元格为数字类型
                            System.out.print(cell.getNumericCellValue() + "\t"); // 输出数值
                            break;
                        default:                             // 其他未知类型
                            System.out.print("未知数据类型\t"); // 输出未知类型提示
                            break;
                    }
                }
                System.out.println();                       // 每读取一行的数据后换行输出
            }
        } catch (Exception e) {
            e.printStackTrace();                            // 捕获并打印异常信息
        }
    }
}

4. 常用操作

4.1 设置单元格样式

// 创建单元格样式对象,用于设置单元格的样式
CellStyle style = workbook.createCellStyle();

// 创建字体对象,用于设置单元格字体的样式
Font font = workbook.createFont();
font.setBold(true);                     // 设置字体加粗
font.setFontHeightInPoints((short) 14); // 设置字体大小为 14 磅

// 将字体样式应用到单元格样式中
style.setFont(font);

// 将样式应用到指定的单元格
cell.setCellStyle(style);               // 设置单元格样式

4.2 合并单元格

import org.apache.poi.ss.util.CellRangeAddress;

sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 2)); // 合并第 0-1 行,第 0-2 列

4.3 写入日期数据

// 创建一个新的单元格用于存储日期数据,位于当前行的第 2 列(索引 1)
Cell dateCell = row.createCell(1);
dateCell.setCellValue(new Date()); // 设置当前日期作为单元格的值

// 创建单元格样式对象,用于设置日期格式
CellStyle dateStyle = workbook.createCellStyle();

// 设置日期格式为 "yyyy-MM-dd"
// 使用 workbook 的 CreationHelper 创建 DataFormat 对象,并应用自定义格式
dateStyle.setDataFormat(workbook.getCreationHelper().createDataFormat().getFormat("yyyy-MM-dd"));

// 将样式应用到日期单元格,使其显示为指定的日期格式
dateCell.setCellStyle(dateStyle);

4.4 公式计算

Cell formulaCell = row.createCell(2);
formulaCell.setCellFormula("SUM(A1:A10)"); // 设置单元格为求和公式

5. 处理大数据量 Excel 文件

当数据量较大时,SXSSF(Streaming Usermodel API) 是处理大文件的更佳选择。SXSSF 是基于 XSSF 的流式写入方式,适合数据量大的情况下避免内存溢出。

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

public class LargeExcelWriter {

    public static void main(String[] args) {
        Workbook workbook = new SXSSFWorkbook();
        Sheet sheet = workbook.createSheet("Large Data");

        for (int i = 0; i < 100000; i++) {
            Row row = sheet.createRow(i);
            for (int j = 0; j < 10; j++) {
                Cell cell = row.createCell(j);
                cell.setCellValue("Data " + i + "," + j);
            }
        }

        try (FileOutputStream fos = new FileOutputStream("large_data.xlsx")) {
            workbook.write(fos);
        } catch (Exception e) {
            e.printStackTrace();
        }

        ((SXSSFWorkbook) workbook).dispose(); // 清除临时文件,释放内存
    }
}

6. 总结

Apache POI 是处理 Excel 文件的强大工具,通过 POI 可以实现 Excel 的创建、读取、编辑、写入等操作。小数据量使用 XSSFWorkbook,大数据量使用 SXSSFWorkbook。掌握基本的单元格操作、样式设置、数据格式和公式应用,可以满足绝大多数的 Excel 操作需求。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTTPS 协议原理

一.HTTPS的定义 大家在刚开始学习的时候是不是也是非常好奇HTTP与HTTPS之间有什么区别和联系&#xff0c;两者都是应用层协议&#xff0c;而HTTPS是在HTTP的基础上引入了加密层&#xff0c;从而将HTTP的明文传输进行加密&#xff0c;保障数据的安全性 二.加密与解密 定义&#…

00 DSA-- 入门、实现动态数组、实现链表、栈和队列、环形数组、哈希表

两种代码模式 核心代码模式 核心代码模式&#xff1a;就是给你一个函数框架&#xff0c;你需要实现函数逻辑&#xff0c;这种模式一般称之为。 目前大部分刷题平台和技术面试/笔试场景都是核心代码模式。 比如力扣第一题两数之和&#xff0c;就是给出 twoSum 函数的框架如下…

【周末推荐】Windows无缝连接iPhone

关注“ONE生产力”&#xff0c;获取更多精彩推荐&#xff01; 又到了周末推荐时间了&#xff0c;今天我们介绍一个Windows内置的功能&#xff0c;能够帮助大家将自己的电脑和iPhone连接在一起。 很多用Windows的小伙伴羡慕macOS可以和iPhone无缝连接&#xff0c;轻松阅读和回…

AI驱动的图像文本提取【Llama 3.2-Vision】

本月初&#xff0c;我尝试了书籍封面识别&#xff0c;将 YOLOv10、EasyOCR 和 Llama 3 结合成一个无缝工作流程。结果如何&#xff1f;我自信地从书籍封面中提取标题和作者&#xff0c;就像这是我的新超能力一样。你可以在这篇文章中查看这一旅程&#xff1a;使用自定义 Yolov1…

着色器的认识

知识了解&#xff1a; 着色器&#xff1a; 顶点着色器: 用来描述顶点的特性,如位置、颜色等&#xff0c;其中&#xff0c;顶点&#xff1a;是指二维或三维空间中的一个点比如交点或者端点。 片元着色器&#xff1a;用来进行逐片元处理操作&#xff0c;比如光照、颜色叠加等&…

雷电模拟器ls内部操作adb官方方法

正常情况下&#xff0c;我们通过adb操作模拟器&#xff0c;如安装软件、运行shell命令等&#xff0c;但是用windows系统&#xff0c;adb就经常掉线&#xff0c;端口被占用&#xff0c;或者发现不到设备&#xff0c;对于调试或者自动化非常痛苦。就在雷电安装目录下&#xff0c;…

AI驱动的低代码未来:加速应用开发的智能解决方案

引言 随着数字化转型的浪潮席卷全球&#xff0c;企业对快速构建应用程序的需求愈发强烈。然而&#xff0c;传统的软件开发周期冗长、成本高昂&#xff0c;往往无法满足快速变化的市场需求。在此背景下&#xff0c;低代码平台逐渐成为开发者和企业的优选方案&#xff0c;以其“低…

python实战(四)——RAG预热实践

一、任务目标 为了清晰直观地展示RAG&#xff08;检索增强生成&#xff09;方法的有效性&#xff0c;我们手搓一套RAG的流程进行演示&#xff0c;作为后续LangChain等技术的预热。本文编程实践的目的是展示RAG的工作原理及流程&#xff08;科普为主&#xff09;&#xff0c;不过…

pycharm与anaconda下的pyside6的安装记录

一、打开anaconda虚拟环境的命令行窗口&#xff0c;pip install&#xff0c;加入清华源&#xff1a; pip install PySide6 -i https://pypi.tuna.tsinghua.edu.cn/simple 二、打开pycharm&#xff0c;在文件--设置--工具--外部工具中配置一下三项&#xff1a; 1、 QtDesigner…

MATLAB实现人类学习优化算法HLO

1.算法简介 人类学习优化算法&#xff08;Human Learning-based Optimization&#xff0c;HLO&#xff09;是一种基于人类学习过程开发的启发式算法。HLO算法的设计灵感来源于人类的智慧和经验&#xff0c;特别是人类在学习和调整过程中展现出的适应性、学习能力和创新思维。该…

ubuntu openmpi安装(超简单)

openmpi安装 apt update apt install openmpi-bin openmpi-common libopenmpi-dev安装到此完毕 测试一下&#xff0c;success !

车位识别系统项目设计

车位识别系统需求分析 1.概述 1.1问题描述 随着车辆保有量的不断增长&#xff0c;对车位中是否停有车辆进行检测的车位检测装置的需求不断增加。为了改善停车体验,建设停车引导系统非 常必要。而停车引导系统的核心,是需要检测哪些车位被占用,哪些空闲。 室内停车场因为施工…

2 columns passed, passed data had 4 columns

文章目录 一、问题复现二、原因分析 在使用Pandas等数据处理库时&#xff0c;我们经常需要将数据赋值给DataFrame。然而&#xff0c;有时候我们可能会遇到ValueError: 2 columns passed, passed data had 4 columns这个错误。这个错误表明你在构建一个 Pandas DataFrame 时&…

深度学习中one-hot 编码的正确理解

one-hot编码 是一种表示类别标签的方法。对于一个分类问题&#xff08;例如图像分割中的类别标签&#xff09;&#xff0c;one-hot编码会将一个类别标记转换为一个向量&#xff0c;这个向量中只有一个位置为1&#xff0c;其余位置为0。划重点&#xff1a;一个one hot 编码可以理…

vscode和pycharm在当前工作目录的不同|python获取当前文件目录和当前工作目录

问题背景 相信大家都遇到过一个问题&#xff1a;一个项目在vscode&#xff08;或pycharm&#xff09;明明可以正常运行&#xff0c;但当在pycharm&#xff08;或vscode&#xff09;中时&#xff0c;却经常会出现路径错误。起初&#xff0c;对于这个问题&#xff0c;我也是一知…

《操作系统真象还原》第3章 完善MBR【3.1 — 3.2】

目录 引用与说明 3.1、地址、section、vstart 浅尝辄止 1、什么是地址 2、什么是 section【汇编】 3、什么是 vstart【汇编】 3.2、CPU 的实模式 1、CPU 工作原理【重要】 2、实模式下的寄存器 4、实模式下 CPU 内存寻址方式 5、栈到底是什么玩意儿 6 ~ 8 无条件转移…

tiktok双旋转验证码识别,利用图像处理技术准确率达97

注意&#xff0c;本文只提供学习的思路&#xff0c;严禁违反法律以及破坏信息系统等行为 如有侵犯&#xff0c;请联系作者下架 该文章模型已经上线ocr识别网站&#xff0c;欢迎测试&#xff01;&#xff01;&#xff0c;地址&#xff1a;https://yxlocr.windy-rain.cn/ocr/othe…

TVM前端研究--Relay

文章目录 深度学习IR梳理1. IR属性2. DL前端发展3. DL编译器4. DL编程语言Relay的主要内容一、Expression in Relay1. Dataflow and Control Fragments2. 变量3. 函数3.1 闭包3.2 多态和类型关系3.3. Call4. 算子5. ADT Constructors6. Moudle和Global Function7. 常量和元组8.…

angular使用http实现get和post请求

说明&#xff1a; angular使用http实现get和post请求 提示&#xff1a;在运行本项目前&#xff0c;请先导入路由router&#xff0c;可以参考我上一篇文章。 效果图&#xff1a; step1:E:\projectgood\ajsix\untitled4\package.json “angular/cdk”: “^18.2.10”, “angula…

虚拟现实辅助工程技术助力航空航天高端制造业破局

在当今竞争激烈的航天产业环境中&#xff0c;高昂的研发成本、复杂的制造流程、繁重的维护任务以及对关键太空资产需求的不断升级&#xff0c;是航空航天高端制造业亟待破解的困境。在此背景下&#xff0c;虚拟现实辅助工程技术正以前所未有的速度渗透至各行各业&#xff0c;成…