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;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 * lu * 2016年7月19日 下午3:17:28 */ public class ExcelTest { public static void outputExcelData() throws IOException, WriteException { /*1、设置写入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); /*2、设置文件的名字和导出的位置 * 这里可扩展为服务器地址或者是硬盘地址*/ String fileName = "D://sheet.xls"; File dbfFile = new File(fileName); //如果该文件不存在或者是一个目录,就创建文本【createNewFile】 if (!dbfFile.exists() || dbfFile.isDirectory()) { dbfFile.createNewFile(); } /*3、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方法的封装 /** * * obj 要导出的对象 * str 导出的文件位置 * 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++; } } } }