博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java解析Excel之POI(二):解决 xls 和 xlsx 两种格式解析时的差异统一处理
阅读量:5264 次
发布时间:2019-06-14

本文共 2703 字,大约阅读时间需要 9 分钟。

初学 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 List
parser(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);        List
words = 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() ?

转载于:https://www.cnblogs.com/cn9087/p/10304958.html

你可能感兴趣的文章
linux下WPS的使用
查看>>
Web Api 利用 cors 实现跨域
查看>>
hdu 3938 并查集
查看>>
instanceof
查看>>
《深入分析Java Web技术内幕》读书笔记之JVM内存管理
查看>>
python之GIL release (I/O open(file) socket time.sleep)
查看>>
2015/8/4 告别飞思卡尔,抛下包袱上路
查看>>
软件开发与模型
查看>>
161017、SQL必备知识点
查看>>
kill新号专题
查看>>
MVC学习系列——Model验证扩展
查看>>
C# GC 垃圾回收机制
查看>>
mysqladmin 修改和 初始化密码
查看>>
字符串
查看>>
vue2.x directive - 限制input只能输入正整数
查看>>
实现MyLinkedList类深入理解LinkedList
查看>>
自定义返回模型
查看>>
C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 客户端多网络支持
查看>>
HDU 4122
查看>>
Suite3.4.7和Keil u3自带fx2.h、fx2regs.h文件的异同
查看>>