/*
 * 
 * 文件名:ExportExcelUtil.java
 * 版权:Copyright HNNE All Rights Reserved.
 * 描述:
 * 修改人:jyy
 * 修改时间:2016年8月1日
 * 修改内容:
 */
package com.matrix.system.hive.plugin.util;
import com.matrix.core.tools.StringUtils;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * @author jyy
 * @version 1.0, 2016年8月1日
 */
public class ExcelUtil {
	Logger log = Logger.getLogger(this.getClass());
	// 2007 版本以上 最大支持1048576行
	public final static String EXCEl_FILE_2007 = "2007";
	// 2003 版本 最大支持65536 行
	public final static String EXCEL_FILE_2003 = "2003";
	/**
	 * 
	 * 导出无头部标题行Excel 
	 * 时间格式默认:yyyy-MM-dd hh:mm:ss 
	 * 
	 * 
	 * @param title
	 *            表格标题
	 * @param dataset
	 *            数据集合
	 * @param out
	 *            输出流
	 * @param version
	 *            2003 或者 2007,不传时默认生成2003版本
	 * @param hasNum
	 *            是否有序号
	 */
	public ByteArrayInputStream exportExcel(String title, Collection> dataset, OutputStream out, String version,
			boolean isMerg, List mergParm, boolean hasNum) {
		if (StringUtils.isBlank(version) || EXCEL_FILE_2003.equals(version.trim())) {
			return exportExcel2003(title, null, dataset, "yyyy-MM-dd hh:mm:ss", isMerg, mergParm, hasNum);
		} else {
			return exportExcel2007(title, null, dataset, "yyyy-MM-dd hh:mm:ss", isMerg, mergParm, null);
		}
	}
	/**
	 * 
	 * 导出带有头部标题行的Excel 
	 * 时间格式默认:yyyy-MM-dd hh:mm:ss 
	 * 
	 * 
	 * @param title
	 *            表格标题
	 * @param headers
	 *            头部标题集合
	 * @param dataset
	 *            数据集合
	 * @param out
	 *            输出流
	 * @param version
	 *            2003 或者 2007,不传时默认生成2003版本
	 * @param hasNum
	 *            是否有序号
	 */
	public ByteArrayInputStream exportExcel(String title, String[] headers, Collection> dataset, String version,
			boolean isMerg, List mergParm, boolean hasNum) {
		if (StringUtils.isBlank(version) || EXCEL_FILE_2003.equals(version.trim())) {
			return exportExcel2003(title, headers, dataset, "yyyy-MM-dd hh:mm:ss", isMerg, mergParm, hasNum);
		} else {
			return exportExcel2007(title, headers, dataset, "yyyy-MM-dd hh:mm:ss", isMerg, mergParm, null);
		}
	}
	/**
	 * 
	 * 通用Excel导出方法,利用反射机制遍历对象的所有字段,将数据写入Excel文件中 
	 * 此版本生成2007以上版本的文件 (文件后缀:xlsx)
	 * 
	 * 
	 * @param title
	 *            表格标题名
	 * @param headers
	 *            表格头部标题集合
	 * @param dataset
	 *            需要显示的数据集合,集合中一定要放置符合JavaBean风格的类的对象。此方法支持的
	 *            JavaBean属性的数据类型有基本数据类型及String,Date
	 * @param out
	 *            与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
	 * @param pattern
	 *            如果有时间数据,设定输出格式。默认为"yyyy-MM-dd hh:mm:ss"
	 * @param isMerg
	 *            是否需要合并单元格
	 * @param mergParm
	 *            合并单元格参数
	 * @param cols
	 *            要生成excel列数
	 * @param headerRows
	 *            要生成的excel表头的行数
	 * @param list
	 *            表头列字符串参数(Map)String表头列名,Integer[]
	 */
	@SuppressWarnings({ "rawtypes" })
	public static ByteArrayInputStream exportExcel2007(String title, String[] headers, Collection> dataset,
			String pattern, boolean isMerg, List mergParm, List