package com.njcn.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.apache.poi.hssf.usermodel.HSSFCell;
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;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import com.njcn.pojo.data.GridTop;
import com.njcn.service.data.IImportGirdTopService;

public class ReadExcel {
    private static final Logger logger = LoggerFactory.getLogger(ReadExcel.class);
	@Resource
	IImportGirdTopService iim;
    //总行数  
    private int totalRows = 0;    
    //总条数  
    private int totalCells = 0;   
    //错误信息接收器  
    private String errorMsg;  
    //构造方法  
    public ReadExcel(){}  
    //获取总行数  
    public int getTotalRows()  { return totalRows;}   
    //获取总列数  
    public int getTotalCells() {  return totalCells;}   
    //获取错误信息  
    public String getErrorInfo() { return errorMsg; }    
  /** 
   * 读EXCEL文件，获取信息集合 
 * @param volLevel 
   * @param fielName 
   * @return 
   */  
    public List<GridTop> getExcelInfo(MultipartFile mFile, int volLevel) {  
        String fileName = mFile.getOriginalFilename();//获取文件名  
        List<GridTop> userList=null;
        try {  
            if (!validateExcel(fileName)) {// 验证文件名是否合格  
                return null;  
            }
            boolean isExcel2003 = true;// 根据文件名判断文件是2003版本还是2007版本  
            if (isExcel2007(fileName)) {  
                isExcel2003 = false;  
            }  
            userList = createExcel(mFile.getInputStream(), isExcel2003,volLevel);  
        } catch (Exception e) {  
            logger.error(e.getMessage());
        }  
        return userList;  
    }  
    
  /** 
   * 根据excel里面的内容读取客户信息 
   * @param is 输入流 
   * @param isExcel2003 excel是2003还是2007版本 
   * @return 
   * @throws IOException 
   */  
    public List<GridTop> createExcel(InputStream is, boolean isExcel2003,int volLevel) { 
    	List<GridTop> userList = null;
        try{  
            Workbook wb = null;
            if (!isExcel2003) {// 当excel是2003时,创建excel2003  
                wb = new XSSFWorkbook(is);  
            } else {// 当excel是2007时,创建excel2007  
                wb = new HSSFWorkbook(is);  
            }  
            userList = readExcelValue(wb,volLevel);// 读取Excel里面客户的信息  
            wb=null;
        } catch (IOException e) {  
            logger.error(e.getMessage());
        }  
        return userList;  
    }  
    
  /** 
   * 读取Excel里面客户的信息 
   * @param wb 
   * @return 
   */  
    private List<GridTop> readExcelValue(Workbook wb,int volLevel) {  
        // 得到第一个shell  
        Sheet sheet = wb.getSheetAt(0);  
        // 得到Excel的行数  
        this.totalRows = sheet.getPhysicalNumberOfRows();  
        // 得到Excel的列数(前提是有行数)  
        if (totalRows > 1 && sheet.getRow(0) != null) {  
            this.totalCells = sheet.getRow(0).getPhysicalNumberOfCells();  
        }  
        List<GridTop> userList = new ArrayList<GridTop>();  
        // 循环Excel行数  
        for (int r = 1; r < totalRows; r++) {  
            Row row = sheet.getRow(r);  
            if (row == null){  
                continue;  
            }  
            GridTop user = new GridTop();  
            // 循环Excel的列  
            for (int c = 0; c < this.totalCells; c++) {
            	user.setGridTopIndex(java.util.UUID.randomUUID().toString());
                Cell cell = row.getCell(c);  
                if (null != cell) {  
                    if (c == 0) {  
                        //如果是纯数字,比如你写的是25,cell.getNumericCellValue()获得是25.0,通过截取字符串去掉.0获得25  
                        if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){  
                            int sequen = Integer.valueOf((int) cell.getNumericCellValue());  
                            user.setSequen(sequen);//序号
                        }else{  
                            user.setSequen(Integer.parseInt(cell.getStringCellValue()));//序号
                        }  
                    } else if (c == 1) {  
                        if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){  
                        	Float longItude = Float.valueOf((float)cell.getNumericCellValue());  
                            user.setLongItude(longItude);//经度
                        	
                        }else{  
                            //判断失败
                        }  
                    } else if (c == 2){  
                        if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){  
                        	Float latItude = Float.valueOf((float)cell.getNumericCellValue());//纬度
                            user.setLatItude(latItude);//纬度
                        }else{  
                            //判断失败  
                        }  
                    }  
                }
                user.setVolLevel(volLevel);
            }  
            // 添加到list  
            userList.add(user);
            //iim.exportGirdTop(userList);
        }  
        return userList;  
    }  
      
    /** 
     * 验证EXCEL文件 
     *  
     * @param filePath 
     * @return 
     */  
    public boolean validateExcel(String filePath) {  
        if (filePath == null) {  
            errorMsg = "文件名不是excel格式";  
            return false;  
        }  
        return true;  
    }
    
    // @描述：是否是2003的excel，返回true是2003   
    public static boolean isExcel2003(String filePath)  {    
         return filePath.matches("^.+\\.(?i)(xls)$");    
     }    
     
    //@描述：是否是2007的excel，返回true是2007   
    public static boolean isExcel2007(String filePath)  {    
         return filePath.matches("^.+\\.(?i)(xlsx)$");    
     } 
} 
