做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求;
网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃,这里基于最新的Apache POI 4.0.1版本来总结一下整个读取和写入Excel的过程,希望能帮助到需要的人 _
1. 准备工作
1.1 在项目中引入Apache POI相关类库
引入 Apache POI 和 Apache POI-OOXML 这两个类库,Maven坐标如下:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
2. 读取或写入Excel数据
##2.1 示例程序结构说明
简单说明一下示例程序的整体结构:
ExcelReader.java是实现读取Excel数据功能的类;
ExcelWriter.java是创建新的Excel并向其中写入数据的类;
ExcelDataVO.java封装了读取或写入时每一“行”的数据;
MainTest.java是示例程序的入口类,其中演示了读取和写入Excel数据的整个过程;
2.2 读取数据
示例程序需要从桌面读取 readExample.xlsx 内的数据,readExample.xlsx 的内容如下:
读取示例图
姓名 | 年龄 | 居住城市 | 职业 |
---|---|---|---|
张三 | 20 | 北京 | 技术 |
李四 | 21 | 上海 | 产品 |
王五 | 22 | 成都 | 运营 |
读取Excel时主要调用ExcelReader.java类来读取和解析Excel的具体内容,这里以读取系统文件的形式演示读取过程:(兼容 xls 和 xlsx)
2.2.1 主程序入口类代码:
/**
* Author: Dreamer-1
* Date: 2019-03-01
* Time: 10:13
* Description: 示例程序入口类
*/
public class MainTest {
public static void main(String[] args) {
// 设定Excel文件所在路径
String excelFileName = "/Users/Dreamer-1/Desktop/myBlog/java解析Excel/readExample.xlsx";
// 读取Excel文件内容
List<ExcelDataVO> readResult = ExcelReader.readExcel(excelFileName);
// todo 进行业务操作
}
}
读取和写入时封装每一“行”数据的ExcelDataVO.java代码如下:
/**
* Author: Dreamer-1
* Date: 2019-03-01
* Time: 11:33
* Description: 读取Excel时,封装读取的每一行的数据
*/
public class ExcelDataVO {
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private Integer age;
/**
* 居住地
*/
private String location;
/**
* 职业
*/
private String job;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
}
2.2.2 Excel解析类的代码:
/**
* Author: Dreamer-1
* Date: 2019-03-01
* Time: 10:21
* Description: 读取Excel内容
*/
public class ExcelReader {
private static Logger logger = Logger.getLogger(ExcelReader.class.getName()); // 日志打印类
private static final String XLS = "xls";
private static final String XLSX = "xlsx";
/**
* 根据文件后缀名类型获取对应的工作簿对象
* @param inputStream 读取文件的输入流
* @param fileType 文件后缀名类型(xls或xlsx)
* @return 包含文件数据的工作簿对象
* @throws IOException
*/
public static Workbook getWorkbook(InputStream inputStream, String fileType) throws IOException {
Workbook workbook = null;
if (fileType.equalsIgnoreCase(XLS)) {
workbook = new HSSFWorkbook(inputStream);
} else if (fileType.equalsIgnoreCase(XLSX)) {
workbook = new XSSFWorkbook(inputStream);
}
return workbook;
}
/**
* 读取Excel文件内容
* @param fileName 要读取的Excel文件所在路径
* @return 读取结果列表,读取失败时返回null
*/
public static List<ExcelData