java-excle详解

这几个月经常做excel的导出,今天就整理一下吧!!!

动态导出excel,通用与各种title的excel ,不需要模板和excel注解类

  1     /**
  2      * 导出餐费统计excel
  3      */
  4     public void exportAttendList(){
  5
  6         ByteArrayOutputStream baos = null;
  7         ByteArrayInputStream bais = null;
  8         try {
  9             if (StringUtils.isBlank(param)) {
 10                 this.writeJson("0");
 11                 return;
 12             }
 13             //获取前台的参数
 14             JSONObject jo = JSONObject.parseObject(this.param);
 15             List<String> dateList = com.alibaba.fastjson.JSONArray.toJavaObject(jo.getJSONArray("dateList"), List.class);
 16
 17             //对前台的数据进行判断
 18             Integer classId = jo.getInteger("classId");
 19             if (dateList == null || dateList.size() == 0|| classId == null) {
 20                 this.writeJson(null, EcloudConstants.Flag.FAILURE.getIndex()
 21                         + "", "");
 22                 return;
 23             }
 24             List<Map<String, Object>> list = this.getiEcloudAttendService().findEcloudAttendCountList(dateList, classId, getUserDto().getSchoolId());
 25             // 初始化参数
 26             String title = "序号,学号,姓名,连续请假次数,连续请假详情";
 27             String titleName = "index,ecloudStudentNo,userName,count,list";
 28             //设置文件导出的名称   字符串加时间拼接
 29             String fileName = "餐费统计表"+new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
 30
 31             // 声明一个工作薄
 32             HSSFWorkbook wb = new HSSFWorkbook();
 33             // 声明一个单子并命名
 34             HSSFSheet sheet = wb.createSheet(fileName);
 35             // 给单子名称一个长度
 36             sheet.setDefaultColumnWidth((short) 15);
 37
 38             //设置列宽
 39             sheet.setColumnWidth(0, "学号".getBytes().length * 2 * 256);
 40             sheet.setColumnWidth(4, "2017-03-13 -- 2017-03-15 ( 3天 )".getBytes().length * 1 * 256);
 41             // 生成一个样式
 42             HSSFCellStyle style = wb.createCellStyle();
 43             // 创建第一行(也可以称为表头)
 44             HSSFRow row = sheet.createRow(0);
 45             // 样式字体居中
 46             style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
 47             style.setWrapText(true);
 48
 49             // 给表头第一行一次创建单元格
 50             int i = 0;
 51             for (String entry : title.split(",")) {
 52                 HSSFCell cell = row.createCell((short) i++);
 53                 cell.setCellValue(entry);
 54                 cell.setCellStyle(style);
 55             }
 56
 57             for (int b=0; b<list.size(); b++) {
 58                 Map map = list.get(b);
 59                 row = sheet.createRow(b + 1);
 60                 for (int j = 0; j < titleName.split(",").length; j++) {
 61                     HSSFCell cell = row.createCell((short) j);
 62                     String name = titleName.split(",")[j];
 63                     if (name.equals("index")) {
 64                         //记录序号    由于这个参数是递增的,所以需要自定义判断
 65                         cell.setCellValue(b + 1 + "");
 66                     } else {
 67                         //遍历请假记录
 68                         if (name.equals("list")) {
 69                             List<String> list2 = (List<String>) map.get(name);
 70                             //设置行高   使用list的大小对行高进行设置
 71                             row.setHeight((short)(list2.size()*250));
 72                             String t = "";
 73                             //把list转为我们想要的参数    并加入换行符  最后不加
 74                             for (int k = 0; k < list2.size(); k++) {
 75                                 t=k!=list2.size()-1?(t+list2.get(k)+"\r\n"):t+list2.get(k);
 76                             }
 77                             cell.setCellValue(t);
 78                         }else if(name.equals("count")){
 79                             //请假次数  根据需求增加一些字符串拼接
 80                             cell.setCellValue(map.get(name) != null ? map.get(name).toString()+"次": "");
 81                         }else{
 82                             //普通内容渲染
 83                             cell.setCellValue(map.get(name) != null ? map.get(name).toString(): "");
 84                         }
 85                     }
 86                     cell.setCellStyle(style);
 87                 }
 88             }
 89
 90             //下面这段是一个固定的文件输出格式
 91             baos = new ByteArrayOutputStream();
 92             wb.write(baos);
 93             HttpServletResponse response = this.getResponse();
 94             response.setContentType("application/vnd.ms-excel;charset=utf-8");
 95             String filename = this.encodeDownloadFilename(fileName,
 96                     getRequest().getHeader("User-Agent")) + ".xls";
 97             response.setHeader("Content-Disposition", "attachment;filename="
 98                     + filename);
 99             bais = new ByteArrayInputStream(baos.toByteArray());
100             int b;
101             while ((b = bais.read()) != -1) {
102                 response.getOutputStream().write(b);
103             }
104             response.getOutputStream().flush();
105             bais.close();
106             baos.close();
107         } catch (Exception e) {
108             e.printStackTrace();
109             this.writeJson("0");
110         }
111     }
112     

