1 需要的依赖包
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
2 解析方法
/*
* 根据excel文件格式获知excel版本信息
*/
private fun getWorkbook(fs: InputStream, str: String): Workbook? {
var book: Workbook? = null
try {
if ("xls" == str) {
// 2003
book = HSSFWorkbook(fs)
} else {
// 2007以上
book = XSSFWorkbook(fs)
}
} catch (e: Exception) {
e.printStackTrace()
}
return book
}
private fun getExcelContent(workbook: Workbook?, result: MutableMap<String, Any>): ArrayList<ExcelInfo> {
// 获取工作薄第一张表
val sheet = workbook!!.getSheetAt(0)
// 获取第一行
var row: Row? = sheet.getRow(0)
// 获取有效单元格数
val cellNum = row!!.physicalNumberOfCells
// 表头集合
val headList = ArrayList<String>()
for (i in 0 until cellNum) {
val cell = row.getCell(i)
val data = cell.stringCellValue
headList.add(data)
}
// 获得有效行数
val rowNum = sheet.getPhysicalNumberOfRows()
result.put("sum", rowNum - 1)
val dataList = ArrayList<ExcelInfo>()
val rowIterator = sheet.rowIterator()
//去掉头部数据
rowIterator.next()
var data: ExcelInfo? = null
for (i in 1 until rowNum) {
//row = sheet.getRow(i);//如果有空行,Workbook读取excel数据为null
row = rowIterator.next()
if (row != null) {
data = ExcelInfo()
for (j in headList.indices) {
// 解析单元格
val cellData = getCellFormatValue(row!!.getCell(j)).toString()
// 根据字段给字段设值
saveCellDataToBean(headList, data, j, cellData)
}
dataList.add(data)
}
}
return dataList
}
3 碰到的问题
row = sheet.getRow(i);//如果有空行,Workbook读取excel数据为null
如果excel中有空行,通过sheet.getPhysicalNumberOfRows()方法可以获取到空行后的数据,但是如果使用sheet.getRow方法获取该行的数据时,空行后面的行数据为空。。。有人说是XSSFWorkbook这个类的问题,打断点明明看到有数据,但就是获取的时候为空,所以这里换了一种方法来获取数据。
val rowIterator = sheet.rowIterator()
数据是放在TreeMap里的,这里拿到它的迭代对象,通过next方法来获取数据。