`
free9277
  • 浏览: 107445 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

POI导出大量Excel

 
阅读更多

转载http://javaflex.iteye.com/blog/1264127

说明:我的电脑 2.0CPU 2G内存 能够十秒钟导出 20W 条数据 ,12.8M的excel内容压缩后2.68M
我们知道在POI导出Excel时,数据量大了,很容易导致内存溢出。由于Excel 一个sheet允许的最大行数是65536这时我们想到分sheet进行导出;但是这种情况也不能解决内存溢出的问题。毕竟数据还是一次性在内存中进行保存的。这时我们想是不是可以导出多个excel呢?下面我就尝试着按照导出多个excel
首先:我们要确定数据量有多大,然后确定一个excel导出多少条数据,这样就可以确定导出的Excel的数量,于是我们就可以循环的导出excel并保存在任意的临时目录中。去这样如果内存不够的话虚拟机就会去进行回收已经保存的excel在内存中的空间。
假设我们我们已经成功的生成了多个excel,这时我们怎么把这N个excel文档传到客户端呢?其实一个一个的传也未尝不可,但是考虑那样对用户来说体验不够好,再次多个文件在网络上传输也比较慢。我们可以考虑对生成的几个文件进行压缩,然后传到客户端。

总结一下第一、分批次生成excel第二、压缩后到客户

下面我把我的一个小实例贴上供大家参考
第一、Person.java 普通javabean
Javabean代码  收藏代码

    package bean; 
    /** 
     *  
     * @author http://javaflex.iteye.com/ 
     * 
     */ 
    public class Person { 
     
        private Integer id; 
        private String name; 
        private String address; 
        private String tel; 
        private Double money=0.0; 
        public Double getMoney() { 
            return money; 
        } 
        public void setMoney(Double money) { 
            this.money = money; 
        } 
        public Person(Integer id, String name, String address, String tel,Double money) { 
            super(); 
            this.id = id; 
            this.name = name; 
            this.address = address; 
            this.tel = tel; 
            this.money=money; 
        } 
        public Integer getId() { 
            return id; 
        } 
        public void setId(Integer id) { 
            this.id = id; 
        } 
        public String getName() { 
            return name; 
        } 
        public void setName(String name) { 
            this.name = name; 
        } 
        public String getAddress() { 
            return address; 
        } 
        public void setAddress(String address) { 
            this.address = address; 
        } 
        public String getTel() { 
            return tel; 
        } 
        public void setTel(String tel) { 
            this.tel = tel; 
        } 
    } 



第二、PersonService模拟业务逻辑循环生成100023个Person对象


模拟业务逻辑代码  收藏代码

    package service; 
     
    import java.util.ArrayList; 
    import java.util.List; 
     
    import bean.Person; 
    /** 
     *  
     * @author http://javaflex.iteye.com/ 
     * 
     */ 
    public class PersonService { 
        public static List getPerson(){ 
            List<Person> list =new ArrayList<Person>(); 
            for(int i=0;i<100320;i++){ 
                list.add(new Person(i,"zhangsan"+i,"北京"+i,"13214587632",123123.12+i));   
            } 
            return list; 
        } 
     
    } 



第三、业务处理Servlet


操作servlet代码  收藏代码

    package servlet; 
     
    import java.io.File; 
    import java.io.FileInputStream; 
    import java.io.FileOutputStream; 
    import java.io.IOException; 
    import java.io.OutputStream; 
    import java.text.SimpleDateFormat; 
    import java.util.ArrayList; 
    import java.util.Date; 
    import java.util.List; 
     
    import javax.servlet.ServletException; 
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 
     
    import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
    import org.apache.poi.hssf.util.CellRangeAddress; 
    import org.apache.poi.ss.usermodel.Cell; 
    import org.apache.poi.ss.usermodel.CellStyle; 
    import org.apache.poi.ss.usermodel.Row; 
    import org.apache.poi.ss.usermodel.Sheet; 
    import org.apache.poi.ss.usermodel.Workbook; 
     
    import bean.Person; 
     
    import service.PersonService; 
     
    /** 
     *  
     * @author http://javaflex.iteye.com/ 
     * 
     */ 
    public class PersonServlet extends HttpServlet { 
        private String fileName; 
     
        public PersonServlet() { 
            super(); 
        } 
     
        public void destroy() { 
            super.destroy(); // Just puts "destroy" string in log 
            // Put your code here 
        } 
     
        public void doGet(HttpServletRequest request, HttpServletResponse response) 
                throws ServletException, IOException { 
            // 文件名获取 
            Date date = new Date(); 
            SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); 
            String f = "Person-" + format.format(date); 
            this.fileName = f; 
            setResponseHeader(response); 
            OutputStream out = null; 
            try { 
                out = response.getOutputStream(); 
                List<Person> list = PersonService.getPerson(); 
                toExcel(list,request,10000,f,out); 
            } catch (IOException e1) { 
                e1.printStackTrace(); 
            } finally { 
                try { 
                    out.flush(); 
                    out.close(); 
                } catch (IOException e) { 
                    e.printStackTrace(); 
                } 
            } 
        } 
     
        /** 设置响应头 */ 
        public void setResponseHeader(HttpServletResponse response) { 
            try { 
                response.setContentType("application/octet-stream;charset=UTF-8"); 
                response.setHeader("Content-Disposition", "attachment;filename=" 
                        + java.net.URLEncoder.encode(this.fileName, "UTF-8") 
                        + ".zip"); 
                response.addHeader("Pargam", "no-cache"); 
                response.addHeader("Cache-Control", "no-cache"); 
            } catch (Exception ex) { 
                ex.printStackTrace(); 
            } 
        } 
        public void doPost(HttpServletRequest request, HttpServletResponse response) 
                throws ServletException, IOException { 
     
            doGet(request, response); 
        } 
        public void init() throws ServletException { 
            // Put your code here 
        } 
     
        public void toExcel(List<Person> list, HttpServletRequest request, 
                int length, String f, OutputStream out) throws IOException { 
            List<String> fileNames = new ArrayList();// 用于存放生成的文件名称s 
            File zip = new File(request.getRealPath("/files") + "/" + f + ".zip");// 压缩文件 
            // 生成excel 
            for (int j = 0, n = list.size() / length + 1; j < n; j++) { 
                Workbook book = new HSSFWorkbook(); 
                Sheet sheet = book.createSheet("person"); 
     
                double d = 0;// 用来统计 
                String file = request.getRealPath("/files") + "/" + f + "-" + j 
                        + ".xls"; 
     
                fileNames.add(file); 
                FileOutputStream o = null; 
                try { 
                    o = new FileOutputStream(file); 
     
                    // sheet.addMergedRegion(new 
                    // CellRangeAddress(list.size()+1,0,list.size()+5,6)); 
                    Row row = sheet.createRow(0); 
                    row.createCell(0).setCellValue("ID"); 
                    row.createCell(1).setCellValue("NAME"); 
                    row.createCell(2).setCellValue("ADDRESS"); 
                    row.createCell(3).setCellValue("TEL"); 
                    row.createCell(4).setCellValue("Money"); 
     
                    int m = 1; 
     
                    for (int i = 1, min = (list.size() - j * length + 1) > (length + 1) ? (length + 1) 
                            : (list.size() - j * length + 1); i < min; i++) { 
                        m++; 
                        Person user = list.get(length * (j) + i - 1); 
                        Double dd = user.getMoney(); 
                        if (dd == null) { 
                            dd = 0.0; 
                        } 
                        d += dd; 
                        row = sheet.createRow(i); 
                        row.createCell(0).setCellValue(user.getId()); 
                        row.createCell(1).setCellValue(user.getName()); 
                        row.createCell(2).setCellValue(user.getAddress()); 
                        row.createCell(3).setCellValue(user.getTel()); 
                        row.createCell(4).setCellValue(dd); 
     
                    } 
                    CellStyle cellStyle2 = book.createCellStyle(); 
                    cellStyle2.setAlignment(CellStyle.ALIGN_CENTER); 
                    row = sheet.createRow(m); 
                    Cell cell0 = row.createCell(0); 
                    cell0.setCellValue("Total"); 
                    cell0.setCellStyle(cellStyle2); 
                    Cell cell4 = row.createCell(4); 
                    cell4.setCellValue(d); 
                    cell4.setCellStyle(cellStyle2); 
                    sheet.addMergedRegion(new CellRangeAddress(m, m, 0, 3)); 
                } catch (Exception e) { 
                    e.printStackTrace(); 
                } 
                try { 
                    book.write(o); 
                } catch (Exception ex) { 
                    ex.printStackTrace(); 
                } finally { 
                    o.flush(); 
                    o.close(); 
                } 
            } 
            File srcfile[] = new File[fileNames.size()]; 
            for (int i = 0, n = fileNames.size(); i < n; i++) { 
                srcfile[i] = new File(fileNames.get(i)); 
            } 
            util.FileZip.ZipFiles(srcfile, zip); 
            FileInputStream inStream = new FileInputStream(zip); 
            byte[] buf = new byte[4096]; 
            int readLength; 
            while (((readLength = inStream.read(buf)) != -1)) { 
                out.write(buf, 0, readLength); 
            } 
            inStream.close(); 
        } 
    } 

最后还有个工具类package util;
压缩工具类代码  收藏代码

    import java.io.FileInputStream; 
    import java.io.FileOutputStream; 
    import java.io.IOException; 
    import java.util.zip.ZipEntry; 
    import java.util.zip.ZipOutputStream; 
    /** 
     *  
     * @author http://javaflex.iteye.com/ 
     * 
     */ 
    public class FileZip { 
        /** 
         *  
         * @param srcfile 文件名数组 
         * @param zipfile 压缩后文件 
         */ 
        public static void ZipFiles(java.io.File[] srcfile, java.io.File zipfile) { 
            byte[] buf = new byte[1024]; 
            try { 
                ZipOutputStream out = new ZipOutputStream(new FileOutputStream( 
                        zipfile)); 
                for (int i = 0; i < srcfile.length; i++) { 
                    FileInputStream in = new FileInputStream(srcfile[i]); 
                    out.putNextEntry(new ZipEntry(srcfile[i].getName())); 
                    int len; 
                    while ((len = in.read(buf)) > 0) { 
                        out.write(buf, 0, len); 
                    } 
                    out.closeEntry(); 
                    in.close(); 
                } 
                out.close(); 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
        } 
    } 

OK全部内容完成





12.8M的excel内容压缩后2.68M,给力吧

以后记得代码加注释

 

分享到:
评论

相关推荐

    java poi导出大量数据到Excel

    #### 三、导出大量数据到Excel的实现思路 当面对大量数据时,直接将所有数据一次性写入单个工作表可能会导致内存溢出等问题。因此,一种常见的做法是将数据分批写入不同的工作表中。 #### 四、具体实现步骤 ##### ...

    poi导出根据模板导出excel和简单列表导出excel源码

    在本案例中,我们关注的是如何使用 Apache POI 库来导出 Excel 文件,特别是根据模板导出和简单列表导出。下面将详细介绍这个过程。 1. **Apache POI 概述** Apache POI 提供了 Java API 来读写 Microsoft Office ...

    java poi导出excel

    以上就是使用Java POI导出Excel的基本步骤。你可以根据实际需求调整代码,例如添加数据遍历、样式设置、图表生成等功能。确保正确管理资源,避免内存泄漏,特别是在服务器端处理大量数据时。记得在完成后关闭工作簿...

    POI的EXCEL导出,自动换行

    ### POI的EXCEL导出,自动换行 在日常工作中,经常需要处理大量的数据导入导出任务,尤其是在企业级应用开发中,Excel文件的处理成为了一项必不可少的能力。Apache POI项目提供了一系列用于读写Microsoft Office...

    poi导出excel需要的jar

    "poi导出excel需要的jar"指的是在使用Apache POI进行Excel导出时,你需要包含特定的JAR依赖文件。 首先,要实现POI导出Excel的功能,你需要下载Apache POI相关的JAR文件。这些文件通常包括以下核心组件: 1. **poi...

    Apache poi 导出excel实例

    这篇博客文章“Apache POI 导出excel实例”将深入探讨如何使用Apache POI库来生成Excel文件,这对于在Java环境中处理大量数据并需要导出为Excel格式的应用非常有用。 首先,我们需要导入Apache POI库到我们的项目中...

    POI使用Excel模板文件循环输出行并导出Excel

    在这个特定的例子中,我们将讨论如何使用POI库基于一个Excel模板文件循环输出数据行,并将结果导出为新的Excel文件。 首先,我们需要理解POI库的基本概念。POI提供了HSSF(Horizontally SpreadSheet Format)和XSSF...

    poi方式导出excel需要的3个jar包

    以下是一个简单的使用Apache POI导出Excel的工作流程示例: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java....

    apache POI 导出Excel 设置打印

    在使用Apache POI导出Excel时,首先需要创建一个`XSSFWorkbook`对象作为工作簿,然后通过工作簿创建`XSSFSheet`对象代表工作表。例如: ```java XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet =...

    文件下载 用poi导出excel文档

    ### 文件下载:使用POI导出Excel文档 在日常工作中,我们经常需要处理大量数据,并将其以Excel格式导出供用户下载。Java中一个非常强大的工具包——Apache POI可以帮助我们实现这一需求。Apache POI是一个用于读写...

    JAVA POI导出EXCEL代码

    本篇文章将详细介绍如何使用JAVA POI导出Excel。 一、准备工作 在开始编写代码前,确保已经添加了Apache POI库到项目的依赖管理中。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;...

    使用ITEXT导出PDF、WORD,APACHE POI导出EXCEL报表文件

    本文将深入探讨如何使用ITEXT库导出PDF和Word,以及利用Apache POI库导出Excel报表文件。 首先,让我们来了解ITEXT库。ITEXT是一个开源Java库,专门用于创建和修改PDF文档。使用ITEXT,你可以方便地生成包含文本、...

    利用POI实现数据库导出Excel

    在利用POI导出数据库到Excel的过程中,主要涉及以下几个步骤: 1. **准备环境**:确保项目中已经引入了Apache POI的依赖。在本例中,你已经有了`poi.jar`包,这通常包含在项目的类路径中。如果使用现代构建工具如...

    导出excel文档所需要的poi的jar包

    在Java环境中,如果你需要导出或者操作Excel文档,Apache POI是必不可少的工具。标题提到的"导出excel文档所需要的poi的jar包"正是指这个功能。 Apache POI的版本3.8是较早的一个稳定版本,尽管现在已经有更新的...

    java使用poi导出大量数据

    在Java编程中,使用...总结起来,Java使用Apache POI导出大量数据需要考虑内存管理、性能优化、样式设置、错误处理等多个方面。通过合理的编程实践和策略,可以确保数据导出既快速又稳定,同时提供良好的用户体验。

    SSM框架利用poi导入导出Excel文件 demo

    在本示例"SSM框架利用poi导入导出Excel文件 demo"中,我们将探讨如何在SSM项目中使用Apache POI库来实现Excel文件的导入与导出功能。 Apache POI是一个流行的开源库,它允许开发者在Java应用程序中创建、修改和显示...

    POI实现的基于动态模板的EXCEL数据导出

    标题中的“POI实现的基于动态模板的EXCEL数据导出”是指利用Apache POI库来创建一个可以动态填充数据的Excel模板,从而实现大量数据的高效导出。Apache POI是一个开源项目,它允许Java开发者读写Microsoft Office...

    poi 导入导出Excel相关jar包

    总结一下,Apache POI是Java处理Excel文件的标准库,它提供了全面的API来实现Excel的导入和导出。通过理解并熟练使用POI,开发者可以轻松地在应用程序中实现Excel数据的读取、写入和编辑功能。结合dim4j库,还能进行...

    POI导出EXCEL的示例

    在本文中,我们将深入探讨如何使用POI库来导出Excel文件,这在大数据处理、报表生成和数据交换等场景中非常常见。 首先,让我们了解什么是Apache POI。POI是“Poor Obfuscation Implementation”的首字母缩写,它...

    poi导出数据到excel里

    在这个场景中,"poi导出数据到excel里"指的是使用Apache POI库在Java项目中将数据写入Excel文件的过程。这个功能在数据分析、报表生成或者数据导出等场景中非常常见。以下是对Apache POI导出数据到Excel的详细解释:...

Global site tag (gtag.js) - Google Analytics