java poi导出Excel

由于ajax请求不能下载,故先利用ajax将请求数据提交到后台,存入redis,并返回一个uuid,然后在ajax请求成功之后用window.location.href进行下载。

另外因为需求原因,Excel列数和列title是动态的,所以利用反射创建工作簿。

HSSFWorkbook wb = CreateExcelByReflect.createWb(data);//创建工作簿

String fileName ="任务表" +new Date().getTime() +".xls";

OutputStream out =null;

try {

out = response.getOutputStream();

response.reset();

response.setHeader("Content-Disposition","attachment;filename="

            .concat(String.valueOf(URLEncoder.encode(fileName,"UTF-8"))));

response.setContentType("application/ms-excel;charset=UTF-8");

wb.write(out);

out.flush();

out.close();

}catch (IOException e) {

e.printStackTrace();

}

public class CreateExcelByReflect {

private static HSSFSheetsheet;//表格对象

    private static HSSFWorkbookwb;//工作簿

    private static LinkedHashMapheader;//表头

    //初始化

    public static void init(String sheetName,JSONArray titleArr) {

wb =new HSSFWorkbook();

sheet =wb.createSheet(sheetName);

header =new LinkedHashMap();

for(Object title : titleArr){

JSONObject obj = (JSONObject) JSON.toJSON(title);

header.put(obj.getString("key"), obj.getString("title"));

}

}

/**

    * 创建各列表头

    */

    public static void createHeadRow(){

HSSFRow head =sheet.createRow(0);//创建表格第一行对象,为表头行

        Iterator> headTitle =header.entrySet().iterator();//循环输出表头

        for(int i=0;headTitle.hasNext();i++){

HSSFCell cell = head.createCell(i);

cell.setCellValue(headTitle.next().getValue());

}

}

/**

    * 创建数据行

    */

    public static void createRows(List data){

int rowCount = data.size();//根据数据集设置行数

        for(int i=0;i

HSSFRow row =sheet.createRow(i+1);//创建行,表头是第0行

            //转换数据,将每一个DO映射为属性名与FieldsEntity的Map

            Map map = DataConvertUtil.convertObjectToMap(data.get(i));

Iterator> head =header.entrySet().iterator();

//创建每行的单元格并填充值

            for(int col =0;col

HSSFCell cell = row.createCell(col);

//设置表头的迭代器

                Map.Entry enty = (Map.Entry)head.next();

String name = enty.getKey();

Object value = map.get(name);

if(null != value){

cell.setCellValue(map.get(name).getValue().toString());//填充属性值

                }

}

}

}

public static HSSFWorkbook createWb(String sheetName,JSONArray titleArr, List data){

init(sheetName, titleArr);

createHeadRow();

createRows(data);

return wb;

}

}



public class DataConvertUtil {

/**

    * 将对象的属性名称与值映射为MAP

    * @param o 对象

    * @return  Mapkey为属性名称,value为名称、类型和值组成的对象

    */

    public static Map convertObjectToMap(Object o){

Class oClass = o.getClass();

//        Field[] fields = oClass.getDeclaredFields();  //获取类中的所有声明的属性

        Field[] fields =getBeanFields(oClass, oClass.getDeclaredFields());

Map map =new HashMap();

try{

for(int i=0;i

//                不对序列化ID进行映射

                if(fields[i].getName().equals("serialVersionUID")){

continue;

}

Object valueObject =getFieldValue(o,fields[i].getName());

map.put(fields[i].getName(),new FieldsEntity(fields[i].getName(), valueObject, fields[i].getType()));

}

return map;

}catch(Exception e){

e.printStackTrace();

}

return map;

}

public static Field[] getBeanFields(Class cls,Field[] fs){

fs = (Field[]) ArrayUtils.addAll(fs, cls.getDeclaredFields());

if(cls.getSuperclass()!=null){

Class clsSup = cls.getSuperclass();

fs =getBeanFields(clsSup,fs);

}

return fs;

}

/**

    * 通过对象的getter方法获取属性值

    * @param o 对象

    * @param name 属性名称

    * @return 相应属性的值

    */

    public static Object getFieldValue(Object o,String name)throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InvocationTargetException {

Class owner = o.getClass();

Method mothed = owner.getMethod(createGetter(name));

Object object = mothed.invoke(o);

return object;

}

/**

    * 通过属性名称拼凑getter方法

    * @param fieldName

    * @return

    */

    public static String createGetter(String fieldName){

if(fieldName ==null || fieldName.length() ==0 ){

return null;

}

StringBuffer sb =new StringBuffer("get");

sb.append(fieldName.substring(0,1).toUpperCase()).append(fieldName.substring(1));

return sb.toString();

}

}



public class FieldsEntity {

private StringattributeName;//属性变量名称

    private Objectvalue;//属性变量值

    private ClassclassType;//属性类型

    public String getAttributeName() {

return attributeName;

}

public void setAttributeName(String attributeName) {

this.attributeName = attributeName;

}

public Object getValue() {

return value;

}

public void setValue(Object value) {

this.value = value;

}

public Class getClassType() {

return classType;

}

public void setClassType(Class classType) {

this.classType = classType;

}

public FieldsEntity(String fieldName, Object o, Class classType){

this.attributeName = fieldName;

this.value = o;

this.classType = classType;

}

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 背对背走,我走的也不快,你走的也挺慢,但是我们的距离成倍增加,因此遥遥不可及。 坐在火车上,思念就像一辆失控了的...
    虔诚念_莫小媛阅读 150评论 0 1
  • 2013相识 新生入学 我去的很晚 晚两天 所以只能入住混合宿舍 两天后 宿舍里出现陌生的面孔 她穿着蓝色短袖...
    努力努力再努力Xu阅读 298评论 0 0
  • 【2018年本企业千万目标势必达成】 【 今年势必会孵化出二个年薪30 万以上,三个年薪 20万以上,十个年薪 1...
    大德帅帅阅读 76评论 0 0
  • 听到舒淇婚讯的时候,我正穿着前男友衬衫披头散发坐在租来的房子客厅里吹着穿堂风吃一碗绿茶冰激凌,不禁扔了冰激凌碗浑身...
    簡詩詩阅读 917评论 2 2