初学 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 = new Word(); 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(); } } return list;}
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 void main(String[] args) { File fileXLS = new File("C:\\Book1.xls"); File fileXLSX = new File("C:\\Book1.xlsx"); try { InputStream inputStream = new FileInputStream(fileXLS); Listwords = ExcelParser.parser(inputStream); System.out.println(words.toString()); System.out.println("\n-----------------------------------------\n"); inputStream = new FileInputStream(fileXLSX); words = ExcelParser.parser(inputStream); System.out.println(words.toString()); } catch (FileNotFoundException e) { e.printStackTrace(); }}
2.4.结果
【注意点】
1.当获取单元格内容的时候,需要使用对应数据类型 getXxxCellValue() 方法,否则会报数据类型错误。
【关于疑问】
1.关于输入流的创建,创建一个 FileInputStream 后,用完是不是需要手动 close() ?