package com.pqs9000.util;


import com.njcn.utils.PubUtils;
import com.pqs9000.pojo.report.UserDataExcelBody;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.usermodel.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.DecimalFormat;
import java.util.List;

public class UserDataExcelUtil {
    // 日志记录
    private static final Logger logger = LoggerFactory.getLogger(UserDataExcelUtil.class);
    /**
     * 导出excel
     * @param title  导出表的标题
     * @param rowsName 导出表的列名
     * @param dataList  需要导出的数据
     * @param filePath  生成excel文件的文件名
     */
    public void exportExcel(String title, String[] rowsName, List<UserDataExcelBody> dataList, String filePath) throws Exception{
        //输出到报表中
        PubUtils.createFile(filePath);
        OutputStream out = new FileOutputStream(filePath);
        this.export(title,rowsName,dataList,out);
        this.close(out);
    }

    /*
     * 导出数据
     */
    private void export(String title,String[] rowName,List<UserDataExcelBody> dataList,OutputStream out){
        try {
            XSSFWorkbook workbook = new XSSFWorkbook (); // 创建工作簿对象
            //因为excel每sheet数据行数限值为65535，所以需要根据数据进行多sheet赋值
            int step=dataList.size()/65535+1;
            for(int i=0;i<step;i++){
                String no="("+ (i+1) +")";
                XSSFSheet sheet = workbook.createSheet(title+no); // 创建工作表
                XSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook);// 获取列头样式对象
                int columnNum = rowName.length;     // 定义所需列数
                XSSFRow rowRowName = sheet.createRow(0); // 在索引2的位置创建行(最顶端的行开始的第二行)
                // 将列头设置到sheet的单元格中
                for (int n = 0; n < columnNum; n++) {
                    XSSFCell cellRowName = rowRowName.createCell(n); // 创建列头对应个数的单元格
                    cellRowName.setCellType(XSSFCell.CELL_TYPE_STRING); // 设置列头单元格的数据类型
                    XSSFRichTextString text = new XSSFRichTextString(rowName[n]);
                    cellRowName.setCellValue(text); // 设置列头单元格的值
                    cellRowName.setCellStyle(columnTopStyle); // 设置列头单元格样式
                }
                // 将查询出的数据设置到sheet对应的单元格中
                //保留小数4位
                DecimalFormat decimalFormat =new DecimalFormat("0.0000");
                int max=dataList.size()<65535?dataList.size():65535;
                List<UserDataExcelBody> tempList=dataList.subList(0,max);
                for (int k = 0; k < max; k++) {
                    UserDataExcelBody userDataExcelBody = tempList.get(k);   // 遍历每个对象
                    XSSFRow row = sheet.createRow(k + 1);   // 创建所需的行数
                    for (int j = 0; j < rowName.length; j++) {
                        XSSFCell cell = row.createCell(j, XSSFCell.CELL_TYPE_NUMERIC);   // 设置单元格的数据类型
                        switch (j){
                            case 0:
                                cell.setCellValue(PubUtils.date2String(userDataExcelBody.getTime(),"yyyy-MM-dd HH:mm:ss"));
                                break;
                            case 1:
                                cell.setCellValue(decimalFormat.format(userDataExcelBody.getWork()));
                                break;
                            case 2:
                                cell.setCellValue(userDataExcelBody.getUserId());
                                break;
                            case 3:
                                cell.setCellValue(userDataExcelBody.getLine());
                                break;
                            case 4:
                                cell.setCellValue(userDataExcelBody.getUserName());
                                break;
                        }
                    }
                }
                // 让列宽随着导出的列长自动适应
                for (int colNum = 0; colNum < columnNum; colNum++) {
                    int columnWidth = sheet.getColumnWidth(colNum) / 256;
                    for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
                        XSSFRow currentRow;
                        // 当前行未被使用过
                        if (sheet.getRow(rowNum) == null) {
                            currentRow = sheet.createRow(rowNum);
                        } else {
                            currentRow = sheet.getRow(rowNum);
                        }
                        if (currentRow.getCell(colNum) != null) {
                            XSSFCell currentCell = currentRow.getCell(colNum);
                            if (currentCell.getCellType() == XSSFCell.CELL_TYPE_STRING) {
                                int length = currentCell.getStringCellValue()
                                        .getBytes().length;
                                if (columnWidth < length) {
                                    columnWidth = length;
                                }
                            }
                        }
                    }
                    if (colNum == 0) {
                        sheet.setColumnWidth(colNum, (columnWidth - 2) * 256);
                    } else {
                        sheet.setColumnWidth(colNum, (columnWidth + 4) * 256);
                    }
                }
                tempList.clear();
            }


            workbook.write(out);
        } catch (Exception e) {
            logger.error("导出数据表格发生异常，异常是"+e.getMessage());
        }
    }



    /*
     * 列头单元格样式
     */
    private XSSFCellStyle getColumnTopStyle(XSSFWorkbook workbook) {

        // 设置字体
        XSSFFont font = workbook.createFont();
        // 设置字体大小
        font.setFontHeightInPoints((short) 11);
        // 字体加粗
        font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
        // 设置字体名字
        font.setFontName("Courier New");
        // 设置样式;
        XSSFCellStyle style = workbook.createCellStyle();
        // 设置底边框;
        style.setBorderBottom(XSSFCellStyle.BORDER_THIN);
        // 设置底边框颜色;
        style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
        // 设置左边框;
        style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
        // 设置左边框颜色;
        style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
        // 设置右边框;
        style.setBorderRight(XSSFCellStyle.BORDER_THIN);
        // 设置右边框颜色;
        style.setRightBorderColor(IndexedColors.BLACK.getIndex());
        // 设置顶边框;
        style.setBorderTop(XSSFCellStyle.BORDER_THIN);
        // 设置顶边框颜色;
        style.setTopBorderColor(IndexedColors.BLACK.getIndex());
        // 在样式用应用设置的字体;
        style.setFont(font);
        // 设置自动换行;
        style.setWrapText(false);
        // 设置水平对齐的样式为居中对齐;
        style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
        // 设置垂直对齐的样式为居中对齐;
        style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);

        return style;

    }


    /**
     * 关闭输出流
     * @param os
     */
    private void close(OutputStream os) {
        if (os != null) {
            try {
                os.close();
            } catch (IOException e) {
                logger.error("关闭输出流异常，异常是"+e.getMessage());
            }
        }
    }

}