package com.bonus.hn.bearing.capacity.backstage.manager.utils;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;


/**
 * 导出表格工具类
 *
 * @author lvjilong
 */
public class ExcelUtils {

    /**
     * excel默认宽度
     */
    private static int width = 256 * 14;
    /**
     * 默认字体
     */
    private static String excelfont = "微软雅黑";



    /**
     * 当前行号
     */
    private static int rownum;
    /**
     * 样式列表
     */
    private static Map<String, CellStyle> styles;

    /**
     * 标题
     */
    private String title;

    /**
     * @param excelName 导出的EXCEL名字
     * @param sheetName 导出的SHEET名字  当前sheet数目只为1
     * @param headers   导出的表格的表头
     * @param ds_titles 导出的数据 map.get(key) 对应的 key
     * @param ds_format 导出数据的样式
     *                  1:String left;
     *                  2:String center
     *                  3:String right
     *                  4 int  right
     *                  5:float ###,###.## right
     *                  6:number: #.00% 百分比 right
     * @param widths    表格的列宽度  默认为 256*14
     * @param data      数据集  List<Map>
     * @param response
     * @throws IOException
     */
    public static void export(String excelName, String sheetName, String[] headers, String[] ds_titles, int[] ds_format, int[] widths, List<Map<String, Object>> data, HttpServletRequest request, HttpServletResponse response) throws IOException {
        HttpSession session = request.getSession();
        session.setAttribute("state", null);
        if (widths == null) {
            widths = new int[ds_titles.length];
            for (int i = 0; i < ds_titles.length; i++) {
                widths[i] = width;
            }
        }
        if (ds_format == null) {
            ds_format = new int[ds_titles.length];
            for (int i = 0; i < ds_titles.length; i++) {
                ds_format[i] = 1;
            }
        }
        //设置文件名
        String fileName = "";
        if (StringHelper.isNotEmpty(excelName)) {
            fileName = excelName;
        }
        //创建一个工作薄
        HSSFWorkbook wb = new HSSFWorkbook();
        //创建一个sheet
        HSSFSheet sheet = wb.createSheet(StringHelper.isNotEmpty(sheetName) ? sheetName : "excel");
        //创建表头，如果没有跳过
        Row titleRow = sheet.createRow(rownum == 0 ? rownum++ : 0);
        titleRow.setHeightInPoints(30);
        Cell titleCell = titleRow.createCell(0);
        titleCell.setCellValue(sheetName);
        CellRangeAddress cra =new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), headers.length-1);
        titleCell.setCellStyle(getStyleTitle(wb));
        sheet.addMergedRegion(cra);
        int headerrow = 1;
        if (headers != null) {
            HSSFRow row = sheet.createRow(headerrow);
            //表头样式
            HSSFCellStyle style = wb.createCellStyle();
            HSSFFont font = wb.createFont();
            font.setBold(true);
            font.setFontName(excelfont);
            font.setFontHeightInPoints((short) 11);
            style.setFont(font);
            style.setVerticalAlignment(VerticalAlignment.CENTER);
            style.setWrapText(true);
            style.setAlignment(HorizontalAlignment.CENTER);
            style.setBorderBottom(BorderStyle.THIN);
            style.setBorderLeft(BorderStyle.THIN);
            style.setBorderRight(BorderStyle.THIN);
            style.setBorderTop(BorderStyle.THIN);
            // 设置数据单元格的背景颜色
            style.setFillForegroundColor(IndexedColors.WHITE.getIndex());
            style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            // 设置数据单元格文本对齐方式
            style.setAlignment(HorizontalAlignment.CENTER);
            style.setVerticalAlignment(VerticalAlignment.CENTER);
            for (int i = 0; i < headers.length; i++) {
                sheet.setColumnWidth((short) i, (short) widths[i]);
                HSSFCell cell = row.createCell(i);
                cell.setCellValue(headers[i]);
                cell.setCellStyle(style);
            }
            headerrow++;
        }
        //表格主体  解析list
        if (data != null) {
            List styleList = new ArrayList();
            //列数
            for (int i = 0; i < ds_titles.length; i++) {
                HSSFCellStyle style = wb.createCellStyle();
                HSSFFont font = wb.createFont();
                font.setFontName("宋体");
                font.setFontHeightInPoints((short) 10);
                style.setFont(font);
                style.setBorderBottom(BorderStyle.THIN);
                style.setBorderLeft(BorderStyle.THIN);
                style.setBorderRight(BorderStyle.THIN);
                style.setBorderTop(BorderStyle.THIN);
                if (ds_format[i] == 1) {
                    style.setAlignment(HorizontalAlignment.LEFT);
                } else if (ds_format[i] == 2) {
                    style.setAlignment(HorizontalAlignment.CENTER);
                } else if (ds_format[i] == 3) {
                    style.setAlignment(HorizontalAlignment.RIGHT);
                    //int类型
                } else if (ds_format[i] == 4) {
                    style.setAlignment(HorizontalAlignment.RIGHT);
                    //int类型
                    style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0"));
                } else if (ds_format[i] == 5) {
                    //float类型
                    style.setAlignment(HorizontalAlignment.RIGHT);
                    style.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0.00"));
                } else if (ds_format[i] == 6) {
                    //百分比类型
                    style.setAlignment(HorizontalAlignment.RIGHT);
                    style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00%"));
                }
                styleList.add(style);
            }
            //行数
            for (int i = 0; i < data.size(); i++) {
                HSSFRow row = sheet.createRow(headerrow);
                Map map = data.get(i);
                //列数
                for (int j = 0; j < ds_titles.length; j++) {
                    HSSFCell cell = row.createCell(j);
                    Object o = map.get(ds_titles[j]);
                    if (o == null || "".equals(o)) {
                        cell.setCellValue("");
                    } else if (ds_format[j] == 4) {
                        //int
                        cell.setCellValue((Long.valueOf((map.get(ds_titles[j])) + "")).longValue());
                    } else if (ds_format[j] == 5 || ds_format[j] == 6) {
                        //float
                        cell.setCellValue((Double.valueOf((map.get(ds_titles[j])) + "")).doubleValue());
                    } else {
                        cell.setCellValue(map.get(ds_titles[j]).toString());
                    }
                    cell.setCellStyle((HSSFCellStyle) styleList.get(j));
                }
                headerrow++;
            }
        }

        fileName = fileName + ".xls";
        String filename = "";
        try {
            filename = encodeChineseDownloadFileName(request, fileName);
        } catch (Exception e) {
            e.printStackTrace();
        }
        response.setHeader("Content-disposition", filename);
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-disposition", "attachment;filename=" + filename);
        response.setHeader("Pragma", "No-cache");
        OutputStream ouputStream = response.getOutputStream();
        wb.write(ouputStream);
        ouputStream.flush();
        ouputStream.close();
        wb.close();
    }

    /**
     * 对文件流输出下载的中文文件名进行编码 屏蔽各种浏览器版本的差异性
     *
     * @throws UnsupportedEncodingException
     */
    public static String encodeChineseDownloadFileName(
            HttpServletRequest request, String pFileName) throws Exception {
        String filename = null;
        String agent = request.getHeader("USER-AGENT");
        if (null != agent) {

            if (StringHelper.contains(agent, "MSIE") || StringHelper.contains(agent, "like Gecko")) {
                //IE浏览器
                filename = URLEncoder.encode(pFileName, "UTF-8");
            } else if (StringHelper.contains(agent, "Mozilla")) {
                //google,火狐浏览器
                filename = new String(pFileName.getBytes(), "ISO8859-1");
            } else {
                //其他
                filename = URLEncoder.encode(pFileName, "UTF-8");
            }
        } else {
            filename = pFileName;
        }
        return filename;
    }
    /**
     * 标题样式
     */
    public static HSSFCellStyle getStyleTitle(HSSFWorkbook workbook) {
        // 设置字体
        HSSFFont font = workbook.createFont();
        //设置字体大小
        font.setFontHeightInPoints((short)15);
        //字体加粗
        font.setBold(true);
        //设置字体名字
        font.setFontName("宋体");
        //设置样式;
        HSSFCellStyle style = workbook.createCellStyle();

        //在样式用应用设置的字体;
        style.setFont(font);
        //设置自动换行;
        style.setWrapText(false);
        //设置水平对齐的样式为居中对齐;
        style.setAlignment(HorizontalAlignment.CENTER);
        //设置垂直对齐的样式为居中对齐;
        style.setVerticalAlignment(VerticalAlignment.CENTER);
        style.setWrapText(true);
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);
        style.setBorderTop(BorderStyle.THIN);
        // 设置背景颜色
        style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        return style;

    }

}  