利用Java反射、泛型和apache/poi编写可通用的导出Excel代码

最近项目多处用到excel导出功能,每次都要copy上次写好的导出代码来改,太麻烦,干脆写了一个稍微可以通用的导出excel代码,
/**
 * Created by DX.liu on 2015/4/14.
 */
public class ExportUtil {
    /**
     *
     * @param <T>
     *@param sheetName 创建的表格sheet名称
     * @param params 需创建的excel列名数组,数组元素必须以“名称(filed)”命名 ,如:名称(name),其中‘name’是实体类中对应的字段名!
     *               {"用户名(userName)","密码(password)","性别(sex)","邮箱(email)","年龄(age)","电话(phone)"}
     * @param objects 实体对象list
     * @return
     * @throws IllegalAccessException
     * @throws IllegalArgumentException
     */
    public static  <T> HSSFWorkbook exp(String sheetName,String[] params,List<T> objects) throws IllegalArgumentException, IllegalAccessException{
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet(sheetName);
        HSSFRow row = sheet.createRow(0);
        // 创建单元格,并设置值表头 设置表头居中
        HSSFCellStyle style = workbook.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 创建一个居中格式
        HSSFCell cell = null;
        String[] fields = new String[params.length];
        for(int i=0;i<params.length;i++){
            int x =params[i].indexOf("(");//获取“(”的下标位置
            int y = params[i].indexOf(")");//获取“)”的下标位置
            String str = params[i].trim().substring(x+1,y);//获取属性“field”
            String str1 = params[i].substring(0,x);//获取列名
            fields[i] = str;
            cell = row.createCell(i);
            cell.setCellValue(str1);
            cell.setCellStyle(style);
        }
        for(int i=0;i<objects.size();i++){
            row = sheet.createRow(i + 1);
            Class c = objects.get(i).getClass();
            Field[] fields2 = c.getDeclaredFields();//获取所有属性
            for(int j=0;j<fields.length;j++){
                for(Field f : fields2){
                    f.setAccessible( true );//设置私有属性可见
                    String fieldName = f.getName();
                    if(fields[j].equals(fieldName)){
                        if(null != f.get(objects.get(i))){
                            row.createCell(j).setCellValue(""+f.get(objects.get(i)));
                        }else{
                            row.createCell(j).setCellValue("");
                        }
                    }
                }
            }
        }
        return workbook;
    }

    /**
     *
     * @param excellName 生成Excell文件名
    *  @param sheetName 创建的表格sheet名称
     * @param params 需创建的excel列名数组,数组元素必须以“名称(filed)”命名 ,如:名称(name),其中‘name’是实体类中对应的字段名!
     *               {"用户名(userName)","密码(password)","性别(sex)","邮箱(email)","年龄(age)","电话(phone)"}
     * @param objects 实体对象list
     * @param response
     * @param <T>
     */
    public static <T>void exportExcell(String excellName,String sheetName,String[] params,List<T> objects,HttpServletResponse response) {
        OutputStream os = null;
        try {
            response.addHeader("Content-Disposition", "attachment;filename=" + new String(excellName.getBytes("GBK"), "ISO-8859-1"));
            os = response.getOutputStream();
            HSSFWorkbook workbook = exp(sheetName, params, objects);
            workbook.write(os);
            os.close();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(null != os){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值