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 操作需求。

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

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

相关文章

深入理解 SQL 中的 WITH AS 语法

在日常数据库操作中&#xff0c;SQL 语句的复杂性往往会影响到查询的可读性和维护性。为了解决这个问题&#xff0c;Oracle 提供了 WITH AS 语法&#xff0c;这一功能可以极大地简化复杂查询&#xff0c;提升代码的清晰度。本文将详细介绍 WITH AS 的基本用法、优势以及一些实际…

面对复杂的软件需求:5大关键策略!

面对软件需求来源和场景的复杂性&#xff0c;有效地管理和处理需求资料是确保项目成功的关键&#xff0c;能够提高需求理解的准确性&#xff0c;增强团队协作和沟通&#xff0c;降低项目风险&#xff0c;提高开发效率。反之&#xff0c;项目可能面临需求理解不准确、团队沟通不…

Lucas带你手撕机器学习——套索回归

好的&#xff0c;下面我将详细介绍套索回归的背景、理论基础、实现细节以及在实践中的应用&#xff0c;同时还会讨论其优缺点和一些常见问题。 套索回归&#xff08;Lasso Regression&#xff09; 1. 背景与动机 在机器学习和统计学中&#xff0c;模型的复杂性通常会影响其在…

从简单的demo开始让您逐步了解GetX的用法

目录 前言 一、从demo开始体现下Getx的用法 二、从最简单的功能开始 1.新建一个Flutter工程 2.GetX初体验 1.路由跳转 1.普通路由跳转 2.跳转并从堆栈中销毁当前页面 3.跳转并销毁之前所有页面 4.跳转以及传值 2.更方便的实现SnackBar、Dialog、BottomSheet 三、Ge…

项目文章 | 药学TOP期刊PRChIP-seq助力揭示激酶LIMK2促进梗死不良重构的机制

急性心肌梗死&#xff08;MI&#xff09;是全球死亡的主要原因&#xff0c;尽管MI的死亡率有所下降&#xff0c;缺血性心力衰竭的发病率却呈上升趋势。这一现象提示我们&#xff0c;尽管在急救和治疗急性心肌梗死方面取得了进展&#xff0c;但心脏在梗死后的长期功能恢复仍然是…

Prometheus新手必看:三步搞定基于文件、DNS和Consul的服务发现

一、基于文件的服务发现 基于文件的服务发现是仅仅略优于静态配置的服务发现方式&#xff0c;它不依赖于任何平台或第三方服务&#xff0c;因而也是最简单和通用的服务发现方式。Prometheus Server定期从文件中加载Target信息文件可使用JSON或YAML格式&#xff0c;它含有定义的…

opencv学习笔记(3):图像和视频的读取(C++)

我们知道&#xff0c;OpenCV是一个计算机视觉的开源库&#xff0c;它最基本也最重要的功能肯定是对图像和视频的处理。这个章节学习基本的图像和视频的读取。 1. 图像读取与保存&#xff1a; 1.1 图像读取&#xff1a; 在OpenCV中&#xff0c;使用cv::imread()函数来读取和加…

成品气楼参考图集有哪些?盘点5本实用图集,你都知道哪几本

成品气楼也被称为通风天窗、自然通风器、屋顶通风器&#xff0c;是帮助厂房、商业建筑体等建筑通风换气的大型设备&#xff0c;被广泛应用在各行各业。想要成品气楼的通风、采光、排烟作用得到充分发挥&#xff0c;需选型合理&#xff0c;配置合适&#xff0c;安装得当&#xf…

介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。(AI)

Docker是一种开源的容器化平台&#xff0c;可以将应用程序和其依赖项打包成一个独立的可运行的容器。Docker的基本概念包括以下几个方面&#xff1a; 1. 容器&#xff1a;容器是一个独立的、可运行的软件包&#xff0c;包含应用程序和其依赖项。容器化可以将应用程序与底层操作…

v4.7+版本用户充值在交易统计中计算双倍的问题修复

