**1.**概述
对于Microsoft Excel 文件,从不同单元格读取值可能有点棘手。Excel文件是按行和单元格组织的电子表格,其中可以包含String, Numeric, Date, Boolean, and even Formula值甚至公式值。Apache POI 是一个库,提供了一整套工具来处理不同的excel 文件和值类型。
在本教程中,我们将重点学习如何处理excel 文件、遍历行和单元格,以及使用正确的方法读取每个单元格值类型。
2. Maven 依赖
让我们首先将Apache POI 依赖项添加到pom.xml:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.0.0</version> </dependency>
可以在Maven Central 找到最新版本的[poi-ooxml](https://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.apache.poi%22%20AND%20a%3A%22poi-ooxml%22)
3. Apache POI 概述
层次结构从代表整个Excel 文件的工作簿开始。每个文件可以包含一个或多个工作表,它们是行和单元格的集合。根据Excel 文件的版本,HSSF 是代表旧Excel 文件的类的前缀( .xls),而XSSF 用于最新版本( .xlsx)。因此我们有:
XSSFWorkbook和HSSFWorkbook类代表Excel 工作簿Sheet界面代表Excel工作表Row接口代表行Cell界面代表细胞
3.1.处理Excel 文件
首先,我们打开要读取的文件并将其转换为FileInputStream以进行进一步处理。FileInputStream构造函数抛出一个java.io.FileNotFoundException所以我们需要将它包裹在一个try-catch 块中并在最后关闭流:
public static void readExcel(String filePath) {
File file = new File(filePath); try {
FileInputStream inputStream = new FileInputStream(file);
...
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}3.2.遍历Excel 文件
在我们成功打开InputStream,是时候创建XSSFWorkbook并遍历每个工作表的行和单元格了。在情况下,我们知道片的确切数量或特定片材的名称,我们可以使用getSheetAt(int index)和getSheet(String sheetName)的方法XSSFWorkbook,分别。
由于我们想要读取任何类型的Excel 文件,我们将使用三个嵌套的for 循环遍历所有工作表,一个用于工作表,一个用于每个工作表的行,最后一个用于每个工作表的单元格。
在本教程中,我们只会将数据打印到控制台:
FileInputStream inputStream = new FileInputStream(file);
Workbook baeuldungWorkBook = new XSSFWorkbook(inputStream); for (Sheet sheet : baeuldungWorkBook) {
...
}然后,为了遍历工作表的行,我们需要找到从工作表对像中获得的第一行和最后一行的索引:
int firstRow = sheet.getFirstRowNum(); int lastRow = sheet.getLastRowNum(); for (int index = firstRow + 1; index <= lastRow; index++) {
Row row = sheet.getRow(index);
}最后,我们对细胞做同样的事情。此外,在访问每个单元格时,我们可以选择传递一个MissingCellPolicy,它基本上告诉POI 当单元格值为空或null 时返回什么。MissingCellPolicy枚举包含三个枚举值:
RETURN_NULL_AND_BLANKRETURN_BLANK_AS_NULLCREATE_NULL_AS_BLANK;
单元格迭代的代码如下:
for (int cellIndex = row.getFirstCellNum(); cellIndex < row.getLastCellNum(); cellIndex++) {
Cell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
...
}3.3.在Excel 中读取单元格值
正如我们之前提到的,Microsoft Excel 的单元格可以包含不同的值类型,因此能够将一种单元格值类型与另一种区分开来并使用适当的方法提取值非常重要。下面是所有值类型的列表:
NONENUMERICSTRINGFORMULABLANKBOOLEANERROR
我们将关注四种主要的单元格值类型:Numeric, String, Boolean, and Formula,其中最后一个包含前三种类型的计算值。
让我们创建一个辅助方法,它基本上会检查每个值类型,并在此基础上使用适当的方法来访问值。也可以将单元格值视为字符串并使用相应的方法检索它。
有两件重要的事情值得注意。首先,Date值存储为Numeric值,而且如果单元格的值类型是FORMULA我们需要使用getCachedFormulaResultType()而不是getCellType()方法来检查公式的计算结果:
public static void printCellValue(Cell cell) {
CellType cellType = cell.getCellType().equals(CellType.FORMULA)
? cell.getCachedFormulaResultType() : cell.getCellType();
if (cellType.equals(CellType.STRING)) {
System.out.print(cell.getStringCellValue() + " | ");
}
if (cellType.equals(CellType.NUMERIC)) { if (DateUtil.isCellDateFormatted(cell)) {
System.out.print(cell.getDateCellValue() + " | ");
} else {
System.out.print(cell.getNumericCellValue() + " | ");
}
}
if (cellType.equals(CellType.BOOLEAN)) {
System.out.print(cell.getBooleanCellValue() + " | ");
}
}现在,我们需要做的就是printCellValue方法,我们就完成了。这是完整代码的片段:
... for (int cellIndex = row.getFirstCellNum(); cellIndex < row.getLastCellNum(); cellIndex++) {
Cell cell = row.getCell(cellIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
printCellValue(cell);
}
...4。结论
在本文中,我们展示了一个使用Apache POI 读取Excel 文件和访问不同单元格值的示例项目。
0 评论