package com.rscode.credits.util; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelUtil { private static final String EXCEL_XLS = "xls"; private static final String EXCEL_XLSX = "xlsx"; /** * 判断Excel的版本,获取Workbook * @param in * @param filename * @return * @throws IOException */ private static Workbook getWorkbok(File file) throws IOException{ InputStream in = new FileInputStream(file); Workbook wb = null; if(file.getName().endsWith(EXCEL_XLS)){ //Excel 2003 wb = new HSSFWorkbook(in); }else if(file.getName().endsWith(EXCEL_XLSX)){ // Excel 2007/2010 wb = new XSSFWorkbook(in); } return wb; } /** * 判断文件是否是excel * @throws Exception */ private static void checkExcelVaild(File file) throws Exception{ if(!file.exists()){ throw new Exception("文件不存在"); } if(!(file.isFile() && (file.getName().endsWith(EXCEL_XLS) || file.getName().endsWith(EXCEL_XLSX)))){ throw new Exception("文件不是Excel"); } } /** * 读取Excel测试,兼容 Excel 2003/2007/2010 * @param excelPath 文件路径 * @return */ public static List<String[]> getAll(String excelPath){ List<String[]> list = new ArrayList<>(); FileInputStream in = null;//文件流 File excelFile; try { // 同时支持Excel 2003、2007 excelFile = new File(excelPath); // 创建文件对象 in = new FileInputStream(excelFile); // 文件流 checkExcelVaild(excelFile); Workbook workbook = getWorkbok(excelFile); //Workbook workbook = WorkbookFactory.create(is); // 这种方式 Excel2003/2007/2010都是可以处理的 int sheetCount = workbook.getNumberOfSheets(); // Sheet的数量 for (int i = 0; i < sheetCount; i++) { /** * 设置当前excel中sheet的下标:0开始 */ Sheet sheet = workbook.getSheetAt(i); // 遍历第三个Sheet //获取总行数 // System.out.println(sheet.getLastRowNum()); // 为跳过第一行目录设置count int count = 0; for (Row row : sheet) { try { // 跳过第一行的目录 if(count < 1 ) { count++; continue; } //如果当前行没有数据,跳出循环 if(row.getCell(0).toString().equals("")){ continue; } //获取总列数(空格的不计算) //int columnTotalNum = row.getPhysicalNumberOfCells(); // System.out.println("总列数:" + columnTotalNum); // System.out.println("最大列数:" + row.getLastCellNum()); //for循环的,不扫描空格的列 // for (Cell cell : row) { // System.out.println(cell); // } int end = row.getLastCellNum(); String[] rowValue = new String[end]; for (int j = 0; j < end; j++) { Cell cell = row.getCell(j); if(cell == null) { rowValue[j]=""; } try { rowValue[j] = getValue(cell).toString(); } catch (Exception e) { e.printStackTrace(); rowValue[j]= " "; } } list.add(rowValue); } catch (Exception e) { e.printStackTrace(); } } } } catch (Exception e) { e.printStackTrace(); }finally { try { in.close(); } catch (IOException e) { System.out.println("关流失败"); e.printStackTrace(); } } return list; } @SuppressWarnings("deprecation") private static Object getValue(Cell cell) { Object obj = null; switch (cell.getCellTypeEnum()) { case BOOLEAN: obj = cell.getBooleanCellValue(); break; case ERROR: obj = cell.getErrorCellValue(); break; case NUMERIC: obj = cell.getNumericCellValue(); break; case STRING: obj = cell.getStringCellValue(); break; default: break; } return obj; } // public static void main(String[] args) throws Exception { // // List<String[]>list = ExcelUtil.getAll("C:\\Users\\13320\\Downloads\\捐献书籍活动名单.xls"); // for (String[] strings : list) { // for (int i = 0; i < strings.length; i++) { // System.out.println(strings[i]); // } // } // } }
浙公网安备 33010602011771号