将数据以Excel表格的形式导出:
首先下载poi的jar包,导入项目中,或者使用maven仓库管理,在pom文件添加:
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.9</version>
</dependency>

前端代码:
页面上定义下载/导出按钮,点击按钮时下载/导出,如:
<button class="" id="exportDate" onclick="exportDate()">下载/导出</button>

function exportDate(){
    var url="";    //路径
    window.open(url);
}
后端代码:
Controller层:
@RequestMapping(value="/exportDate",method=RequestMethod.GET)
public void exportDate(需要接受的参数/条件,HttpServletResponse response) throws Exception{
    //如涉及权限/级别/条件等,先进行判断;
    //根据条件等查询要导出的数据
    List<Object> list = 查询要导出的数据;
    //可先判断要导出的数据的数量来确定使用HSSFWorkbook工具类或者SXSSFWorkbook工具类
    if(list.size()>60000){
        list = list.subList(0,60000);
    }
    //将数据放入HSSFWorkbook对象中
    HSSFWorkbook wb = xxxService.getWb(list);
    //大数据量时使用SXSSFWorkbook工具类
    //SXSSFWorkbook wb = xxxService.getWb(list);
    //定义导出的表名
    String fileName = URLEncoder.encode("表名"+".xls","UTF-8");
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    wb.write(os);
    if(os.size() > 0){
        response.setContentType("application/octet-stream");
        response.addHeader("Content-Disposition","attachment;filename="+fileName);
        response.addHeader("Content-Length",""+os.size());
        IOUtils.write(os.toByteArray(),response.getOutputStream());
        response.getOutputStream().flush();
    }
    os.close();
}

获取HSSFWorkbook/SXSSFWorkbook工具类对象的方法,可写在service层
一、HSSFWorkbook工具类(导出.xls格式文件)
HSSFWorkbook对象,最多支持65535行,适用一般数据量少导出
//适用公共方法获取表单元格标题
public HSSFWorkbook getWb(List<Object> list) throws Exception{
    //创建对象
    HSSFWorkbook wb = new HSSFWorkbook();
    //创建一个sheet
    HSSFSheet sheet = wb.createSheet("sheet名");
    //添加表头
    HSSFRow row = sheet.createRow((int)0);
    //单元格样式
    HSSFCellStyle style = wb.createCellStyle();
    style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    HSSFCell cell = row.createCell(0);
    //创建公共工具类对象
    Utils util = new Utils();
    //调用方法获得标题
    Map<String,String> map = util.getBeanComment("实体类路径");
    int i=0;
    for (String key : map.keySet()) {
        cell = row.createCell(i);
        cell.setCellValue(map.get(key));
        cell.setCellStyle(style);
        i++;
    }
    i=0;
    for (Object obj:list) {
        row = sheet.createRow((int) i + 1);
        int j=0;
        for (String key : map.keySet()) {
            cell=row.createCell(j);
            cell.setCellValue(BeanUtils.getProperty(obj,key));
            j++;
        }
        i ++ ;
    }
    return wb;
}

