package cn.com.countrygarden.bi.main.util;


import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

public class ExcelUtil {
	
	/**
	 * 
	 * @param mfile  文件对象
	 * @return
	 * @throws IOException
	 */
	public static List<ArrayList<String>> importData(MultipartFile mfile,int index) throws IOException {
		InputStream stream = mfile.getInputStream();
		// 判断文件格式
		boolean isExcel03 = mfile.getOriginalFilename().matches(".+\\.(?i)(xls)");//这里的(?i)代表忽略大小写
		Workbook wb = isExcel03 ? new HSSFWorkbook(stream) : new XSSFWorkbook(stream);
		// 读取工作表
		Sheet sheet = wb.getSheetAt(index);	// sheet1
		List<ArrayList<String>> resultData = new ArrayList<ArrayList<String>>();	//存放返回数据
		// 开始每行的读取
		//System.out.println(sheet.getPhysicalNumberOfRows());
		int maxRowLength = 0;
		//System.out.println(sheet.getFirstRowNum());
		int lastRowNum = sheet.getLastRowNum();
		if(0 != lastRowNum){
			if(0!=sheet.getRow(lastRowNum).getLastCellNum()){
				//maxRowLength = sheet.getRow(lastRowNum).getLastCellNum();
				maxRowLength = sheet.getRow(sheet.getFirstRowNum()).getLastCellNum();
			}
		}
		for (int i = 0; i <= sheet.getLastRowNum(); i++) {
			Row row = sheet.getRow(i);
			if(row==null) {
				break;
			}
			ArrayList<String> rowData = new ArrayList<>();
			for(int j =0;j<maxRowLength;j++) {	// for循环可读取 null 值
				Cell cell = row.getCell(j);
				String cellValue = "";
				if(null!=cell){
					switch (cell.getCellType()) {
					case Cell.CELL_TYPE_BLANK:	// 空白  //Cell.CELL_TYPE_STRING:		// 文本
						cellValue = "";
						break;
					case Cell.CELL_TYPE_STRING:
						cellValue = cell.getStringCellValue();
						break;
					case Cell.CELL_TYPE_NUMERIC: //Cell.CELL_TYPE_NUMERIC:	// 数字或者日期
						if(DateUtil.isCellDateFormatted(cell)){		// 是否是日期
							Date date = cell.getDateCellValue();
							cellValue = date == null ? null : new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
						} else {
							cell.setCellType(CellType.STRING);
							cellValue = cell.getStringCellValue();
						}
						break;
					case Cell.CELL_TYPE_BOOLEAN: //Cell.CELL_TYPE_BOOLEAN:	// 布尔型
						cellValue = String.valueOf(cell.getBooleanCellValue());
						break;
					default:
						cellValue = null;
						break;
					}
				}
				//System.err.println(j+ " === "+cellValue);
				rowData.add(cellValue); // 每个单元格数据存入行数据集合
			}
			resultData.add(rowData);	// 每行数据存入返回数据集合
		}

		// 关流
		wb.close();
		stream.close();
		return resultData;
	}
	
	private static XSSFCellStyle createCellStyle(XSSFWorkbook workbook, String fontName, short fontSize,
			boolean isBlod) {
		// 通过工作簿创建样式
		XSSFCellStyle cellStyle = workbook.createCellStyle();
		// 设置水平和垂直居中
		cellStyle.setAlignment(HorizontalAlignment.CENTER);
		cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
		// 通过工作簿创建字体
		XSSFFont font = workbook.createFont();
		// 设置字体
		if (null != fontName && !"".equals(fontName)) {
			font.setFontName(fontName);
		}
		// 设置字体大小
		font.setFontHeightInPoints(fontSize);
		// 设置字体是否加粗
		font.setBold(isBlod);
		// 把字体set到样式中
		cellStyle.setFont(font);

		return cellStyle;
	}


	/**
	 * @author wan.ly
	 * 说明：传参为List<Map<String,Object>>
	 * @param fileName   文件名称
	 * @param sheetName  区间名
	 * @param title      标题
	 * @param cellTitles 列名
	 * @param data       数据
	 * @param response
	 * @throws Exception    
	 */
	public static void exportExcel(String fileName, String sheetName, String title, String cellTitles[],
			 List<Map<String, Object>> data, HttpServletResponse response,String[] fields) throws Exception {
		/** 创建空的工作簿 */
		XSSFWorkbook workbook = new XSSFWorkbook();
		/** 创建工作表 */
		XSSFSheet sheet = workbook.createSheet(sheetName);
		
		for (int i = 0; i < cellTitles.length; i++) {
			sheet.setColumnWidth(i,16 * 256);
		}
		
		
		if (StringUtils.isNotBlank(title)) {
			
			// 合并单元格
			if(cellTitles.length==1) {
				sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, cellTitles.length));
			}else {
				sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, cellTitles.length-1));
			}
			
			/** 第一行标题处理  */
			XSSFRow row01 = sheet.createRow(0);
			XSSFCell cell01 = row01.createCell(0);
			// 设置单元格内容
			cell01.setCellValue(title);
			// 创建单元格样式
			XSSFCellStyle cellStyle01 = createCellStyle(workbook,"Courier New",(short)12,true);
			// 设置单元格样式
			cell01.setCellStyle(cellStyle01);
		}
		
		/** 第二行列标题的处理  */
		// 创建单元格样式
		XSSFCellStyle cellStyle02 = createCellStyle(workbook,"Courier New",(short)10,false);
		XSSFRow row02 = sheet.createRow(StringUtils.isNotBlank(title)?1:0);
		// for循环创建单元格并赋值和设置样式
		for (int i = 0; i < cellTitles.length; i++) {
			XSSFCell titleCell = row02.createCell(i);
			titleCell.setCellValue(cellTitles[i]);
			titleCell.setCellStyle(cellStyle02);
		}
		if (data != null) {
			/** 中间行的处理  */
			// 创建单元格样式
			XSSFCellStyle cellStyle03 = createCellStyle(workbook,"宋体",(short)10,false);
			int temp = StringUtils.isNotBlank(title)?2:1;
			// for循环处理
			for (int i = 0; i < data.size(); i++) {
				XSSFRow row = sheet.createRow(i + temp);
				for(int j = 0; j < fields.length; j++) {
					XSSFCell cell = row.createCell(j);
					Object value = data.get(i).get(fields[j]);
					cell.setCellValue(value == null ? "" : value.toString());
					cell.setCellStyle(cellStyle03);
				}
			}
		}
		
		/** 下载时文件名为中文：乱码解决 */
		// 响应的过程：
		// 服务器： utf-8|gbk --> iso8859-1    浏览器: iso8859-1 --> utf-8|gbk (firefox、chrome)
		// 服务器： gbk --> iso8859-1    浏览器: iso8859-1 --> gbk (msie)
		fileName = new String(fileName.getBytes("gbk"), "iso8859-1");
		/** 设置下载的文件名 */
		response.setHeader("content-disposition", "attachment;filename=" + fileName + ".xlsx");
        /** 向浏览器输出Excel文件 */
		workbook.write(response.getOutputStream());
		/** 关闭工作簿 */
		workbook.close();
	}
}