package com.qiyuan.util;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/**
* 導(dǎo)出Excel
* @author Guang
*
*/
public class NewExportToExcelUtil {
/**
* 導(dǎo)出Excel
* @param excelName 要導(dǎo)出的excel名稱
* @param list 要導(dǎo)出的數(shù)據(jù)集合
* @param fieldMap 中英文字段對應(yīng)Map,即要導(dǎo)出的excel表頭
* @param response 使用response可以導(dǎo)出到瀏覽器
* @return
*/
public static <T> void export(String excelName,List<T> list,LinkedHashMap<String, String> fieldMap,HttpServletResponse response){
// 設(shè)置默認(rèn)文件名為當(dāng)前時(shí)間:年月日時(shí)分秒
if (excelName==null || excelName=="") {
excelName = new SimpleDateFormat("yyyyMMddhhmmss").format(
new Date()).toString();
}
// 設(shè)置response頭信息
response.reset();
response.setContentType("application/vnd.ms-excel"); // 改成輸出excel文件
try {
response.setHeader("Content-disposition", "attachment; filename="
+new String(excelName.getBytes("gb2312"), "ISO-8859-1") + ".xls");
} catch (UnsupportedEncodingException e1) {
System.out.println(e1.getMessage());
}
try {
//創(chuàng)建一個(gè)WorkBook,對應(yīng)一個(gè)Excel文件
HSSFWorkbook wb=new HSSFWorkbook();
//在Workbook中,創(chuàng)建一個(gè)sheet,對應(yīng)Excel中的工作薄(sheet)
HSSFSheet sheet=wb.createSheet(excelName);
//創(chuàng)建單元格抒蚜,并設(shè)置值表頭 設(shè)置表頭居中
HSSFCellStyle style=wb.createCellStyle();
//創(chuàng)建一個(gè)居中格式
//style.setAlignment(HSSFCellStyle.s);
// 填充工作表
fillSheet(sheet,list,fieldMap,style);
//將文件輸出
OutputStream ouputStream = response.getOutputStream();
wb.write(ouputStream);
ouputStream.flush();
ouputStream.close();
} catch (Exception e) {
System.out.println("導(dǎo)出Excel失敗屈芜!");
System.out.println(e.getMessage());
}
}
/**
* 根據(jù)字段名獲取字段對象
*
* @param fieldName
* 字段名
* @param clazz
* 包含該字段的類
* @return 字段
*/
public static Field getFieldByName(String fieldName, Class<?> clazz) {
System.out.println("根據(jù)字段名獲取字段對象:getFieldByName()");
// 拿到本類的所有字段
Field[] selfFields = clazz.getDeclaredFields();
// 如果本類中存在該字段拍棕,則返回
for (Field field : selfFields) {
//如果本類中存在該字段揪荣,則返回
if (field.getName().equals(fieldName)) {
return field;
}
}
// 否則宇葱,查看父類中是否存在此字段瘦真,如果有則返回
Class<?> superClazz = clazz.getSuperclass();
if (superClazz != null && superClazz != Object.class) {
//遞歸
return getFieldByName(fieldName, superClazz);
}
// 如果本類和父類都沒有,則返回空
return null;
}
/**
* 根據(jù)字段名獲取字段值
*
* @param fieldName 字段名
* @param o 對象
* @return 字段值
* @throws Exception 異常
*
*/
public static Object getFieldValueByName(String fieldName, Object o)
throws Exception {
System.out.println("根據(jù)字段名獲取字段值:getFieldValueByName()");
Object value = null;
//根據(jù)字段名得到字段對象
Field field = getFieldByName(fieldName, o.getClass());
//如果該字段存在黍瞧,則取出該字段的值
if (field != null) {
field.setAccessible(true);//類中的成員變量為private,在類外邊使用屬性值诸尽,故必須進(jìn)行此操作
value = field.get(o);//獲取當(dāng)前對象中當(dāng)前Field的value
} else {
throw new Exception(o.getClass().getSimpleName() + "類不存在字段名 "
+ fieldName);
}
return value;
}
/**
* 根據(jù)帶路徑或不帶路徑的屬性名獲取屬性值,即接受簡單屬性名,
* 如userName等印颤,又接受帶路徑的屬性名您机,如student.department.name等
*
* @param fieldNameSequence 帶路徑的屬性名或簡單屬性名
* @param o 對象
* @return 屬性值
* @throws Exception 異常
*
*/
public static Object getFieldValueByNameSequence(String fieldNameSequence,
Object o) throws Exception {
System.out.println("根據(jù)帶路徑或不帶路徑的屬性名獲取屬性值,即接受簡單屬性名:getFieldValueByNameSequence()");
Object value = null;
// 將fieldNameSequence進(jìn)行拆分
String[] attributes = fieldNameSequence.split("\\.");
if (attributes.length == 1) {
value = getFieldValueByName(fieldNameSequence, o);
} else {
// 根據(jù)數(shù)組中第一個(gè)連接屬性名獲取連接屬性對象,如student.department.name
Object fieldObj = getFieldValueByName(attributes[0], o);
//截取除第一個(gè)屬性名之后的路徑
String subFieldNameSequence = fieldNameSequence
.substring(fieldNameSequence.indexOf(".") + 1);
//遞歸得到最終的屬性對象的值
value = getFieldValueByNameSequence(subFieldNameSequence, fieldObj);
}
return value;
}
/**
* 向工作表中填充數(shù)據(jù)
*
* @param sheet
* excel的工作表名稱
* @param list
* 數(shù)據(jù)源
* @param fieldMap
* 中英文字段對應(yīng)關(guān)系的Map
* @param style
* 表格中的格式
* @throws Exception
* 異常
*
*/
public static <T> void fillSheet(HSSFSheet sheet, List<T> list,
LinkedHashMap<String, String> fieldMap,HSSFCellStyle style) throws Exception {
System.out.println("向工作表中填充數(shù)據(jù):fillSheet()");
// 定義存放英文字段名和中文字段名的數(shù)組
String[] enFields = new String[fieldMap.size()];
String[] cnFields = new String[fieldMap.size()];
// 填充數(shù)組
int count = 0;
for (Entry<String, String> entry : fieldMap.entrySet()) {
enFields[count] = entry.getKey();
cnFields[count] = entry.getValue();
count++;
}
//在sheet中添加表頭第0行,注意老版本poi對Excel的行數(shù)列數(shù)有限制short
HSSFRow row=sheet.createRow((int)0);
// 填充表頭
for (int i = 0; i < cnFields.length; i++) {
HSSFCell cell=row.createCell(i);
cell.setCellValue(cnFields[i]);
cell.setCellStyle(style);
sheet.autoSizeColumn(i);
}
// 填充內(nèi)容
for (int index = 0; index < list.size(); index++) {
row = sheet.createRow(index + 1);
// 獲取單個(gè)對象
T item = list.get(index);
for (int i = 0; i < enFields.length; i++) {
Object objValue = getFieldValueByNameSequence(enFields[i], item);
String fieldValue = objValue == null ? "" : objValue.toString();
row.createCell(i).setCellValue(fieldValue);
}
}
}
}
調(diào)用
//導(dǎo)出excel表格
@RequestMapping(value = "/item-excelAll.action" ,method = RequestMethod.GET)
public void excelAllItem(TItem tItem,HttpServletResponse response){
// 得到所要導(dǎo)出的數(shù)據(jù)
List<TItem> excelAllTItemList = itemServiceImp.getItemSort1(tItem);
// 定義導(dǎo)出excel的名字
String excelName = "商品信息表";
// 獲取需要轉(zhuǎn)出的excle表頭的map字段
LinkedHashMap<String, String> fieldMap = new LinkedHashMap<String, String>();
fieldMap.put("iId", "商品ID");
fieldMap.put("iName", "商品名稱");
fieldMap.put("btId", "商品大類ID");
fieldMap.put("stId", "商品小類ID");
fieldMap.put("iItemproductor", "商品供應(yīng)商");
fieldMap.put("iItemphoto", "商品圖片");
fieldMap.put("iItemintro", "商品介紹");
fieldMap.put("iPricevip", "商品現(xiàn)價(jià)");
fieldMap.put("iPricenormal", "商品原價(jià)");
fieldMap.put("iItemnum", "商品銷量");
fieldMap.put("iItemtotnum", "商品庫存");
fieldMap.put("iItemdetail", "商品詳情介紹");
fieldMap.put("iItemKw", "商品規(guī)格");
fieldMap.put("iItemPv", "商品pv值");
fieldMap.put("iItemStatus", "商品狀態(tài)");
fieldMap.put("iLastModify", "最后修改時(shí)間");
// 導(dǎo)出所有會(huì)員信息表
NewExportToExcelUtil.export(excelName, excelAllTItemList, fieldMap, response);
}