Java 基于Apache POI实现Excel读写操作
实践环境
Win10
Java JDK1.8
代码实现
pom.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.shouke</groupId>
<artifactId>example</artifactId>
<version>1.0</version>
<properties>
<java.version>1.8</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<poi.ooxml.version>4.1.2</poi.ooxml.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.ooxml.version}</version>
</dependency>
<dependencies>
</project>
读取Excel
代码实现
exmple.xml

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.util.Iterator;
public class JavaStudy {
public static void readExcel(String filePath) throws Exception {
//获取文件流
FileInputStream inputStream = new FileInputStream(filePath);
//1.创建工作簿
Workbook workbook = new XSSFWorkbook(inputStream);
//2.得到Sheet表
// Sheet sheet = workbook.getSheet("Sheet1"); // 通过Sheet名称获取
Sheet sheet = workbook.getSheetAt(0); // 通过索引获取 //获取第1个Sheet表
//3.获取行
Row row = sheet.getRow(0); // 获取第1行 // 注意:行索引从0开始
System.out.println(sheet.getFirstRowNum()); // 获取首行(内容行)索引 // 输出:0
System.out.println(sheet.getLastRowNum()); // 获取最后行(内容行)索引 // 输出:5
//4.获取单元格
Cell cell = row.getCell(0); // 获取行的第0个元
//5.获取单元格的值
System.out.println(getValue(cell)); // 输出:姓名
System.out.println(row.getFirstCellNum()); // 获取当前行第一个内容单元格索引 // 输出:0
System.out.println(row.getLastCellNum()); // 获取当前行最后内容单元格往后下一个单元格的索引 // 输出:7 // 输出值为:最后内容单元格索引+1
// 遍历当前行内容化单元格
// 方法1:
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
cell = cellIterator.next();
System.out.println(cell);
}
// 方法2:
row.forEach(currCell -> {
System.out.print(currCell+", ");
System.out.println(currCell.getCellType());
});
// 遍历获取所有内容行单元格的值
for (int rowIndex=0; rowIndex<=sheet.getLastRowNum(); rowIndex++) {
row = sheet.getRow(rowIndex);
for(int colIndex=0; colIndex<row.getLastCellNum(); colIndex++) {
System.out.println(getValue(row.getCell(colIndex)));
}
}
inputStream.close();
}
public static Object getValue(Cell cell) {
//匹配类型数据
Object cellValue = null;
if (cell != null) { // 单元格未经过编辑的情况下,一定为null //cell为null的情况下,对空单元格调用API会导致上述for循环提前结束
CellType cellType = cell.getCellType(); // 获取单元格数值类型
switch (cellType) {
case STRING: //字符串
System.out.print("String类型:");
cellValue = cell.getStringCellValue();
break;
case BOOLEAN: //布尔类型
System.out.print("Boolean类型:");
cellValue = cell.getBooleanCellValue();
break;
case BLANK: //空
System.out.print("BLANK类型:"); // 填写值后,请清理掉值,从没填过值,那么cell=null,合并的单元格被当做一个单元格
break;
case NUMERIC: //数字(整数、小数、日期)
System.out.print("NUMERIC类型:");
if (DateUtil.isCellDateFormatted(cell)) { //日期
System.out.print("日期:");
cellValue = cell.getDateCellValue(); // cell.getDateCellValue() 返回Date类型数据
} else {
System.out.print("数字:");
cellValue = cell.getNumericCellValue();
System.out.println(1.0E50 == (Double) cellValue);
}
break;
case FORMULA:
System.out.print("公式类型:");
cellValue = cell.getCellFormula();
break;
case ERROR:
System.out.print("数据类型错误");
break;
}
} else {
System.out.println("cell为空");
}
return cellValue;
}
// 测试
public static void main(String[] args) {
try{
JavaStudy.readExcel("D:\\codePojects\\Study\\src\\main\\resource\\example.xlsx");
} catch (Exception e) {
}
}
}
补充说明
创建工作簿
POI创建工作簿的API有3种:
HSSFWorkbook: 此API用于操作Excel 2003及之前的版本(文件扩展名.xls),优点是导出速度快,缺点是导出的行数有局限性,最多为65535行,超出65536条后系统就会报错。对内存消耗比较大,容易造成内存溢出(OOM)。XSSFWorkbook: 此API用于操作Excel 2007及往后的版本(文件扩展名.xlsx),优点是导出的数据行数突破65535,最大可导出1048576行,缺点导出速度慢,对内存消耗比较大,容易造成内存溢出(OOM)。SXSSFWorkbook:POI3.8开始,新增此API,是XSSFWorkbookAPI的兼容流式扩展,主要解决当使用XSSFWorkbook方式导出大数据量时,内存溢出的问题,支持导出大量的数据。其原理就是使用硬盘空间代替内存:仅保存最新的数据行在内存里供查看,在此之前的数据行都会被写入到硬盘里(Windows电脑的话,是写入到C盘根目录下的temp文件夹)。被写入到硬盘里的数据行是不可见的/不可访问的。只有还保存在内存里的才可以被访问到。
以XSSFWorkbook API为例,可以通过多种方式来创建工作簿,常见用法如下:
//获取文件流
FileInputStream inputStream = new FileInputStream(excelFilePath);
//创建工作簿
Workbook workbook = new XSSFWorkbook(inputStream);
// 或者
//创建文件
File file = new File(excelFilePath);
Workbook workbook = new XSSFWorkbook(file);
// 或者
Workbook workbook = new XSSFWorkbook(excelFilePath);
获取单元格类型
CellType getCellType();
返回类型为CellType,在org.apache.poi.ss.usermodel.CellType中定义,它是一个枚举类型,源码如下:
public enum CellType {
@Internal(
since = "POI 3.15 beta 3"
)
_NONE(-1),
NUMERIC(0), // // 数字(整数、小数、日期)
STRING(1),
FORMULA(2), // 公式,即单元格内容通过公式计算出来
BLANK(3), // 为空//什么时候会存储空值,取决于所使用的表格软件
BOOLEAN(4),
ERROR(5);
写入Excel
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class JavaStudy {
public static void writeExcel(String filePath) throws IOException {
Workbook workbook = new XSSFWorkbook();
// Sheet sheet = workbook.createSheet();
Sheet sheet = workbook.createSheet("study"); // 创建Sheet时指定Sheet名词
Row row = sheet.createRow(0); // 创建第1行
Cell firstCell = row.createCell(0); // 创建第1个单元格
firstCell.setCellValue("hello"); // 设置单元格的值
Cell secondCell = row.createCell(1); // 创建第2个单元格
secondCell.setCellValue("shouke");
row = sheet.createRow(1); // 创建第2行
firstCell = row.createCell(0, CellType.STRING); // 设置单元格的值和类型
firstCell.setCellValue("你好");
secondCell = row.createCell(1, CellType.NUMERIC); // 创建第2个单元格
secondCell.setCellValue(2023);
FileOutputStream fileOutputStream = new FileOutputStream(filePath); // 如果文件已存在,则覆盖已有文件
workbook.write(fileOutputStream);
fileOutputStream.close();
workbook.close();
}
// 测试
public static void main(String[] args) {
try{
JavaStudy.writeExcel("D:\\codePojects\\Study\\src\\main\\resource\\result.xlsx");
} catch (Exception e) {
}
}
}
生成Excel文件内容如下:

Java 基于Apache POI实现Excel读写操作的更多相关文章
- Java使用Apache POI进行Excel导入和导出
Manve依赖 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --> <dependency> ...
- Apache POI:Excel读写库
1)Apache POI 简介 Apache POI是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写 ...
- Java中用Apache POI生成excel和word文档
概述: 近期在做项目的过程中遇到了excel的数据导出和word的图文表报告的导出功能.最后决定用Apache POI来完毕该项功能.本文就项目实现过程中的一些思路与代码与大家共享.同一时候.也作为自 ...
- java 通过Apache poi导出excel代码demo实例
package com.zuidaima.excel.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutput ...
- Java学习---Excel读写操作
1.1.1. 简介 Apache POI 使用Apache POI 完成Excel读写操作 Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API ...
- Java导出数据行写入到Excel表格:基于Apache POI
Java导出数据行写入到Excel表格:基于Apache POI import java.io.File; import java.io.FileOutputStream; import org.ap ...
- 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据
1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...
- Java开发小技巧(六):使用Apache POI读取Excel
前言 在数据仓库中,ETL最基础的步骤就是从数据源抽取所需的数据,这里所说的数据源并非仅仅是指数据库,还包括excel.csv.xml等各种类型的数据接口文件,而这些文件中的数据不一定是结构化存储的, ...
- Read / Write Excel file in Java using Apache POI
Read / Write Excel file in Java using Apache POI 2014-04-18 BY DINESH LEAVE A COMMENT About a year o ...
- NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))
NX二次开发API里没有对EXCAL读写操作的相关函数,市面上有很多种方法去实现,比如UFUN调KF,ODBC,OLE(COM组件)等等.这里我是用的OLE(COM组件)方式去做的,这种在VC上创建的 ...
随机推荐
- uniapp uni-number-box组件 步长为1,还能输入小数思路分享
正常情况,输入了步长为1,是无法在输入小数的.需求是要能输入一位小数,但如果直接步长设为0.1,又不能按1这样递增,输入数量上用起来肯定很麻烦. 于是我就想了一个折中方法,步长设为:1.01,然后值改 ...
- sqlerver 报错5120 无法为该请求检索数据 系统找不到指定路径
背景: 数据库mdf文件所在盘符F盘被删除了,也就是文件不存在了,sqlserver管理器打开就报错5120,并且正常路径的数据库也不显示出来. 要让正常的数据库显示出来,就需要删除掉已经没有的数据库 ...
- 研二学妹面试字节,竟倒在了ThreadLocal上,这是不要应届生还是不要女生啊?
一.写在开头 今天和一个之前研二的学妹聊天,聊及她上周面试字节的情况,着实感受到了Java后端现在找工作的压力啊,记得在18,19年的时候,研究生计算机专业的学生,背背八股文找个Java开发工 ...
- 记一次 .NET某企业数字化平台 崩溃分析
一:背景 1. 讲故事 前些天群里有一个朋友说他们软件会偶发崩溃,想分析看看是怎么回事,所幸的是自己会抓dump文件,有了dump就比较好分析了,接下来我们开始吧. 二:WinDbg 分析 1. 程序 ...
- 【WPF】 BasedOn的用法
BasedOn 用于样式的继承. 这里的已经继承了一个样式 此时,我们想在Resource中让他附加新的样式,但是这样不成功 修改如下: 去掉了之前的样式选择 我们使用BasedOn让其叠加样式
- 【终极指南】使用Python可视化分析文本情感倾向
本文分享自华为云社区<Python理解文本情感倾向的终极指南>,作者: 柠檬味拥抱. 情感分析是一种通过自然语言处理技术来识别.提取和量化文本中的情感倾向的方法.Python在这一领域有着 ...
- SpringBoot使用@Value获取不到值的问题
背景 在一次SpringBoot项目改造为Cloud的过程中,使用Nacos作为配置中心获取属性,改造后程序启动报错,查看日志,定位到代码: 解决方案 如果了解Bean的生命周期的同学应该知道,Spr ...
- 7.12考试总结(NOIP模拟12)[简单的区间·简单的玄学·简单的填数]
即使想放弃,也没法放弃最想要的东西,这就是人 前言 这次应该是和 SDFZ 一起打的第一场比赛吧. 然而我还是 FW 一个... 这次考试也有不少遗憾,主要的问题是码力不足,不敢去直面正解,思考程度不 ...
- 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
为什么会突然想到写这么一个大杂烩的博文呢,必须要从笔者几年前的一次面试说起 当时的我年轻气盛,在简历上放了自己的博客地址,而面试官应该是翻了我的博客,好几道面试题都是围绕着我的博文来提问 其中一个问题 ...
- Cage 字符串听课笔记
困困困! KMP 注意到 KMP 的复杂度是均摊的,那么是否可以绕开? 注意到 KMP 实际上一个串的 ACAM,那么考虑可以类似的,在加入一个字符的同时维护 ACAM(考虑 ACAM 的构建过程,前 ...