JAVA——導出excel表格

package mytest.test;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;java

import mytest.pojo.ExcelUser;
import mytest.pojo.User;數組

import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;服務器

/**
 * 將list對象 導出爲excel表格的形式
 * Title:
 * Description: TestDemo
 * @author lu
 * @date 2016年7月19日 下午3:17:28
 */
public class ExcelTest {
    public static void outputExcelData() throws IOException, WriteException {
        /*一、設置寫入excel表格的值
         * 這裏可擴展爲在數據中調取的相關的數據*/
        List<User> result = new ArrayList<User>();
        User user = new User();
        user.setTest_id("1");
        user.setUser_name("zhangyang");
        result.add(user);
        User user2 = new User();
        user2.setTest_id("2");
        user2.setUser_name("shanghai");
        result.add(user2);
        User user3 = new User();
        user3.setTest_id("1");
        user3.setUser_name("beijing");
        result.add(user3);
        User user4 = new User();
        user4.setTest_id("4");
        user4.setUser_name("shanghai");
        //result:要寫入的數據list
        result.add(user4);
        /*二、設置文件的名字和導出的位置
         * 這裏可擴展爲服務器地址或者是硬盤地址*/
        String fileName = "D://sheet.xls";
        File dbfFile = new File(fileName);
        //若是該文件不存在或者是一個目錄,就建立文本【createNewFile】
        if (!dbfFile.exists() || dbfFile.isDirectory()) {
            dbfFile.createNewFile();
        }
        /*三、Workbook類的工廠方法建立一個可寫入的工做薄(Workbook)對象*/
        WritableWorkbook wwb = Workbook.createWorkbook(new File(fileName));
        int totle = result.size();//獲取List集合的size
        int mus = 2;//每一個工做表格最多存儲2條數據(注:excel表格一個工做表能夠存儲65536條)
        int avg = totle / mus; //定義sheet的數目
        for (int i = 0; i < avg ; i++) {
            /*使用createSheet(String,int)傳入的int型參數表明sheet號,
            0是第一頁,1是第二頁,依次類推,打開Excel表格在底端能夠看到,編號最小的頁在最左邊。
            */
            WritableSheet ws = wwb.createSheet("列表" + (i + 1), i); //建立一個可寫入的工做表sheet
            //添加表頭 label爲一個單元格對象
            ws.addCell(new Label(0, 0, "序號"));//Label(0,0,"xx"):第(0,0)[一個格子]中的名字爲xx;x軸與y軸
            ws.addCell(new Label(1, 0, "姓名"));
            int num = i * mus;//由於分爲了多個sheet,使用num控制每一次重新的sheet開始的時候的第一個值
            int index = 0;
            for (int m = num; m < result.size(); m++) {
                if (index == mus) {//判斷index == mus的時候跳出當前for循環
                    break;
                }
                User use = (User) result.get(m);
                //將生成的單元格添加到工做表中
                //(這裏須要注意的是,在Excel中,第一個參數表示列,第二個表示行)
                ws.addCell(new Label(0, index + 1, use.getTest_id()));
                ws.addCell(new Label(1, index + 1, use.getUser_name()));
                //控制多個sheet
                index++;
            }
        }
        wwb.write();//從內存中寫入文件中
        wwb.close();//關閉資源,釋放內存
    }
    //測試
    public static void main(String[] args) throws Exception {
       /* try {
            outputExcelData();
            System.out.println("導出爲Excel表格完成!");
        } catch (WriteException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }*/
        ExcelUser euser =new ExcelUser();
        List<ExcelUser> list = new ArrayList<ExcelUser>();
        euser.setId("1");
        euser.setName("shanghai");
        euser.setDept("直轄市");
        list.add(euser);
        ExcelUser euser2 = new ExcelUser();
        euser2.setId("2");
        euser2.setName("北京");
        list.add(euser2);
        ExcelUser euser3 = new ExcelUser();
        euser3.setId("3");
        euser3.setName("重慶");
        list.add(euser3);
        outToExcelForObject(list,"D://mysheet2.xls");
        /*outToExcel(list, "D://mysheet3.xls");*/
        
    }
    
