博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA——导出excel表格
阅读量:6903 次
发布时间:2019-06-27

本文共 6612 字,大约阅读时间需要 22 分钟。

hot3.png

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

 

           

  

转载于:https://my.oschina.net/u/2870118/blog/726359

你可能感兴趣的文章
我的友情链接
查看>>
我的友情链接
查看>>
Android UI开发第二十八篇——Fragment中使用左右滑动菜单
查看>>
[awk] 用-F指定多分隔符实例_备忘
查看>>
我的友情链接
查看>>
C++字符串高效查找替换
查看>>
62.菜鸟福音 60条笔记本电脑使用经典技巧
查看>>
mysql全备脚本,此脚本可以备份多个数据库,单独文件夹
查看>>
mysql的双机热备
查看>>
linux第一课
查看>>
Spring3中好用的工具类收集
查看>>
Python用pip 安装lxml时出现 “Unable to find vcvarsall.bat ”解决方案
查看>>
我的友情链接
查看>>
java单例模式之线程安全问题
查看>>
Notes打不开的故障总结
查看>>
WEB打印控件Lodop(V6.x)
查看>>
我的友情链接
查看>>
UI集成测试运行说明
查看>>
ES与Javscript,JScript,ActionScript等脚本
查看>>
断点的技巧
查看>>