package com.chinaweal.aiccs.common.util;

import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Excel工具类
 * 功能：提供各种Excel操作的方法
 */
public class ExcelUtil {

    /**
     * 解析Excel文件  2007版本以上
     * @param inStream Excel文件的输入流
     * @param fieldNameList 属性名集合，顺序与Excel中列的顺序一致
     * @return Map类型的集合，其中Key为属性名，Value可以理解为属性值（实际为Excel中的列值）
     */
    public static List<Map<String, String>> parseExcel2007(InputStream inStream, List<String> fieldNameList){
        List<Map<String, String>> resultList = new ArrayList<Map<String, String>>();
        try{
            XSSFWorkbook book=new  XSSFWorkbook(inStream); //07版上
            XSSFSheet sheet = book.getSheetAt(0); //拿到sheet
            int rows = sheet.getPhysicalNumberOfRows(); //行数
            //int columns = sheet.getRow(0).getPhysicalNumberOfCells();//列数
            int columns = fieldNameList.size();//列数

            XSSFRow row;
            Map<String, String> map;
            // -1：去除第一行标题
            for (int i=1; i<rows; i++) {
                row = sheet.getRow(i);
                if (row == null || row.getCell(0) == null || StringUtils.isEmpty(row.getCell(0).toString())) {
                    break;
                }
                map = new HashMap<String, String>();
                for(int j=0; j<columns; j++){
                    String content =row.getCell(j)==null?"":row.getCell(j).toString().trim();
                    map.put(fieldNameList.get(j),content);
                }
                resultList.add(map);
            }
        }catch(Exception e){
            throw new RuntimeException(e);
        }
        return resultList;
    }

    /**
     * 解析Excel文件  2007版本以下
     * @param inStream Excel文件的输入流
     * @param fieldNameList 属性名集合，顺序与Excel中列的顺序一致
     * @return Map类型的集合，其中Key为属性名，Value可以理解为属性值（实际为Excel中的列值）
     */
    public static List<Map<String, String>> parseExcel(InputStream inStream, List<String> fieldNameList){
        List<Map<String, String>> resultList = new ArrayList<Map<String, String>>();
        try{
            HSSFWorkbook book = new HSSFWorkbook(inStream); //07版下
            //XSSFWorkbook book1=new  XSSFWorkbook(inStream); //07版上
            HSSFSheet sheet = book.getSheetAt(0); //拿到sheet
            int rows = sheet.getPhysicalNumberOfRows(); //行数
            //int columns = sheet.getRow(0).getPhysicalNumberOfCells();//列数
            int columns = fieldNameList.size();//列数

            HSSFRow row;
            Map<String, String> map;
            // -1：去除第一行标题
            for (int i=1; i<rows; i++) {
                row = sheet.getRow(i);
                if (row == null || row.getCell(0) == null || StringUtils.isEmpty(row.getCell(0).toString())) {
                    break;
                }
                map = new HashMap<String, String>();
                for(int j=0; j<columns; j++){
                    String content =row.getCell(j)==null?"":row.getCell(j).toString().trim();
                    map.put(fieldNameList.get(j),content);
                }
                resultList.add(map);
            }
        }catch(Exception e){
            throw new RuntimeException(e);
        }
        return resultList;
    }


    /**
     * 解析Excel文件 兼容版本
     * @param file Excel文件
     * @param fieldNameList 属性名集合，顺序与Excel中列的顺序一致
     * @return Map类型的集合，其中Key为属性名，Value可以理解为属性值（实际为Excel中的列值）
     */
    public static List<Map<String, String>> parseExcel(MultipartFile file, List<String> fieldNameList){
        try{
            List<Map<String, String>> list=null;
            String ext = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
            if("xls".equals(ext)) {
                list = ExcelUtil.parseExcel(file.getInputStream(), fieldNameList);
            }else if("xlsx".equals(ext)) {
                list = ExcelUtil.parseExcel2007(file.getInputStream(), fieldNameList);
            }

            return list;
        } catch(Exception e){
            throw new RuntimeException(e);
        }
    }

    /**
     * 创建 HSSFWorkbook
     * @param headInfo     标题
     * @param valueList    值
     * @return    HSSFWorkbook
     */
    public static HSSFWorkbook  createExcel(String sheetName,List<String> headInfo,List<Map<String,Object>> valueList){
        // 第一步，创建一个webbook，对应一个Excel文件
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 第二步，在webbook中添加一个sheet,对应Excel文件中的sheet
        HSSFSheet excel = workbook.createSheet(sheetName);
        // 第三步，在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
        HSSFRow headrow = excel.createRow(0);
        HSSFCellStyle cellStyle = workbook.createCellStyle();
        //设置字体
        Font font = workbook.createFont();
        font.setBold(true); //粗体
        cellStyle.setFont(font);
         //设置背景颜色
        cellStyle.setFillBackgroundColor(HSSFColor.HSSFColorPredefined.GREY_40_PERCENT.getIndex());
        Map<String,String> map=getFieldmap();
        //标题信息
        for (int i = 0; i < headInfo.size(); i++) {            //设置表头
            HSSFCell cell = headrow.createCell(i);
            excel.setColumnWidth(i, 20 * 256);
            cell.setCellStyle(cellStyle);
            cell.setCellValue(map.get(headInfo.get(i)));
        }
        //注入参数
        for (int i = 0; i < valueList.size(); i++) {                //填值
            Map model = (Map) valueList.get(i);
            HSSFRow row = excel.createRow(i + 1);
            for (int j = 0; j < headInfo.size(); j++) {
                HSSFCell cell = row.createCell(j);
                String pro = headInfo.get(j);
                Object value = model.get(pro);
                cell.setCellValue(value != null ? value.toString() : "");
            }
        }
          return workbook;
    }

    /**
     * 导出字段映射表
     * @return
     */
    public static Map<String, String> getFieldmap() {
        Map<String,String> fieldmap = new HashMap<String, String>();
        fieldmap.put("regno","注册号");
        fieldmap.put("entname","名称");
        fieldmap.put("enttype","企业类型");
        fieldmap.put("aicname","登记管辖机关");
        fieldmap.put("issuedeptname","登记机关");
        fieldmap.put("entstate","企业状态");
        fieldmap.put("estdate","成立日期");
        fieldmap.put("lerepname","法定代表人/负责人");
        fieldmap.put("address","地址");
        fieldmap.put("localadm","属地管理机关");
        fieldmap.put("industryphy","行业");
        fieldmap.put("tel","联系电话");
        fieldmap.put("opscope","经营范围");
        return fieldmap;
    }

    /**
     * 读取单元格值
     * @param cell  单元格
     * @return  读取值字符串
     * @author lroyia
     * @since  2021年11月8日 11:14:29
     */
    public static String getCellValue(Cell cell){
        if(cell == null) return null;
        switch (cell.getCellType()){
            case NUMERIC: {
                if(HSSFDateUtil.isCellDateFormatted(cell)){
                    SimpleDateFormat sdf = new SimpleDateFormat(
                            "yyyy-MM-dd");
                    return sdf.format(HSSFDateUtil.getJavaDate(cell
                            .getNumericCellValue()));
                }
                return BigDecimal.valueOf(cell.getNumericCellValue()).stripTrailingZeros().toPlainString();
            }
            case FORMULA: return cell.getCellFormula();
            case BOOLEAN: return String.valueOf(cell.getBooleanCellValue());
            case STRING: return cell.getStringCellValue();
            case ERROR: return String.valueOf(cell.getErrorCellValue());
            default: return com.chinaweal.aiccs.common.util.StringUtils.EMPTY;
        }
    }

}
