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]);
//            }
//        }
//    }
}