package com.chaozhanggui.system.util;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.chaozhanggui.system.entity.Promotion;
import com.chaozhanggui.system.listener.ExcelListener;
import com.chaozhanggui.system.listener.MyReadListener;
import lombok.SneakyThrows;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellType;
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.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.ArrayList;
import java.util.List;


import com.alibaba.excel.ExcelReader;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

import com.alibaba.excel.metadata.BaseRowModel;


import static cn.hutool.poi.excel.ExcelUtil.getReader;


/**
 * @author lyf
 */

public class ExcelUtil {
//    @SneakyThrows
//    public static void simpleRead(MultipartFile excel){
//        // 有个很重要的点 MyReadListener 不能被spring管理，要每次读取excel都要new,然后里面用到spring可以构造方法传进去
//        // 写法3：
//        ExcelListener excelListener = new ExcelListener();
//        String filename = excel.getOriginalFilename();
//        if (filename == null || (!filename.toLowerCase().endsWith(".xls") && !filename.toLowerCase().endsWith(".xlsx"))) {
//            throw new Exception("文件格式错误！");
//        }
//        InputStream inputStream;
//
//        try {
//            inputStream = new BufferedInputStream(excel.getInputStream());
//            ExcelReader excelReader = new ExcelReader(inputStream);
//            excelReader.read();
//            // 这里 需要指定读用哪个class去读，然后读取第一个sheet 文件流会自动关闭
//            EasyExcel.read(inputStream, Promotion.class, new ExcelListener())
//                    .sheet()
//                    .headRowNumber(1)
//                    .doRead();
//
//            return new ExcelReader(inputStream, null, excelListener, false);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
    /**
     * 获取并解析excel文件，返回一个二维集合
     * @param file 上传的文件
     * @return 二维集合（第一重集合为行，第二重集合为列，每一行包含该行的列集合，列集合包含该行的全部单元格的值）
     */
    public static ArrayList<ArrayList<String>> analysis(MultipartFile file) {
        ArrayList<ArrayList<String>> row = new ArrayList<>();
        //获取文件名称
        String fileName = file.getOriginalFilename();
        System.out.println(fileName);

        try {
            //获取输入流
            InputStream in = file.getInputStream();
            //判断excel版本
            Workbook workbook = null;
            if (judegExcelEdition(fileName)) {
                workbook = new XSSFWorkbook(in);
            } else {
                workbook = new HSSFWorkbook(in);
            }

            //获取第一张工作表
            Sheet sheet = workbook.getSheetAt(0);
            //从第二行开始获取
            for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) {
                //循环获取工作表的每一行
                Row sheetRow = sheet.getRow(i);
                //循环获取每一列
                ArrayList<String> cell = new ArrayList<>();
                for (int j = 0; j < sheetRow.getPhysicalNumberOfCells(); j++) {
                    //将每一个单元格的值装入列集合
                    //设置单元格类型
                    if (j != sheetRow.getPhysicalNumberOfCells()){
                        sheetRow.getCell(j).setCellType(CellType.STRING);
                    }
                    cell.add(sheetRow.getCell(j).getStringCellValue());
                }
                //将装有每一列的集合装入大集合
                row.add(cell);

                //关闭资源
                workbook.close();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.out.println("===================未找到文件======================");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("===================上传失败======================");
        }

        return row;
    }
    /**
     * 判断上传的excel文件版本（xls为2003，xlsx为2017）
     * @param fileName 文件路径
     * @return excel2007及以上版本返回true，excel2007以下版本返回false
     */
    private static boolean judegExcelEdition(String fileName){
        if (fileName.matches("^.+\\.(?i)(xls)$")){
            return false;
        }else {
            return true;
        }
    }

//    /**
//     * 读取 Excel(多个 sheet)
//     *
//     * @param excel 文件
//     * @param rowModel 实体类映射，继承 BaseRowModel 类
//     * @return Excel 数据 list
//     */
//    public static List<Object> readExcel(MultipartFile excel, BaseRowModel rowModel) throws Exception {
//        ExcelListener excelListener = new ExcelListener();
//        ExcelReader reader = getReader(excel, excelListener);
//
//        if (reader == null) {
//            return null;
//        }
//
//        for (Sheet sheet : reader.getClass().getSheets()) {
//            if (rowModel != null) {
//                sheet.setClazz(rowModel.getClass());
//            }
//            reader.read(sheet);
//        }
//
//        return excelListener.getDatas();
//    }
//    /**
//     * 读取某个 sheet 的 Excel
//     *
//     * @param excel 文件
//     * @param rowModel 实体类映射，继承 BaseRowModel 类
//     * @param sheetNo sheet 的序号 从1开始
//     * @param headLineNum 表头行数，默认为1
//     * @return Excel 数据 list
//     */
//    public static List<Object> readExcel(MultipartFile excel, BaseRowModel rowModel, int sheetNo, int headLineNum) throws Exception {
//        ExcelListener excelListener = new ExcelListener();
//        ExcelReader reader = getReader(excel, excelListener);
//
//        if (reader == null) {
//            return null;
//        }
//
//        reader.read((List<ReadSheet>) new Sheet(sheetNo, headLineNum, rowModel.getClass()));
//
//        return excelListener.getDatas();
//    }
//    /**
//     * 读取某个 sheet 的 Excel
//     *
//     * @param excel 文件
//     * @param rowModel 实体类映射，继承 BaseRowModel 类
//     * @param sheetNo sheet 的序号 从1开始
//     * @return Excel 数据 list
//     */
//    public static List<Object> readExcel(MultipartFile excel, BaseRowModel rowModel, int sheetNo) throws Exception {
//        return readExcel(excel, rowModel, sheetNo, 1);
//    }


//    /**
//     * 返回 ExcelReader
//     *
//     * @param excel 需要解析的 Excel 文件
//     * @param excelListener new ExcelListener()
//     */
//    private static ExcelReader getReader(MultipartFile excel, ExcelListener excelListener) throws Exception {
//        String filename = excel.getOriginalFilename();
//        if (filename == null || (!filename.toLowerCase().endsWith(".xls") && !filename.toLowerCase().endsWith(".xlsx"))) {
//            throw new Exception("文件格式错误！");
//        }
//        InputStream inputStream;
//
//        try {
//            inputStream = new BufferedInputStream(excel.getInputStream());
//            ExcelReader excelReader = new ExcelReader(inputStream, null, excelListener,false);
//            return excelReader;
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//
//        return null;
//    }


//    public static void main(String[] args) {
//        ExcelUtil.simpleRead();
//    }

}
