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++;
}
}
}
}測試