使用POI和Java反射機制導出數據到excel中

wdfd 9年前發布 | 6K 次閱讀 Java POI

下面以導出2007(文件名后綴為:xlsx)格式的excel文件為例,簡單介紹利用Java反射機制自由地讀取數據并填充到excel中的過程。


第一步:引入依賴包(2007版本的excel依賴包為poi-ooxml,如果是2003的則為poi)

    <dependency>  
        <groupId>org.apache.poi</groupId>  
        <artifactId>poi-ooxml</artifactId>  
        <version>3.10.1</version>  
    </dependency>  

第二步:定義一個用于保存數據的實體類

注意getSexName()方法的用法。

    package com.xjj.poi;

import java.util.Date;  

public class Student {  
    private long id;  
    private String name;  
    private int age;  
    private boolean sex;  
    private Date birthday;  

    public Student() {  
    }  

    public Student(long id, String name, int age, boolean sex, Date birthday) {  
        this.id = id;  
        this.name = name;  
        this.age = age;  
        this.sex = sex;  
        this.birthday = birthday;  
    }  

    //sex轉換為中文  
    public String getSexName(){  
        return (sex==true) ? "男" : "女";  
    }  

    public long getId() {  
        return id;  
    }  
    public void setId(long id) {  
        this.id = id;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public int getAge() {  
        return age;  
    }  
    public void setAge(int age) {  
        this.age = age;  
    }  
    public boolean getSex() {  
        return sex;  
    }  
    public void setSex(boolean sex) {  
        this.sex = sex;  
    }  
    public Date getBirthday() {  
        return birthday;  
    }  
    public void setBirthday(Date birthday) {  
        this.birthday = birthday;  
    }  
}  </pre> 


第三步:利用Java反射機制把數據填入excel workbook中并測試輸出到一個文件。具體步驟請看代碼注釋。測試例子中,可以自由的決定需要讀取實體類Student中的哪些屬性到excel中。

    package com.xjj.util;

import java.awt.Color;  
import java.io.FileNotFoundException;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.OutputStream;  
import java.lang.reflect.Method;  
import java.text.SimpleDateFormat;  
import java.util.ArrayList;  
import java.util.Collection;  
import java.util.Date;  
import java.util.LinkedHashMap;  
import java.util.List;  

import org.apache.poi.ss.usermodel.IndexedColors;  
import org.apache.poi.ss.usermodel.Workbook;  
import org.apache.poi.xssf.usermodel.XSSFCell;  
import org.apache.poi.xssf.usermodel.XSSFCellStyle;  
import org.apache.poi.xssf.usermodel.XSSFColor;  
import org.apache.poi.xssf.usermodel.XSSFFont;  
import org.apache.poi.xssf.usermodel.XSSFRichTextString;  
import org.apache.poi.xssf.usermodel.XSSFRow;  
import org.apache.poi.xssf.usermodel.XSSFSheet;  
import org.apache.poi.xssf.usermodel.XSSFWorkbook;  

import com.xjj.poi.Student;  

public class ExcelUtil {  

