文件IO是任何软件进行的重要组成部分,我们在电脑上创建一个Excel文件,然后打开它修改一些东西或者删除它。Java给我们提供了操纵文件的很多工具类,本文主要是使用POI操纵Excel文件。
<!--POI 包-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.versin}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.versin}</version>
</dependency>
可以使用WorkbookFactory
自动根据Excel类型是XLSX还是XLS自动创建对应的Workbook
File file = new File(filePath + File.separator + fileName);
FileInputStream inputStream = new FileInputStream(file);
// 使用工厂模式 根据文件扩展名 创建对应的Workbook
Workbook workbook = WorkbookFactory.create(inputStream);
根据 sheet 页的名字获取 sheet 页数据
Sheet sheet = workbook.getSheet(sheetName);
Sheet 类提供了获取首行行号和最后一行行号的方法,可以根据这两个方法获取 sheet 页中的数据行数。
int rowCount = sheet.getLastRowNum() - sheet.getFirstRowNum();
如果只需要返回Map数据,到这里就可以返回结果
for (int i = 1; i < rowCount + 1; i++) {
Row row = sheet.getRow(i);
resultMap = new HashMap<>();
for (int j = 0; j < row.getLastCellNum(); j++) {
if(Objects.equals(row.getCell(j).getCellType(), CellType.STRING)) {
resultMap.put(sheet.getRow(0).getCell(j).toString(), row.getCell(j).getStringCellValue());
} else if(Objects.equals(row.getCell(j).getCellType(), CellType.NUMERIC)) {
resultMap.put(sheet.getRow(0).getCell(j).toString(), row.getCell(j).getNumericCellValue());
}else {
resultMap.put(sheet.getRow(0).getCell(j).toString(), row.getCell(j));
}
}
jsonObject = new JSONObject(resultMap);
resultMapList.add(jsonObject.toJSONString());
}
使用 fasterxml.jackson
将Map结果数据转成 List 对象
return JsonUtil.ofList(resultMapList.toString(), tClass);
/**
* 获取Excel,将数据转换成 List<T> 的形式
* Excel 数据要求第一行为对象的属性名称
*
* @param filePath 文件路径
* @param fileName 文件名称
* @param sheetName sheet名称
* @param tClass 要转换成的实体类
* @param <T>
* @return List对象数组
* @throws IOException
*/
public static <T> List<T> readExcelOfList(String filePath, String fileName, String sheetName, Class<T> tClass) throws IOException {
List<String> resultMapList = new ArrayList<>();
File file = new File(filePath + File.separator + fileName);
FileInputStream inputStream = new FileInputStream(file);
// 使用工厂模式 根据文件扩展名 创建对应的Workbook
Workbook workbook = WorkbookFactory.create(inputStream);
Sheet sheet = workbook.getSheet(sheetName);
int rowCount = sheet.getLastRowNum() - sheet.getFirstRowNum();
JSONObject jsonObject;
Map<String, Object> resultMap;
for (int i = 1; i < rowCount + 1; i++) {
Row row = sheet.getRow(i);
resultMap = new HashMap<>();
for (int j = 0; j < row.getLastCellNum(); j++) {
if(Objects.equals(row.getCell(j).getCellType(), CellType.STRING)) {
resultMap.put(sheet.getRow(0).getCell(j).toString(), row.getCell(j).getStringCellValue());
} else if(Objects.equals(row.getCell(j).getCellType(), CellType.NUMERIC)) {
resultMap.put(sheet.getRow(0).getCell(j).toString(), row.getCell(j).getNumericCellValue());
}else {
resultMap.put(sheet.getRow(0).getCell(j).toString(), row.getCell(j));
}
}
jsonObject = new JSONObject(resultMap);
resultMapList.add(jsonObject.toJSONString());
}
return JsonUtil.ofList(resultMapList.toString(), tClass);
}