时间: 2024-10-23 03:08:11

java-excle详解的相关文章

package-info.java文件详解

package-info.java文件详解 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.pacakge-info.java介绍 pacakge-info.java是一个Java文件,可以添加到任何的Java源码包中.pacakge-info.java的目标是提供一个包级的文档说明或者是包级的注释. pacakge-info.java文件中,唯一要求包含的内容是包的声明语句,比如: package com.ch.service; 二.包文档 在

java 反射 详解

本文来自:blog.csdn.net/ljphhj JAVA反射机制:   通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们. 理论的东东太多也没用,下面我们看看实践 Demo - Demo: package cn.lee.demo; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import

Java synchronized详解

Java synchronized详解 第一篇: 使用synchronized 在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题.在Java中内置了语言级的同步原语--synchronized,这也大大简化了Java中多线程同步的使用.我们首先编写一个非常简单的多线程的程序,是模拟银行中的多个线程同时对同一个储蓄账户进行存款.取款操作的. 在程序中我们使用了一个简化版本的Account类,代表了一个银行账户的信息.在主程序中我们首先生成了1000个线程,然后启动它们

Java虚拟机详解——JVM常见问题总结

[正文] 声明:本文只是做一个总结,有关jvm的详细知识可以参考之前的系列文章,尤其是那篇:Java虚拟机详解04--GC算法和种类.那篇文章和本文是面试时的重点. 面试必问关键词:JVM垃圾回收.类加载机制. 先把本文的目录画一个思维导图:(图的源文件在本文末尾) 一.Java引用的四种状态: 强引用:  用的最广.我们平时写代码时,new一个Object存放在堆内存,然后用一个引用指向它,这就是强引用. * 如果一个对象具有强引用,那垃圾回收器绝不会回收它*.当内存空间不足,Java虚拟机宁

Java引用类型详解

JVM  的垃圾回收器对于不同类型的引用有不同的处理方式.java中对于一个对象来说,只要有引用的存在,它就会一直存在于内存中.如果这样的对象越来越多,超出了JVM中的内存总数,JVM就会抛出OutOfMemory错误.虽然垃圾回收的具体运行是由JVM来控制的,但是开发人员仍然可以在一定程度上与垃圾回收器进行交互,其目的在于更好的帮助垃圾回收器管理好应用的内存.这种交互方式就是使用JDK1.2 引入的  java.lang.ref包. 强引用(strong reference) 在一般的 Jav

Java堆栈详解 .

1. Java中堆栈(stack)和堆(heap) (1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不 允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求.栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的

Java网络详解

Java网络详解 Java网络基本概念 网络基础知识 1.计算机网络形式多样,内容繁杂.网络上的计算机要互相通信,必须遵循一定的协议.目前使用最广泛的网络协议是Internet上所使用的TCP/IP协议 2.网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯.网络编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上

Java面向对象详解

Java面向对象详解 前言:接触项目开发也有很长一段时间了,最近开始萌发出想回过头来写写以前学 过的基础知识的想法.一是原来刚开始学习接触编程,一个人跌跌撞撞摸索着往前走,初学的时候很多东西理解的也懵懵懂懂,后来实践的多了,有些东西才慢慢清 楚:二是经过一定的实践之后,反过头来再去学习一些基础东西才能够理解的更透彻:三是有些东西基础但是确很重要,是值得好好搞一搞的. 1.面向对象 面向对象(Object Oriented)是一种新兴的程序设计方法,或者是一种新的程序设计规范(paradigm),

Java反射详解

Java反射详解 分类:java, 基础日期:2012-07-20作者:ticmy 19 反射,是Java中非常重要的一个功能,如果没有反射,可以说很多框架都难以实现. 什么是反射?说白了就是可以通过Java代码获取装载到方法区的类信息的手段. 当装载一个类时,会在方法区产生一个数据结构,该结构中包含着装载的类的相关信息.字节码可以看成是数据流,那么方法区的这种数据结构可以说是字节码数据流的结构化表现.装载的最终产物就是java.lang.Class类的一个对象,它是Java程序与方法区内部数据

java多线程详解

转自:线程间通信.等待唤醒机制.生产者消费者问题(Lock,Condition).停止线程和守护线程.线程优先级 1  线程间通信 1.1  线程间通信 其实就是多个线程在操作同一个资源,但是操作的动作不同. 比如一个线程给一个变量赋值,而另一个线程打印这个变量. 1.2  等待唤醒机制 wait():将线程等待,释放了CPU执行权,同时将线程对象存储到线程池中. notify():唤醒线程池中一个等待的线程,若线程池有多个等待的线程,则任意唤醒一个. notifyAll():唤醒线程池中,所有