二、SXSSFWorkbook工具类(导出.xlsx格式文件,适用于数据量大的文件导出)
SXSSFWorkbook对象,只支持.xlsx格式。它就是用来解决大数据量以及超大数据量的导入导出操作的,
单个sheet表就支持近104万条数据了。要是导出104万以上的数据,这时我们必须拆分到多个工作表来实现。
//以数组的方式手动定义表单元格标题和对应值
public SXSSFWorkbook getWb(String sheetName,String[] title,String[][] values){
    //内存中只创建100个临时对象,超过100个将释放不用对象
    SXSSFWorkbook wb = new SXSSFWorkbook(100);
    //工作表对象
    Sheet sheet = null;
    //行对象
    Row row = null;
    //列对象
    Cell cell = null;
    int rowNo = 0;
    int pageRowNo = 0;
    //表单样式风格
    CellStyle style = wb.createCellStyle();
    style.setAlignment(CellStyle.ALIGN_CENTER);
    if(values != null && values.length>0){
        for(int j=0;j<values.length;j++){
            //超过一百万行后换一个工作薄,单个sheet最多1048576行
            if(rowNo%1000000 == 0){
                sheet = wb.createSheet("第"+(rowNo/1000000+1)+"个工作薄");
                sheet = wb.getSheetAt(rowNo/1000000);
                pageRowNo = 0;
            }
            rowNo++;
            //创建标题
            if(pageRowNO == 0){
                row = sheet.createRow(0);
                for(int i=0;i<title.length;i++){
                    cell = row.createCell(i);                         
                    cell.setCellValue(title[i]);                      
                    cell.setCellStyle(style);
                    if(i==title.length-1){
                        sheet.setDefaultColumnWidth(20);
                    }
                }
            }else{
                //创建行
                row = sheet.createRow(pageRowNo);
                for(int k=0;k<values[j].length;k++){
                    // 创建列  
                    cell = row.createCell(k);
                    if(k == 0){
                        //对列进行赋值  
                        cell.setCellValue(Long.parseLong(values[j][k]));
                    }else{
                        if(numType(values[j][k])){
                            cell.setCellValue(Double.parseDouble(values[j][k]));
                        }else{
                            cell.setCellValue(String.valueOf(values[j][k]));
                        }
                    }
                    cell.setCellStyle(style);
                }
            }
            pageRowNo++;
        }
    }
    return wb;
}

如果用一中公共工具类的getBeanComment()方法,如下:
public Map<String,String> getBeanComment(String bean){
    Map<String,String> map = new HashMap<>();
    try{
        Class clz = Class.forName(bean);
        Field[] strsSub = clz.getDeclaredFields();
        Class clzSuper = Class.forName(bean).getSuperclass();
        List<Field> strs = new ArrayList<>();
        for(Field filed : strsSub){
            strs.add(filed);
        }
        if(null != clzSuper){
            Field[] StrsSuper = clzSuper.getDeclaredFields();
            for(Field field : StrsSuper){
                strs.add(field);
            }
        }
        //StringBuffer sb = new StringBuffer();
        for(Field field : strs){
            Comment comment = field.getAnnotation(Comment.class);
            if(null == comment){
                continue;
            }
            String name = field.getName();
            if("id".equals(name)){
                continue;
            }
            if(StringUtils.isNotBlank(comment.value())){
                map.put(name, comment.value());
            }
        }
        return map;
    }catch(ClassNotFoundException e) {
        e.printStackTrace();
        return null;
    }
}

注:
可参考:https://blog.csdn.net/runzhisheng114/article/details/75303750;
        https://blog.csdn.net/u014621859/article/details/54944059;

