Excel封装类 导成excel 封装思路

来源:互联网 发布:福建广电网络宽带 编辑:程序博客网 时间:2024/05/16 15:24

封装Excel导出类

初始版本:SXSSFWorkbook wb = new SXSSFWorkbook(-1);        Sheet sh = wb.createSheet();            // 创建一个行        Row row = sh.createRow(0);        Cell cell = row.createCell(0);        String address = new CellReference(cell).formatAsString();//单元格地址        cell.setCellValue(address);        ((SXSSFSheet)sh).flushRows(100); // retain 100 last rows and flush all others        FileOutputStream fos = new FileOutputStream(new File("d://test.xlsx"));        wb.write(fos);        fos.close();        wb.dispose();

这里写图片描述

这里写图片描述
封装思路:

1. 因为要写到硬盘 细分成四个属性    /** 导出文件的存放路径 */    private String filePath;    /** 下载导出文件的路径 */    private String fileWebPath;    /**文件名称前缀*/    private String filePrefix;    /**导出文件全路径*/    private String fileAllPath;2. * 刷新需要设置变量,定义属性   * 行数 列表可变定义变量   × excel各个列都会有标题,定义List属性   *  每一行就是一个对象,每个列就是其中一个属性      通过反射来对列值进行设置,      定义一个List 属性    /**     * 定义保存在内存中的数量,-1表示手动控制     */    private int flushRows;    /** 导出文件行数 */    private int rownum;    /** 导出文件列数 */    private int colnum;    /** 导出文件列标题 */    private List<String> fieldNames;    /**导出文件每列代码,用于反射获取对象属性值*/    private List<String> fieldCodes;3. 初始化方法* 创建对象 初始化赋值* 设置标题public static ExcelExportSXXSSF start(String filePath, String fileWebPath,String filePrefix,            List<String> fieldNames,List<String> fieldCodes, int flushRows) throws Exception {        ExcelExportSXXSSF excelExportSXXSSF = new ExcelExportSXXSSF();        excelExportSXXSSF.setFilePath(filePath);        excelExportSXXSSF.setFileWebPath(fileWebPath);        excelExportSXXSSF.setFilePrefix(filePrefix);        excelExportSXXSSF.setFieldNames(fieldNames);        excelExportSXXSSF.setFieldCodes(fieldCodes);        excelExportSXXSSF.setWb(new SXSSFWorkbook(flushRows));//创建workbook        excelExportSXXSSF.setSh(excelExportSXXSSF.getWb().createSheet());//创建sheet        excelExportSXXSSF.writeTitles();        return excelExportSXXSSF;    }5.设置导入文件的标题 提出一个方法     /**     * 设置导入文件的标题     * 开始生成导出excel的标题     */    private void writeTitles() throws Exception {        rownum = 0;//第0行        colnum = fieldNames.size();//根据列标题得出列数        Row row = sh.createRow(rownum);        for (int cellnum = 0; cellnum < colnum; cellnum++) {            Cell cell = row.createCell(cellnum);            cell.setCellValue(fieldNames.get(cellnum));        }    }6.向导出文件写数据  * 向列里写数据 需要反射 提出一个方法/**     * 向导出文件写数据     * @param datalist     *            存放Object对象,仅支持单个自定义对象,不支持对象中嵌套自定义对象     * @return     */    public void writeDatasByObject(List datalist) throws Exception {        for (int j = 0; j < datalist.size(); j++) {            // 0行是标题所以从1行开始 行和列设置            rownum = rownum + 1;            Row row = sh.createRow(rownum);            for (int cellnum = 0; cellnum < fieldCodes.size(); cellnum++) {                Object owner = datalist.get(j);                Object value = invokeMethod(owner, fieldCodes.get(cellnum),                        new Object[] {});                Cell cell = row.createCell(cellnum);                cell.setCellValue(value!=null?value.toString():"");            }        }    }7. 反射的方法/**     * 反射方法,通过get方法获取对象属性     */    private Object invokeMethod(Object owner, String fieldname, Object[] args)            throws Exception {        String methodName = "get" + fieldname.substring(0, 1).toUpperCase()                + fieldname.substring(1);        Class ownerClass = owner.getClass();        Class[] argsClass = new Class[args.length];        for (int i = 0, j = args.length; i < j; i++) {            argsClass[i] = args[i].getClass();        }        Method method = ownerClass.getMethod(methodName, argsClass); // 第二个参数是方法的形参 Class 类型 比如String        return method.invoke(owner, args);    }8. 导出文件 返回下载的地址** 导出方法 返回下载的路径/**  导出文件 */    public String exportFile() throws Exception {        String filename = filePrefix+"_"+MyUtil.getCurrentTimeStr() + ".xlsx";        FileOutputStream out = new FileOutputStream(filePath + filename);        wb.write(out);        out.flush();        out.close();        setFileAllPath(fileWebPath + filename);        return fileWebPath + filename;    }    //  测试//导出文件存放的路径,并且是虚拟目录指向的路径        String filePath = "d:/upload/linshi/";        //导出文件的前缀        String filePrefix="ypxx";        //-1表示关闭自动刷新,手动控制写磁盘的时机,其它数据表示多少数据在内存保存,超过的则写入磁盘        int flushRows=100;        //指导导出数据的title        List<String> fieldNames=new ArrayList<String>();        fieldNames.add("流水号");        fieldNames.add("通用名");        fieldNames.add("价格");        //告诉导出类数据list中对象的属性,让ExcelExportSXXSSF通过反射获取对象的值        List<String> fieldCodes=new ArrayList<String>();        fieldCodes.add("bm");//药品流水号        fieldCodes.add("mc");//通用名        fieldCodes.add("price");//价格        //注意:fieldCodes和fieldNames个数必须相同且属性和title顺序一一对应,这样title和内容才一一对应        //开始导出,执行一些workbook及sheet等对象的初始创建        ExcelExportSXXSSF excelExportSXXSSF = ExcelExportSXXSSF.start(filePath, "/upload/", filePrefix, fieldNames, fieldCodes, flushRows);        //准备导出的数据,将数据存入list,且list中对象的字段名称必须是刚才传入ExcelExportSXXSSF的名称        List<Ypxx> list = new ArrayList<Ypxx>();        Ypxx ypxx1 = new Ypxx("001", "青霉素", 5);        Ypxx ypxx2 = new Ypxx("002", "感冒胶囊", 2.5f);        list.add(ypxx1);        list.add(ypxx2);        //执行导出        excelExportSXXSSF.writeDatasByObject(list);        //输出文件,返回下载文件的http地址        String webpath = excelExportSXXSSF.exportFile();
原创粉丝点击