EXCEL導(dǎo)出工具類及調(diào)用

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);
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末膀哲,一起剝皮案震驚了整個(gè)濱河市往产,隨后出現(xiàn)的幾起案子被碗,更是在濱河造成了極大的恐慌某宪,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锐朴,死亡現(xiàn)場離奇詭異兴喂,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門衣迷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畏鼓,“玉大人,你說我怎么就攤上這事壶谒≡平茫” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵汗菜,是天一觀的道長让禀。 經(jīng)常有香客問我,道長陨界,這世上最難降的妖魔是什么巡揍? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮菌瘪,結(jié)果婚禮上腮敌,老公的妹妹穿的比我還像新娘。我一直安慰自己俏扩,他們只是感情好糜工,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著动猬,像睡著了一般啤斗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赁咙,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天钮莲,我揣著相機(jī)與錄音,去河邊找鬼彼水。 笑死崔拥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凤覆。 我是一名探鬼主播链瓦,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼盯桦!你這毒婦竟也來了慈俯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤拥峦,失蹤者是張志新(化名)和其女友劉穎贴膘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體略号,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刑峡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年洋闽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片突梦。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诫舅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宫患,到底是詐尸還是另有隱情刊懈,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布娃闲,位于F島的核電站俏讹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏畜吊。R本人自食惡果不足惜泽疆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望玲献。 院中可真熱鬧殉疼,春花似錦、人聲如沸捌年。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽礼预。三九已至眠砾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間托酸,已是汗流浹背褒颈。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留励堡,地道東北人谷丸。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像应结,于是被迫代替她去往敵國和親刨疼。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353