Java导出Excel文件的两种方法的更多相关文章

  1. .NET CORE 2.1 导出excel文件的两种方法

    最近在做 MVC 项目的时候遇到项目的导出,下面总结下两种导出到excel 的方法 第一种方法: 将文件写到本地,然后返回这个File 或者返回这个 File 的绝对地址  其中  _hostingE ...

  2. web导出excel文件的几种方法

    总的来说,两种方法:服务器端生成和浏览器端生成. 服务器端生成就是:根据用户请求,获取相应的数据,使用poi/jxl, jacob/jawin+excel,或是用数据拼html的table或是cvs纯 ...

  3. Java读取Excel文件的几种方法

    Java读取 Excel 文件的常用开源免费方法有以下几种: 1. JDBC-ODBC Excel Driver 2. jxl.jar 3. jcom.jar 4. poi.jar 简单介绍: 百度文 ...

  4. [转载]Java操作Excel文件的两种方案

    微软在桌面系统上的成功,令我们不得不大量使用它的办公产品,如:Word,Excel.时至今日,它的源代码仍然不公开已封锁了我们的进一步应用和开发.在我们实际开发企业办公系统的过程中,常常有客户这样子要 ...

  5. mysql导出excel文件的几种方法

    方法一 用mysql的命令和shell select * into outfile './bestlovesky.xls' from bestlovesky where 1 order by id d ...

  6. 读取Excel文件的两种方法

    第一种方法:传统方法,采用OleDB读取EXCEL文件, 优点:写法简单,缺点:服务器必须安有此组件才能用,不推荐使用 private DataSet GetConnect_DataSet2(stri ...

  7. 读取Excel文件的两种方法比较 以及用NPOI写入Excel

    1. 采用NPOI方式,只需引用NPOI.dll,但目前最高只能到2.4.0版. 缺点:只支持.xls,不支持.xlsx格式.github上的2.4.1版支持.xlsx,但总提示缺ICSharpCod ...

  8. Oracle导出DMP文件的两种方法

    本文转载自:http://www.cnblogs.com/o-andy-o/archive/2013/06/05/3118611.html   导出: 方法一:利用PL/SQL Developer工具 ...

  9. java读取excel文件的两种方式

    方式一: 借用 package com.ij34.util; /** * @author Admin * @date 创建时间:2017年8月29日 下午2:07:59 * @version 1.0 ...

随机推荐

  1. SBC37x交叉编译平台QT+OPENCV【2】虚拟机Vbox下Ubuntu的磁盘扩容

    虚拟机Vbox下Ubuntu,当初为了学习,仅仅分配了8g,结果qt,opencv等一上,就说room空间不够了.于是开始折腾磁盘扩容. 网上一大堆,也不知道有多少是自己动手走过,正是不但浪费别人时间 ...

  2. Spring 单例模式和多例模式

    1.Spring中的对象默认都是 单例模式. 2.使用 @Scope("prototype") 注解来使对象成为多例模式. 3.通过@Autowired 注入的Service 或者 ...

  3. (30)导入时如何定制spring-boot依赖项的版本【转载】【从零开始学Spring Boot】

    此文章转载地址:http://www.tuicool.com/articles/RJJvMj3 请注重作者的版权. spring-boot通过maven的依赖管理为我们写好了很多依赖项及其版本,我们可 ...

  4. Spring Cloud-Eureka实现服务的注册与发现(二)

    在Spring Cloud中是使用Eureka来实现服务的注册与发现的 请勿使用eureka2.x  用于生产 2.x已经停止开发了  使用1.x  最新版是1.9  我这里demo是使用1.9  详 ...

  5. ExtJs之Ext.Model的MemoryProxy

    书上的代码已完全不可参考,只好按知识点从网上查资料一个一个实例 了. <!DOCTYPE html> <html> <head> <title>ExtJ ...

  6. Java中的事务

    Java中的事务 学习了:https://www.cnblogs.com/chengpeng15/p/5802930.html 膜拜一下 org 分为三类:jdbc事务.jta事务.容器事务:

  7. Linux下的五种I/O模型

    堵塞I/O(blocking I/O) 非堵塞I/O (nonblocking I/O) I/O复用(select 和poll) (I/O multiplexing) 信号驱动I/O (signal ...

  8. C语言开发函数库时利用不透明指针对外隐藏结构体细节

    1 模块化设计要求库接口隐藏实现细节 作为一个函数库来说,尽力降低和其调用方的耦合.是最主要的设计标准. C语言,作为经典"程序=数据结构+算法"的践行者,在实现函数库的时候,必定 ...

  9. Unity3D 射线指定层获取GameObject 注意 LayerMask

    这一篇是纯技术讨论,看过我前面文章的童鞋应该清楚,我的奔跑是靠鼠标响应的,鼠标点到哪就跑到哪,后来又有了界面,麻烦就来了,我的界面居然能点 穿.我不希望点界面的时候还能点到界面后面的地面上,角色傻不拉 ...

  10. 在Android系统中修改Android.mk使其同时编译rgb2565和rgb2888(向out/host/linux-x86/bin/下新增加一个工具命令)【转】

    本文转载自:http://blog.csdn.net/mu0206mu/article/details/7514559 在Android系统中修改android.mk使其同时编译rgb2565和rgb ...