非常好用的POI处理Excel方法。
/**
*
* @Title: readXls
* @Description: 处理xls文件
* @param @param
* path
* @param @return
* @param @throws
* Exception 设定文件
* @return List<List<String>> 返回类型
* @throws
*
* 从代码不难发现其处理逻辑:
* 1.先用InputStream获取excel文件的io流
* 2.然后穿件一个内存中的excel文件HSSFWorkbook类型对象,这个对象表示了整个excel文件。
* 3.对这个excel文件的每页做循环处理 4.对每页中每行做循环处理 5.对每行中的每个单元格做处理,获取这个单元格的值
* 6.把这行的结果添加到一个List数组中 7.把每行的结果添加到最后的总结果中
* 8.解析完以后就获取了一个List<List<String>>类型的对象了
*
*/
private List<List<String>> readXls(String path) throws Exception {
InputStream is = new FileInputStream(path);
// HSSFWorkbook 标识整个excel
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
List<List<String>> result = new ArrayList<List<String>>();
int size = hssfWorkbook.getNumberOfSheets();
// 循环每一页,并处理当前循环页
for (int numSheet = 0; numSheet < size; numSheet++) {
// HSSFSheet 标识某一页
HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if (hssfSheet == null) {
continue;
}
// 处理当前页,循环读取每一行
for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
// HSSFRow表示行
HSSFRow hssfRow = hssfSheet.getRow(rowNum);
int minColIx = hssfRow.getFirstCellNum();
int maxColIx = hssfRow.getLastCellNum();
List<String> rowList = new ArrayList<String>();
// 遍历该行,获取处理每个cell元素
for (int colIx = minColIx; colIx < maxColIx; colIx++) {
// HSSFCell 表示单元格
HSSFCell cell = hssfRow.getCell(colIx);
if (cell == null) {
continue;
}
rowList.add(getStringVal(cell));
}
result.add(rowList);
}
}
return result;
}
/**
* 其实有时候我们希望得到的数据就是excel中的数据,可是最后发现结果不理想
* 如果你的excel中的数据是数字,你会发现Java中对应的变成了科学计数法。
* 所以在获取值的时候就要做一些特殊处理来保证得到自己想要的结果
* 网上的做法是对于数值型的数据格式化,获取自己想要的结果。
* 下面提供另外一种方法,在此之前,我们先看一下poi中对于toString()方法:
*
* 该方法是poi的方法,从源码中我们可以发现,该处理流程是:
* 1.获取单元格的类型
* 2.根据类型格式化数据并输出。这样就产生了很多不是我们想要的
* 故对这个方法做一个改造。
* 改造poi默认的toString()方法如下
* @Title: getStringVal
* @Description: 1.对于不熟悉的类型,或者为空则返回""控制串
* 2.如果是数字,则修改单元格类型为String,然后返回String,这样就保证数字不被格式化了
* @param @param cell
* @param @return 设定文件
* @return String 返回类型
* @throws
*/
public static String getStringVal(HSSFCell cell) {
switch (cell.getCellType()) {
case BOOLEAN:
return cell.getBooleanCellValue() ? "TRUE" : "FALSE";
case FORMULA:
return cell.getCellFormula();
case NUMERIC:
cell.setCellType(STRING);
return cell.getStringCellValue();
case STRING:
return cell.getStringCellValue();
default:
return "";
}
}