    /** 
     * 根據輸入的數據生成一個XSSFWorkbook 
     * @param title:sheet名稱 
     * @param propertyHeaderMap:<property, header>(<T中的property名稱、有getter就行, 對應顯示在Excel sheet中的列標題>) 
     *                              用LinkedHashMap保證讀取的順序和put的順序一樣 
     * @param dataSet:實體類集合 
     * @return:XSSFWorkbook 
     */  
    public static <T> XSSFWorkbook generateXlsxWorkbook(String title, LinkedHashMap<String, String> propertyHeaderMap, Collection<T> dataSet) {  
        // 聲明一個工作薄  
        XSSFWorkbook workbook = new XSSFWorkbook();  
        // 生成一個表格  
        XSSFSheet sheet = workbook.createSheet(title);  
        // 設置表格默認列寬度為15個字節  
        sheet.setDefaultColumnWidth((int) 15);  

        XSSFCellStyle headerStyle = getHeaderStyle(workbook);  
        XSSFCellStyle contentStyle = getContentStyle(workbook);  

        // 生成表格標題行  
        XSSFRow row = sheet.createRow(0);  
        int i = 0;  
        for(String key : propertyHeaderMap.keySet()){  
            XSSFCell cell = row.createCell(i);  
            cell.setCellStyle(headerStyle);  
            XSSFRichTextString text = new XSSFRichTextString(propertyHeaderMap.get(key));  
            cell.setCellValue(text);  
            i++;  
        }  

        //循環dataSet,每一條對應一行  
        int index = 0;  
        for(T data : dataSet){  
            index ++;  
            row = sheet.createRow(index);  

            int j = 0;  
            for(String property : propertyHeaderMap.keySet()){  
                XSSFCell cell = row.createCell(j);  
                cell.setCellStyle(contentStyle);  

                //拼裝getter方法名  
                String getMethodName = "get" + property.substring(0, 1).toUpperCase() + property.substring(1);  

                try {  
                    //利用反射機制獲取dataSet中的屬性值,填進cell中  
                    Class<? extends Object> tCls = data.getClass();  
                    Method getMethod = tCls.getMethod(getMethodName, new Class[] {});  
                    Object value = getMethod.invoke(data, new Object[] {}); //調用getter從data中獲取數據  

                    // 判斷值的類型后進行類型轉換  
                    String textValue = null;  
                    if (value instanceof Date) {  
                        Date date = (Date) value;  
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
                        textValue = sdf.format(date);  
                    } else {  
                        // 其它數據類型都當作字符串簡單處理  
                        textValue = value.toString();  
                    }  

                    /*if(textValue != null){ 
                        Pattern p = Pattern.compile("^//d+(//.//d+)?$"); 
                        Matcher matcher = p.matcher(textValue); 
                        if (matcher.matches()) { 
                            // 是數字當作double處理 
                            cell.setCellValue(Double.parseDouble(textValue)); 
                        } else { 
                            XSSFRichTextString richString = new XSSFRichTextString(textValue); 
                            cell.setCellValue(richString); 
                        } 
                    }*/  

                    XSSFRichTextString richString = new XSSFRichTextString(textValue);  
                    cell.setCellValue(richString);  

                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
                j++;  
            }  
        }  

        return workbook;  

    }  

    /** 
     * 生成一個標題style 
     * @return style 
     */  
    public static XSSFCellStyle getHeaderStyle(Workbook workbook){  
        return getHeaderStyle(workbook, Color.BLUE, IndexedColors.WHITE.getIndex());  
    }  

    /** 
     * 生成一個指定顏色的標題style 
     * @param workbook 
     * @param foregroundColor 
     * @param fontColor 
     * @return 
     */  
    public static XSSFCellStyle getHeaderStyle(Workbook workbook, Color foregroundColor, short fontColor){  

        // 生成一個樣式(用于標題)  
        XSSFCellStyle style = (XSSFCellStyle) workbook.createCellStyle();  
        // 設置這些樣式  
        style.setFillForegroundColor(new XSSFColor(foregroundColor));  
        style.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);  
        style.setBorderBottom(XSSFCellStyle.BORDER_THIN);  
        style.setBorderLeft(XSSFCellStyle.BORDER_THIN);  
        style.setBorderRight(XSSFCellStyle.BORDER_THIN);  
        style.setBorderTop(XSSFCellStyle.BORDER_THIN);  
        style.setAlignment(XSSFCellStyle.ALIGN_CENTER);  
        // 生成一個字體  
        XSSFFont font = (XSSFFont) workbook.createFont();  
        font.setColor(fontColor);  
        font.setFontHeightInPoints((short) 12);  
        font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);  
        // 把字體應用到當前的樣式  
        style.setFont(font);  

        return style;  
    }  

    /** 
     * 生成一個用于內容的style 
     * @param workbook 
     * @return 
     */  
    public static XSSFCellStyle getContentStyle(Workbook workbook){  
        // 生成并設置另一個樣式(用于內容)  
        XSSFCellStyle style = (XSSFCellStyle) workbook.createCellStyle();  
        //style.setFillForegroundColor(new XSSFColor(Color.YELLOW));  
        //style.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);  
        style.setBorderBottom(XSSFCellStyle.BORDER_THIN);  
        style.setBorderLeft(XSSFCellStyle.BORDER_THIN);  
        style.setBorderRight(XSSFCellStyle.BORDER_THIN);  
        style.setBorderTop(XSSFCellStyle.BORDER_THIN);  
        style.setAlignment(XSSFCellStyle.ALIGN_CENTER);  
        style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);  
        // 生成另一個字體  
        XSSFFont font = (XSSFFont) workbook.createFont();  
        font.setBoldweight(XSSFFont.BOLDWEIGHT_NORMAL);  
        // 把字體應用到當前的樣式  
        style.setFont(font);  

        return style;  
    }  

    //測試:  
    public static void main(String[] args) {  
        List<Student> dataSet = new ArrayList<Student>();  
        dataSet.add(new Student(10000001, "張三", 20, true, new Date()));  
        dataSet.add(new Student(20000002, "李麗", 24, false, new Date()));  
        dataSet.add(new Student(30000003, "王五", 22, true, new Date()));  

        LinkedHashMap<String, String> propertyHeaderMap = new LinkedHashMap<>();  
        //propertyHeaderMap.put("id", "唯一標識"); //注釋掉,不導出id  
        propertyHeaderMap.put("name", "姓名");  
        propertyHeaderMap.put("age", "年齡");  
        propertyHeaderMap.put("sexName", "性別"); //直接獲取Student中的sexName,而不是sex  
        propertyHeaderMap.put("birthday", "生日");  

        try {  
            XSSFWorkbook ex = ExcelUtil.generateXlsxWorkbook("測試tab", propertyHeaderMap, dataSet);  
            OutputStream out = new FileOutputStream("F://student3.xlsx");  
            ex.write(out);  
            System.out.println("導出成功!");  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}  </pre> 


測試結果(性別已經自動轉換為中文):


姓名 年齡 性別 生日
張三 20 2014-12-24
李麗 24 2014-12-24
王五 22 2014-12-24
 本文由用戶 wdfd 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!