1. 准备工作
1.1 在项目中引入Apache POI相关类库
引入 Apache POI 和 Apache POI-OOXML 这两个类库,Maven坐标如下:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
2. 读取或写入Excel数据
2.1 示例程序结构说明
简单说明一下示例程序的整体结构:
ExcelReader.java
是实现读取Excel数据功能的类;ExcelWriter.java
是创建新的Excel并向其中写入数据的类;ExcelDataVO.java
封装了读取或写入时每一“行”的数据;MainTest.java
是示例程序的入口类,其中演示了读取和写入Excel数据的整个过程;
2.2 读取数据
示例程序需要从桌面读取 readExample.xlsx 内的数据,readExample.xlsx 的内容如下:
读取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<ExcelDataVO> readExcel(String fileName) {
Workbook workbook = null;
FileInputStream inputStream = null;
try {
// 获取Excel后缀名
String fileType = fileName.substring(fileName.lastIndexOf(".&