思路:
-
先用inputstream获取excel文件的io流
-
然后创建一个内存中的excel文件XSSFWorkbook类型对象.这个对象表示了整个excel文件.
-
对这个excel文件的每页做循环处理
-
对每页中的每行做循环处理.
-
对每行中的每个单元格做处理,获取这个单元格的值.
-
把这行的结果添加到一个List数组中.
-
把每行的结果添加到最后的总结果中.
-
解析完以后就获取了一个ArrayList<LinkedHashMap<String,String>>类型的对象了.
具体代码:
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
/**
* Created by shin on 2017/9/20.
*/
public classReadExcel {
//读取Excel数据返回一个数组列表,每个成员是一个HashMap
publicArrayList> data (String path)throwsException {
//读入Excel文件
InputStream in =newFileInputStream(path);
//创建结果列表
ArrayList> list=newArrayList<>();
//读取数据
try{
//新建一个Excel工作簿对象
XSSFWorkbook wb =newXSSFWorkbook(in);
//循环每一个sheet
for(XSSFSheet sheet : wb) {
//如果sheet为空则跳过
if(sheet ==null)
continue;
//读取第一行作为key值
Row firstRow = sheet.getRow(0);
//得到第一行单元格个数
intcellNum = firstRow.getLastCellNum();
//创建一个String数组用来保存key值
String[] cellNames =newString[cellNum];
//将key值写入数组
for(inti =0; i < cellNum; i++) {
cellNames[i] = firstRow.getCell(i).getStringCellValue();
}
//循环每一行
for(introwNum =1; rowNum < sheet.getPhysicalNumberOfRows(); rowNum++) {
//新建一个resultHashMap用来保存每一行的结果
LinkedHashMap result =newLinkedHashMap<>();
//获取每一行
XSSFRow row = sheet.getRow(rowNum);
//获取每一行中的单元格
for(inti =0; i < cellNum; i++) {
//新建cell对象用来获取单元格内容
Cell cell = row.getCell(i);
String val ="";
//获取单元格内容
if(null!= cell) {
switch(cell.getCellType()) {
caseXSSFCell.CELL_TYPE_NUMERIC:
//日期格式转换
if(DateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
SimpleDateFormat format =newSimpleDateFormat("YYYY-MM-DD");
val = format.format(date).toString();
}else
val = cell.getNumericCellValue() +"";
break;
caseXSSFCell.CELL_TYPE_BOOLEAN:
val = cell.getBooleanCellValue() +"";
break;
caseXSSFCell.CELL_TYPE_BLANK:
val ="";
break;
caseXSSFCell.CELL_TYPE_STRING:
val = cell.getStringCellValue();
break;
}
}
//将每一行的值放入Map中
result.put(cellNames[i], val);
}
//将每一行的值放入list中
list.add(result);
}
}
}
catch(Exception e){
e.printStackTrace();
}
returnlist;
}
}
网友评论