Function<T,R> T是参数,R是返回值,可以作为参数传递到方法中
/**
* excel 解析工具
*/
@Slf4j
public class ExcelUtils {
private List getWorkBook(String filePath, Function<Workbook, List> function) throws IOException {
Workbook workbook;
String ext = filePath.substring(filePath.lastIndexOf(".") + 1).toLowerCase();
try (InputStream inputStream = new FileInputStream(filePath)) {
if (ext.equals("xls")) {
workbook = new HSSFWorkbook(inputStream);
} else {
workbook = new XSSFWorkbook(inputStream);
}
return function.apply(workbook);
} catch (IOException e) {
throw e;
}
}
/**
* 获取sheet
*
* @param filePath
* @return
* @throws IOException
*/
public List<String> getSheets(String filePath) throws IOException {
List<String> listSheet = getWorkBook(filePath, (w) -> {
List list = new ArrayList<>();
for (int i = 0; i < w.getNumberOfSheets(); i++) {
list.add(w.getSheetName(i));
}
return list;
});
return listSheet;
}
/**
* 获取sheet中的行,未经解析
*
* @param filePath
* @param sheetName
*/
public List<List<Object>> getRows(String filePath, String sheetName,int beginRow) throws IOException {
List<List<Object>> listRows = getWorkBook(filePath, (w) -> {
Sheet sheet = w.getSheet(sheetName);
List list = new ArrayList();
DataFormatter dataFormatter = new DataFormatter();
for (int i = beginRow; i <= sheet.getLastRowNum(); i++) {
Row row = sheet.getRow(i);
if(row!=null) {
List<Object> data = new ArrayList<>();
for (int j = 0; j < row.getPhysicalNumberOfCells(); j++) {
Cell cell = row.getCell(j);
if (cell != null) {
if (isDateCell(cell)) {
// 用于转化为日期格式
Date d = cell.getDateCellValue();
if (d != null) {
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
data.add(formater.format(d));
}
} else {
try {
switch (cell.getCellType()) {
case _NONE:
case BLANK:
case ERROR:
case FORMULA:
data.add(null);
break;
case BOOLEAN:
data.add(cell.getBooleanCellValue());
break;
case NUMERIC:
data.add(dataFormatter.formatCellValue(cell));
break;
case STRING:
data.add(cell.getStringCellValue().trim());
break;
}
} catch (Exception e) {
data.add(null);
}
}
} else {
data.add(null);
}
}
if (isEmptyRow(data)) {
break;
} else {
list.add(data);
}
}
}
return list;
});
return listRows;
}
/**
* 是否是日期类型字段
* @param currentCell
* @return
*/
private boolean isDateCell(Cell currentCell) {
if ("yyyy/mm;@".equals(currentCell.getCellStyle().getDataFormatString())
|| "m/d/yy".equals(currentCell.getCellStyle().getDataFormatString())
|| "yy/m/d".equals(currentCell.getCellStyle().getDataFormatString())
|| "mm/dd/yy".equals(currentCell.getCellStyle().getDataFormatString())
|| "dd-mmm-yy".equals(currentCell.getCellStyle().getDataFormatString())
|| "yyyy/m/d".equals(currentCell.getCellStyle().getDataFormatString())) {
if (DateUtil.isCellDateFormatted(currentCell)) {
return true;
}
}
return false;
}
/**
* 是否空行
* @param list
* @return
*/
private boolean isEmptyRow(List<Object> list){
for (Object o : list) {
if(o!=null){
return false;
}
}
return true;
}
/**
* 将电子表内容转换成map,要求参数列表第一个是列名集合
* @param list
* @return
*/
public List<Map<String,Object>> dataToMap(List<List<Object>> list){
List<String> cols = list.get(0).stream().map(f->f.toString()).collect(Collectors.toList());
List result = new ArrayList();
for (int i = 1; i < list.size(); i++) {
List<Object> row = list.get(i);
Map<String,Object> map = new HashMap<>();
for (int i1 = 0; i1 < row.size(); i1++) {
map.put(cols.get(i1),row.get(i1));
}
result.add(map);
}
return result;
}