初学 POI 解析 Excel 时,总是写两种方法来分别处理 .xls 和 .xlsx 格式。方法调用前还要进行文件后缀的判断。
POI 提供了 HSSFWorkbook 和 XSSFWorkbook 两种实现,来分别处理 .xls 和 .xlsx 格式的 Excel 文件。解析时,可以根据判断 Excel 文件的后缀,来进行调用相应的解析方法。
此方法虽然可行,但代码却有些繁琐,不够简洁。POI 提供的 WorkbookFactory 类可以自动根据文件类型,来决定调用对应的 HSSFWorkbookFactory 或 XSSFWorkbookFactory 来处理文件。
大致解析流程和之前实现的解析代码基本相同,只有些许区别。具体代码如下:
1.引入 jar 包
org.apache.poi
poi-ooxml
4.0.1
引入 poi-ooxml 时,会自动引入其相关依赖(包括 poi,其用于解析 .xls)。
2.关键代码
2.1.具体解析实现
public static Listparser(InputStream inputStream) {
List list = new ArrayList();
Workbook workbook= null;try{
workbook=WorkbookFactory.create(inputStream);
Sheet sheet= workbook.getSheetAt(0);for(Row row : sheet) {if (row.getRowNum() == 0)continue;
String danci= row.getCell(0).getStringCellValue();
String duyin= row.getCell(0).getStringCellValue();
String yisi= row.getCell(0).getStringCellValue();
String liju= row.getCell(0).getStringCellValue();
Word word= newWord();
word.setDanci(danci);
word.setDuyin(duyin);
word.setYisi(yisi);
word.setLiju(liju);
list.add(word);
}
}catch(EncryptedDocumentException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}finally{try{if (workbook != null) {
workbook.close();
}
}catch(IOException e) {
e.printStackTrace();
}
}returnlist;
}
2.2.解析文件结构
2.2.1.实体Bean
public class Word {
private String danci;
private String duyin;
private String yisi;
private String liju;
// Getter and Setter ...
// toString()
}
2.2.2.Excel文件
2.3.Test测试
public static voidmain(String[] args) {
File fileXLS= new File("C:\\Book1.xls");
File fileXLSX= new File("C:\\Book1.xlsx");try{
InputStream inputStream= newFileInputStream(fileXLS);
List words =ExcelParser.parser(inputStream);
System.out.println(words.toString());
System.out.println("\n-----------------------------------------\n");
inputStream= newFileInputStream(fileXLSX);
words=ExcelParser.parser(inputStream);
System.out.println(words.toString());
}catch(FileNotFoundException e) {
e.printStackTrace();
}
}
2.4.结果
【注意点】
1.当获取单元格内容的时候,需要使用对应数据类型 getXxxCellValue() 方法,否则会报数据类型错误。
【关于疑问】
1.关于输入流的创建,创建一个 FileInputStream 后,用完是不是需要手动 close() ?