package com.rufengda.tms.biz.util.poiexcel;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
*
* @author wanghaiyang
* @version 2015/12/28 16:38
*
*/
public class ExcelUtil {
private static ExcelUtil excelUtil = new ExcelUtil();
private ExcelUtil() {
};
public static ExcelUtil getInstance() {
return excelUtil;
}
/**通过excel模版的方式,将数据对象导入到Excel中
* @param template :excel的模板
* @param outPath:文件输出路径 输出到那里
* @param objs:数据列表、用于要输出的数据对象
* @param constantMap:用于输出一些特殊的一些常量 如#tiltle=标题
* @param clz:导入那个,其通过反射机制实现
* @param isclassPath:是否通过classpath的加载方式进行加载excel模版
* */
@SuppressWarnings("rawtypes")
public void exportObjToExcelByTemplate(String template,String outPath,List objs,Map constantMap,Class clz,boolean isclassPath){
ExcelTemplate excelTemplate=HanderExcelByTemplate(template, objs, constantMap, clz, isclassPath);
excelTemplate.writeFilePath(outPath);
}
/**通过excel模版的方式,将数据对象导入到Excel中
* @param template :excel的模板
* @param os:通过输出流
* @param objs:数据列表、用于要输出的数据对象
* @param constantMap:用于输出一些特殊的一些常量 如#tiltle=标题
* @param clz:导入那个,其通过反射机制实现
* @param isclassPath:是否通过classpath的加载方式进行加载excel模版
* */
@SuppressWarnings("rawtypes")
public void exportObjToExcelByTemplate(String template,OutputStream os,List objs,Map constantMap,Class clz,boolean isclassPath){
ExcelTemplate excelTemplate=HanderExcelByTemplate(template, objs, constantMap, clz, isclassPath);
excelTemplate.writeStream(os);
}
/**不通过excel模版的方式,直接将数据对象导入到Excel中
* @param template :excel的模板
* @param outPath:文件输出路径 输出到那里
* @param objs:数据列表、用于要输出的数据对象
* @param constantMap:用于输出一些特殊的一些常量 如#tiltle=标题
* @param clz:导入那个,其通过反射机制实现
* @param isXssF:true=2007excel,false=2003excel
* */
@SuppressWarnings("rawtypes")
public void exportObjToExcel(String outPath,List objs,Class clz,boolean isXssF){
FileOutputStream fos=null;
try {
fos= new FileOutputStream(new File(outPath));
Workbook workbook=HanderExcel(objs, clz, isXssF);
workbook.write(fos);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**不通过excel模版的方式,直接将数据对象导入到Excel中
* @param template :excel的模板
* @param os:输出流
* @param objs:数据列表、用于要输出的数据对象
* @param constantMap:用于输出一些特殊的一些常量 如#tiltle=标题
* @param clz:导入那个,其通过反射机制实现
* @param isXssF:true=2007excel,false=2003excel
* */
@SuppressWarnings("rawtypes")
public void exportObjToExcel(OutputStream os,List objs,Class clz,boolean isXssF){
try {
Workbook workbook=HanderExcel(objs, clz, isXssF);
workbook.write(os);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**通过excel模版的方式,来处理excel,该方法需要提供Excel的模版,并进行在excel中添加模版标识符
* @param template :excel的模板
* @param objs:数据列表、用于要输出的数据对象
* @param constantMap:用于输出一些特殊的一些常量 如#tiltle=标题
* @param clz:导入那个,其通过反射机制实现
* @param isclassPath:是否通过classpath的加载方式进行加载excel模版
* */
@SuppressWarnings({ "rawtypes", "unchecked" })
private ExcelTemplate HanderExcelByTemplate(String template,List objs,Map constantMap,Class clz,boolean isclassPath){
//读取模版
ExcelTemplate excelTemplate= ExcelTemplate.getInstance();
if(isclassPath){
//通过classpath方式读取模版
excelTemplate.readExcelTemplateByClassPath(template);
}else{
//通过path方式读取模版
excelTemplate.readExcelTemplateByPath(template);
}
List<ExcelHeader> headers=getExcelHeader(clz);
//对list进行排序
Collections.sort(headers);
//将其标题项写入到excel中:用户标识、用户名称、用户昵称、用户年龄
//创建一行
excelTemplate.createNewRow();
//将标题插入到当前行中
for (ExcelHeader excelHeader : headers) {
excelTemplate.createCell(excelHeader.getTilte());
}
//开始写入对应数据,ExcelHeader是排序的,因此根据ExcelHeader进行插入
//这里插入是通过反射机制进行
if(null!=objs && objs.size()>0){
for ( Object obj : objs) {
//首先创建一行
excelTemplate.createNewRow();
for (ExcelHeader excelHeader : headers) {
try {
//通过之前保存在excelHeader中的get方法得到相对应的方法
Method method=clz.getMethod(excelHeader.getMethodName());
//通过反射得到对象对应的值
Object returnValue=method.invoke(obj);
excelTemplate.createCell(String.valueOf(returnValue));
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e)