app/services/statistic/TradeStatisticServices.php 文件中 $whereInRecharge[recharge_type] no_system; $whereInRecharge[recharge_type] system; app/model/user/UserRecharge.php 中 修改此搜索器内容 public function searchRechargeTypeAttr($query, $value){ if…

二百七十一、Kettle——ClickHouse增量导入数据清洗记录表

一、目的 在完成错误数据表任务后&#xff0c;需要对每条错误数据的错误字段及其字段值进行分析 Hive中原有SQL语句和ClickHouse现有SQL语句很大不同 二、Hive中原有代码 2.1 表结构 --31、静态排队数据清洗记录表 create table if not exists hurys_db.dwd_data_clean_…

python编程-装饰器

目录 一、装饰器的概念 装饰器与设计模式的关联 二、装饰器的基本结构和语法 1. 函数装饰器 定义装饰器函数&#xff1a; 应用装饰器到函数&#xff1a; 方式一&#xff1a;使用符号&#xff08;语法糖&#xff09; 方式二&#xff1a;手动调用装饰器函数 函数装饰器的…

vue3+ts实时播放视频,视频分屏

使用vue3以及播放视频组件Jessibuca Jessibuca地址 使用循环个数来实现分屏 效果图&#xff0c;四屏 九屏 dom代码 <div class"icon"><div class"icon-box"><span class"text">分屏&#xff1a;</span><el-icon …

银行信贷风控专题:Python、R 语言机器学习数据挖掘应用实例合集:xgboost、决策树、随机森林、贝叶斯等

全文链接&#xff1a;https://tecdat.cn/?p38026 原文出处&#xff1a;拓端数据部落公众号 分析师&#xff1a;Fanghui Shao 在当今金融领域&#xff0c;风险管控至关重要。无论是汽车贷款违约预测、银行挖掘潜在贷款客户&#xff0c;还是信贷风控模型的构建&#xff0c;以及…

NF和C-BRUNO的区别

C-BRUNO与标准化流&#xff08;Normalizing Flow&#xff09;模型有一定的相似性&#xff0c;但它们在目标、应用和实现细节上存在明显的区别。以下是两者之间的主要区别&#xff1a; 1. 目标和应用领域 标准化流模型&#xff1a;标准化流的目标是通过一系列可逆变换将复杂的…

解决ElasticSearch启动成功却无法在浏览器访问问题

目录 前言&#xff1a; 问题复现 &#xff1a; 解决问题&#xff1a; 1、修改sysctl.conf文件 2、在sysctl.conf文件增加这段东西 3、 然后保存退出&#xff0c;输入以下命令使其生效 结语&#xff1a; 前言&#xff1a; 这篇文章是小白我今天突然启动es&#xff0c;发现e…

【华为HCIP实战课程二十五】中间到中间系统协议IS-IS配置实战续系统ID区域ID,网络工程师

上章简单讲解了ISIS基本配置,本章继续详细讲解ISIS配置及实施 IS-IS配置拓扑 1、R1进行配置IS-IS [R1]display current-configuration configuration isis isis 1 network-entity 49.0124.1111.1111.1111.00 //配置NET地址,由三部分组成,区域ID、系统ID和固定的SEL 00 i…

微服务之网关、网关路由、网关登录校验

简介&#xff1a;来源&#xff1a;SpringCloud微服务开发与实战&#xff0c;java黑马商城项目微服务实战开发&#xff08;涵盖MybatisPlus、Docker、MQ、ES、Redis高级等&#xff09; 认识网关 前端请求不能直接访问微服务&#xff0c;而是要请求网关&#xff1a; 网关可以做…

pytest执行用例时从conftest.py抛出ModuleNotFoundError:No module named ‘XXX‘异常的解决办法

问题描述 本地运行正常&#xff0c;集成到Jenkins后使用执行 Windows 批处理命令运行测试用例时报错&#xff1a; D:\PycharmProject\ZeppAndroid>pytest -vs testcase\test_login.py --alluredirreport/allure_json --clean-alluredir ImportError while loading conft…

手机收银云进销存管理软件,商品档案Excel格式批量导入导出,一键导入Excel的商品档案

如果您有Excel的商品档案&#xff0c;那么就可以批量导入到我们的手机云进销存软件系统里&#xff0c;就不需要人工手工一个个商品的新建商品档案&#xff0c;大大提高工作效率。如果您看下面的步骤不会操作&#xff0c;可以联系我们技术支持&#xff0c;来帮您把商品档案导入。…