文档章节

java中生成30万的excel(采用多个excel,每个上面放6万数据,最后打包zip保存)

咖啡加糖
 咖啡加糖
发布于 2014/09/23 16:45
字数 912
阅读 35
收藏 0

没事做就想到做这个东西

 

首先要说明的是excel03  每个sheet最多放65535行所以,每行不能超过这个数,如果想放的多,可以考虑生成excel2007,

好像excel2007可以放100W多行数据

 

大数据量生成excel我只想到三种方法,当然基本也是网上看到的

1  生成多个excel打包   2  利用xml方式生成   3  用最新的包 

现在讲的是第一种  第二种也可以以后会做下测试   第三种好像不行,一直内存溢出

直接上代码

 

这个是servlet:

package servlets;

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 util.DBConnectionManager;
import domain.Person;

public class exportExcel extends HttpServlet {

 private String fileName;

 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 {

   System.out.println("导出excel开始~~~"+System.currentTimeMillis());
   long startTime = System.currentTimeMillis();
   out = response.getOutputStream();
   DBConnectionManager db = new DBConnectionManager();//该部分是用于链接数据库
   List<Person> list = db.queryDataList(" select * from TEST_EXPORT ");//查询数据集合

   toExcel(list, request, 50000, f, out);
   System.out.println("导出excel结束~~~"+System.currentTimeMillis());
   long endTime = System.currentTimeMillis();
   
   System.out.println("导出excel共花费时间~~~"+(endTime-startTime)/1000);
   
  } 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 

 }

 @SuppressWarnings("deprecation")
 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("/excel") + 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("/excel") + "/" + 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("REMARK");


    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);


     row = sheet.createRow(i);

     row.createCell(0).setCellValue(user.getId());

     row.createCell(1).setCellValue(user.getName());

     row.createCell(2).setCellValue(user.getRemark());

    }

//    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 {

    if (o != null){
     
     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 domain;

public class Person {

 
 private String id;
 private String name;
 private String remark;
 public String getId() {
  return id;
 }
 public void setId(String id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getRemark() {
  return remark;
 }
 public void setRemark(String remark) {
  this.remark = remark;
 }
 
 
}

 

这个是打包的工具类

package util;

import java.io.FileInputStream; 

import java.io.FileOutputStream; 

import java.io.IOException; 

import java.util.zip.ZipEntry; 

import java.util.zip.ZipOutputStream; 


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(); 

        } 

    } 


}

 

 

jsp我就传了,

 

另外这个也是我从别的地方转载的,修改了一些地方,也有很多不完善的地方,如果在项目中最好再做优化


© 著作权归作者所有

咖啡加糖

咖啡加糖

粉丝 17
博文 21
码字总数 18836
作品 0
南京
程序员
私信 提问
GrapeCity Documents for Excel 文档 API 组件 V2.2 版本发布

GrapeCity Documents for Excel 文档 API 组件 V2.2 正式发布,本次新版本包含诸多重量级产品功能,如:将带有形状的电子表格导出为 PDF、控制分页和电子表格内容、将 Excel 电子表格的特定页...

葡萄城技术团队
07/16
582
0
GrapeCity Documents for Excel 文档API组件 V2.2 新特性介绍

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/powertoolsteam/article/details/96150843 GrapeCity Documents for ...

powertoolsteam
07/16
0
0
使用 Apache POI 处理 Microsoft Office 文档

原文同步至:http://www.waylau.com/apache-poi-handle-microsoft-documents/ POI 概述 Apache POI 项目的使命是创造和维护 Java API 操纵各种格式的文件,其中包括基于 Office Open XML 标准...

waylau
2015/02/01
1K
3
解读POI操作之表格导出(生成多个sheet)

Java表格导出的方式有很多,有前端弹出对话框的形式,有poi操作,有jxl操作,可以说实现的形式多种多样。下面我用的只是其中一个poi操作Excel表格,同时可以在一张表格中生成多个sheet,后端...

海岸线的曙光
2018/03/28
3.1K
0
jxl导入/导出Excel(Maven)

About jxl is a pure java 5 super-project that includes Enclosure, Peermi, Enshell, and Xlp. jxl && POI jxl是一个开源的Java Excel API项目,通过Jxl,Java可以很方便的操作微软的Exc......

coderzs
2017/08/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java格式化解析时间

System.out.println(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS").format(LocalDateTime.now(ZoneOffset.UTC)));DateTimeFormatter DATE_TIME_FORMATTER = new DateTimeFormatterBu......

爱吃窝窝头
52分钟前
5
0
Hive详解

1. Hive基本概念 1.1 Hive简介 1.1.1 什么是Hive Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。 1.1.2 为什么使用Hive 直接使用h...

天子剑毅
今天
2
0
MYSQL 常用命令

打开终端,输入如下命令: /usr/local/MySQL/bin/mysql -u root -p 打开终端,输入如下命令: mysql -h 23.106.134.88 -u root -p 123456 mac启动、停止、重启MySql服务 启动MySql服务:sud...

xiaodong16
今天
5
0
哈希

第一个只出现一次的字符的位置

Garphy
今天
25
0
Centos7.7之离线安装kubectl

Centos7.7,kubernates-1.13.5. 我的Centos7.7上已经安装了kubernates 1.13.5,但是没有kubectl命令,手动安装 浏览器中访问https://storage.googleapis.com/kubernetes-release/release/sta......

克虏伯
今天
37
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部