    //導出EXCEL方法的封裝
    /**
     *
     * @param obj 要導出的對象
     * @param str 導出的文件位置
     * @throws IOException
     * @throws BiffException
     */
    public static void outToExcelForObject(List<?> list,String str) throws Exception{
        //1.根據str建立文件
        File file = null;
        if(str!=null){
            file= new File(str);
            if(!file.exists() || file.isDirectory()){
                file.createNewFile();
            }
        }
        //2.建立文件對應的可寫入的工做薄(Workbook)對象
       WritableWorkbook wwb = Workbook.createWorkbook(file);
       //3.讀取List<Obejct> list
       int listNum = list.size();
       int mus = 2;//每一個工做表格最多存儲2條數據(注:excel表格一個工做表能夠存儲65536條)
       int sheetNum =listNum/mus; //獲取sheet的數目
       //先以每個sheet進行循環
       for(int i = 0;i<sheetNum+1;i++){
           //建立一個可寫入的工做表sheet
           WritableSheet ws = wwb.createSheet("列表" + (i + 1), i);
           //把list中的對象 寫入到sheet中
           int num = i * mus;  //控制起始的數目
           //控制break
           int index = 0;
           for(int j = num;j<listNum;j++){
               if(index == mus){
                   break;//一個sheet中只寫2條記錄,當有2條記錄就跳出本次for循環
               }
               //獲取obj對象的class對象
               Class clas = list.get(j).getClass();
               //獲取屬性集合
               Field[] fields = clas.getDeclaredFields();
               //遍歷fields,封裝爲屬性名數組
               String [] filedNames = new String[fields.length];
               for (int k = 0; k < fields.length; k++) {
                   //獲得屬性名
                   filedNames[k] = fields[k].getName();
                   //爲ws添加表頭
                   ws.addCell(new Label(k, 0, fields[k].getName()));
               }
               //根據屬性名,執行getXxx方法,返回屬性值    
               List<String> valueList = new ArrayList<String>();
               for (String fName : filedNames) {
                   //首字母大寫
                   String firstUp = fName.substring(0, 1).toUpperCase();
                   //拼寫getXxx方法
                   String getName = "get"+firstUp+fName.substring(1);
                   //獲取method對象
                   Method method = clas.getMethod(getName);
                   //執行方法
                   String filedValue = (String)method.invoke(list.get(j));
                   valueList.add(filedValue);
                }
               //將獲得的值列表valueList寫到sheet中
               for(int g=0;g<valueList.size();g++){
                   ws.addCell(new Label(g, index + 1, (String)valueList.get(g)));           
               }
               index++;
           }
           
       }
       wwb.write();//從內存中寫入文件中
       wwb.close();//關閉資源,釋放內存  
    }
    /**
     * 根據list和定義的excel的位置導出excel
     * @param list
     * @param str
     * @throws Exception
     */
    public static void outToExcel(List<?> list, String str) throws Exception{
        //根據str建立excel位置
        File file = new File(str);
        if(!file.exists() || file.isDirectory()){
            file.createNewFile();
        }
        //建立能夠寫入的workbook對象
        WritableWorkbook wwbook = Workbook.createWorkbook(file);
        int listNum = list.size();
        int sheetSize = 2; //定義每個sheet中存放2條記錄
        int sheetNum = listNum/sheetSize; //獲取sheet的數目
        //根據定義的每個sheet包含的記錄,一個sheet一個sheet的循環寫入list中的對象的屬性值
        for(int i=0;i<sheetNum+1;i++){
            //建立一個sheet
            WritableSheet wsheet = wwbook.createSheet("列表" + (i + 1), i);
            //位sheet添加表頭
            wsheet.addCell(new Label(0,0,"序號"));
            wsheet.addCell(new Label(1,0,"姓名"));
            wsheet.addCell(new Label(2,0,"地址"));
            //將list的對象寫入到sheet中
            int num = i*sheetSize;
            int index = 0;
            for(int j = num;j<listNum;j++){
                if(index == sheetSize){
                    break;  //每2條就跳出本次循環
                }
                //將list中的對象寫入到sheet中
                //1.獲取對象的Classs類對象
                Class<?> clas = list.get(j).getClass();
                //2.經過Class對象獲得該對象的屬性集合
                Field[] fields = clas.getDeclaredFields();
                //3.經過屬性集合獲取到屬性名稱的集合
                List<String> fieldNameList = new ArrayList<String>();
                for (Field field : fields) {
                    String name = field.getName();
                    System.out.println(name+":屬性名稱");
                    fieldNameList.add(name);
                }
                //4.經過屬性名稱集合獲取到對應的屬性值集合
                    //4.1經過屬性名稱拼寫對象的getXxx方法
                    //4.2經過getXxx方法獲取到Method對象
                    //4.3經過method對象來獲得對應的屬性值
                List<String> valueList = new ArrayList<String>();
                for (String strName : fieldNameList) {
                    strName = "get"+strName.substring(0,1).toUpperCase()+strName.substring(1);
                    Method method = clas.getMethod(strName, new Class[]{});
                    strName = (String)method.invoke(list.get(j));
                    System.out.println(strName+":屬性值");
                    valueList.add(strName);
                }
                //5.把獲得的屬性值列表添加到sheet中
                for (int k = 0; k < valueList.size(); k++) {
                    wsheet.addCell(new Label(0,index+1,valueList.get(k)));
                }
                index++;
            }    
        }
    }
}測試

相關文章
相關標籤/搜索