package com.mzl.flower.utils; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.util.LocaleUtil; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.web.multipart.MultipartFile; import java.io.*; import java.text.SimpleDateFormat; import java.util.*; /** * excel读写工具类 */ public class POIUtil { private final static String xls = "xls"; private final static String xlsx = "xlsx"; public static SheetContent readExcel(MultipartFile file, int sheetNum) throws IOException{ //检查文件 checkFile(file); //获得Workbook工作薄对象 Workbook workbook = getWorkBook(file); return readExcel(workbook, sheetNum); } public static SheetContent readExcel(File file, int sheetNum) throws IOException{ Workbook workbook = getWorkBook(file); return readExcel(workbook, sheetNum); } public static SheetContent readExcel(InputStream is, String fileName, int sheetNum) throws IOException{ Workbook workbook = getWorkBook(is, fileName); return readExcel(workbook, sheetNum); } public static SheetContent readExcel(Workbook workbook, int sheetNum) throws IOException{ SheetContent sheetContent = null; //获得当前sheet工作表 Sheet sheet = workbook.getSheetAt(sheetNum); if(sheet == null){ return sheetContent; } String sheetName = sheet.getSheetName(); List list = new ArrayList<>(); //获得当前sheet的开始行 int firstRowNum = sheet.getFirstRowNum(); //获得当前sheet的结束行 int lastRowNum = sheet.getLastRowNum(); //循环除了第一行的所有行 for(int rowNum = firstRowNum; rowNum <= lastRowNum; rowNum++){ //获得当前行 Row row = sheet.getRow(rowNum); if(row == null){ continue; } //获得当前行的开始列 int firstCellNum = row.getFirstCellNum(); if(firstCellNum == -1){ list.add(new String[0]); continue; } //获得当前行的列数 int lastCellNum = row.getPhysicalNumberOfCells(); String[] cells = new String[row.getPhysicalNumberOfCells()]; //循环当前行 for(int cellNum = firstCellNum; cellNum < lastCellNum;cellNum++){ Cell cell = row.getCell(cellNum); cells[cellNum] = getCellValue(cell); } list.add(cells); } sheetContent = new SheetContent(sheetName, list); return sheetContent; } public static List readExcel(Workbook workbook) throws IOException{ //创建返回对象,把每行中的值作为一个数组,所有行作为一个集合返回 List list = new ArrayList<>(); if(workbook != null){ for(int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++){ list.add(readExcel(workbook, sheetNum)); } } return list; } public static void checkFile(MultipartFile file) throws IOException{ //判断文件是否存在 if(null == file){ throw new FileNotFoundException("文件不存在!"); } //获得文件名 String fileName = file.getOriginalFilename(); //判断文件是否是excel文件 if(!fileName.endsWith(xls) && !fileName.endsWith(xlsx)){ throw new IOException(fileName + "不是excel文件"); } } public static Workbook getWorkBook(MultipartFile file) { //获得文件名 String fileName = file.getOriginalFilename(); //创建Workbook工作薄对象,表示整个excel Workbook workbook = null; try { workbook = getWorkBook(file.getInputStream(), fileName); } catch (IOException e) { } return workbook; } public static Workbook getXSSFWorkbook(InputStream is) throws IOException { return new XSSFWorkbook(is); } public static Workbook getHSSFWorkbook(InputStream is) throws IOException { return new HSSFWorkbook(is); } public static Workbook getWorkBook(File file) { String fileName = file.getName(); //创建Workbook工作薄对象,表示整个excel Workbook workbook = null; try { workbook = getWorkBook(new FileInputStream(file), fileName); } catch (IOException e) { } return workbook; } public static Workbook getWorkBook(InputStream is, String fileName) { Workbook workbook = null; try { //根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象 if(fileName.endsWith(xls)){ //2003 workbook = getHSSFWorkbook(is); }else if(fileName.endsWith(xlsx)){ //2007 workbook = getXSSFWorkbook(is); } } catch (IOException e) { e.printStackTrace(); } return workbook; } public static String getCellValue(Cell cell){ String cellValue = ""; if(cell == null){ return cellValue; } int tt = cell.getCellStyle().getDataFormat(); //判断数据的类型 switch (cell.getCellType()){ case NUMERIC: //数字 short format = cell.getCellStyle().getDataFormat(); SimpleDateFormat sdf = null; if (format == 57) { // 日期 sdf = new SimpleDateFormat("yyyy年MM月"); } if(sdf != null){ try { double value = cell.getNumericCellValue(); Date date = DateUtil.getJavaDate(value); cellValue = sdf.format(date); } catch (Exception e) { } }else{ cell.setCellType(CellType.STRING); cellValue = String.valueOf(cell.getStringCellValue()); } break; case STRING: //字符串 cellValue = String.valueOf(cell.getStringCellValue()); break; case BOOLEAN: //Boolean cellValue = String.valueOf(cell.getBooleanCellValue()); break; case FORMULA: //公式 //cellValue = String.valueOf(cell.getCellFormula()); try { cellValue = String.valueOf(cell.getNumericCellValue()); } catch (IllegalStateException e) { } if(cellValue.length() == 0){ try { cellValue = String.valueOf(cell.getStringCellValue()); } catch (IllegalStateException e) { } } break; case BLANK: //空值 cellValue = ""; break; case ERROR: //故障 cellValue = "非法字符"; break; default: cellValue = "未知类型"; break; } return cellValue; } public static class SheetContent{ private String sheetName; private List data; public SheetContent(String sheetName, List data){ this.sheetName = sheetName; this.data = data; } public String getSheetName(){ return sheetName; } public List getData(){ return data; } } }