上一篇
Java中读取xlsx文件,可使用Apache POI库,通过FileInputStream加载文件,用XSSFWorkbook解析,再遍历Sheet、Row和Cell读取数据
Java中读取xlsx文件,通常使用Apache POI库来实现,以下是详细的步骤和示例代码:
添加依赖
如果你使用的是Maven项目,需要在pom.xml文件中添加Apache POI的依赖,以下是常用的依赖配置:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
如果不是Maven项目,可以手动下载poi-ooxml及其依赖的jar包,并添加到项目的类路径中。
编写读取xlsx文件的代码
以下是一个基本的Java程序,用于读取xlsx文件并打印其内容:
import org.apache.poi.ss.usermodel.;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class ReadXLSX {
public static void main(String[] args) {
String filePath = "path/to/your/excelFile.xlsx"; // 替换为你的xlsx文件路径
try (FileInputStream fis = new FileInputStream(new File(filePath));
Workbook workbook = new XSSFWorkbook(fis)) {
// 获取第一个工作表
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;
case BOOLEAN:
System.out.print(cell.getBooleanCellValue() + "t");
break;
case FORMULA:
System.out.print(cell.getCellFormula() + "t");
break;
default:
System.out.print("t");
break;
}
}
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
代码说明
- FileInputStream:用于读取xlsx文件。
- XSSFWorkbook:用于解析xlsx文件。
- Sheet:表示Excel中的一个工作表。
- Row:表示Excel中的一行。
- Cell:表示Excel中的一个单元格。
- cell.getCellType():用于获取单元格的类型,如字符串、数字、布尔值等。
- try-with-resources:确保文件流和工作簿在使用后自动关闭,避免资源泄露。
处理大文件
如果需要处理非常大的xlsx文件,可以使用Apache POI的SXSSFWorkbook类,它支持流式读取,减少内存占用,以下是一个简单的示例:
import org.apache.poi.ss.usermodel.;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class ReadLargeXLSX {
public static void main(String[] args) {
String filePath = "path/to/your/largeExcelFile.xlsx"; // 替换为你的大文件路径
try (FileInputStream fis = new FileInputStream(new File(filePath));
Workbook workbook = new SXSSFWorkbook(new XSSFWorkbook(fis), 100)) { // 100是缓存的行数
// 获取第一个工作表
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;
case BOOLEAN:
System.out.print(cell.getBooleanCellValue() + "t");
break;
case FORMULA:
System.out.print(cell.getCellFormula() + "t");
break;
default:
System.out.print("t");
break;
}
}
System.out.println();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
常见问题及解决方案
Q1:如何处理日期类型的单元格?
A1:对于日期类型的单元格,可以使用DateUtil.isCellDateFormatted(cell)来判断,然后使用cell.getDateCellValue()来获取日期值。
if (DateUtil.isCellDateFormatted(cell)) {
System.out.print(cell.getDateCellValue() + "t");
}
Q2:如何读取指定单元格的值?
A2:可以通过Row和Cell的getCell(int cellNum)方法来获取指定列的单元格。
Row row = sheet.getRow(0); // 获取第一行 Cell cell = row.getCell(0); // 获取第一列的单元格 System.out.print(cell.getStringCellValue
