java导出大批量(百万以上)数据的excel文件

1.传统的导出方式会消耗大量的内存,2003每个sheet页最多65536条数据,2007每个sheet页可以达到100万条数据以上,2007会在生成Workbook时清理数据,所以2007导出量更大;

2.可以导出多个excel文件到某个目录中,然后打包下载;

3.导出excel格式的xml文件,这种方式可以分批导出数据,适用于大批量数据的导出,以下简单介绍这种方式:

代码如下:

  1 package com.epay.utils;
  2
  3 /**
  4  * 大数据量导出成EXCEL或XML
  5  * @author qad
  6  * 2017-04-22
  7  */
  8 import java.io.BufferedOutputStream;
  9 import java.io.DataOutputStream;
 10 import java.io.File;
 11 import java.io.FileNotFoundException;
 12 import java.io.FileOutputStream;
 13 import java.io.IOException;
 14
 15 public class Test {
 16     public static void main(String[] args) {
 17         StringBuffer sb = new StringBuffer();
 18         try {
 19             DataOutputStream rafs = new DataOutputStream(
 20                     new BufferedOutputStream(new FileOutputStream(new File(
 21                             "d://test.xls"))));
 22             sb.append("<?xml version=\"1.0\" encoding=\"GBK\" ?>");
 23             sb.append("\n");
 24             sb.append("<?mso-application progid=\"Excel.Sheet\"?>");
 25             sb.append("\n");
 26             sb.append("<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"");
 27             sb.append("\n");
 28             sb.append("  xmlns:o=\"urn:schemas-microsoft-com:office:office\"");
 29             sb.append("\n");
 30             sb.append(" xmlns:x=\"urn:schemas-microsoft-com:office:excel\"");
 31             sb.append("\n");
 32             sb.append(" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"");
 33             sb.append("\n");
 34             sb.append(" xmlns:html=\"http://www.w3.org/TR/REC-html40\">");
 35             sb.append("\n");
 36             sb.append("<DocumentProperties xmlns=\"urn:schemas-microsoft-com:office:office\"> ");
 37             sb.append("\n");
 38             sb.append(" <Styles>\n");
 39             sb.append("  <Style ss:ID=\"Default\" ss:Name=\"Normal\">\n");
 40             sb.append("   <Alignment ss:Vertical=\"Center\"/>\n");
 41             sb.append("   <Borders/>\n");
 42             sb.append("   <Font ss:FontName=\"宋体\" x:CharSet=\"134\" ss:Size=\"12\"/>\n");
 43             sb.append("   <Interior/>\n");
 44             sb.append("   <NumberFormat/>\n");
 45             sb.append("   <Protection/>\n");
 46             sb.append("  </Style>\n");
 47             sb.append(" </Styles>\n");
 48             int sheetcount = 0;
 49             int recordcount = 65535;
 50             int currentRecord = 0;
 51             int total = 100000;
 52             int col = 20;
 53             sb.append("<Worksheet ss:Name=\"Sheet0\">");
 54             sb.append("\n");
 55             sb.append("<Table ss:ExpandedColumnCount=\"" + col
 56                     + "\" ss:ExpandedRowCount=\"" + total
 57                     + "\" x:FullColumns=\"1\" x:FullRows=\"1\">");
 58             sb.append("\n");
 59             for (int i = 0; i < total; i++) {
 60                 if ((currentRecord == recordcount
 61                         || currentRecord > recordcount || currentRecord == 0)
 62                         && i != 0) {// 一个sheet写满
 63                     currentRecord = 0;
 64                     rafs.write(sb.toString().getBytes());
 65                     sb.setLength(0);
 66                     sb.append("</Table>");
 67                     sb.append("<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">");
 68                     sb.append("\n");
 69                     sb.append("<ProtectObjects>False</ProtectObjects>");
 70                     sb.append("\n");
 71                     sb.append("<ProtectScenarios>False</ProtectScenarios>");
 72                     sb.append("\n");
 73                     sb.append("</WorksheetOptions>");
 74                     sb.append("\n");
 75                     sb.append("</Worksheet>");
 76                     sb.append("<Worksheet ss:Name=\"Sheet" + i / recordcount
 77                             + "\">");
 78                     sb.append("\n");
 79                     sb.append("<Table ss:ExpandedColumnCount=\"" + col
 80                             + "\" ss:ExpandedRowCount=\"" + recordcount
 81                             + "\" x:FullColumns=\"1\" x:FullRows=\"1\">");
 82                     sb.append("\n");
 83                 }
 84                 sb.append("<Row>");
 85                 for (int j = 0; j < col; j++) {
 86                     System.out.println(i);
 87                     sb.append("<Cell><Data ss:Type=\"String\">111</Data></Cell>");
 88                     sb.append("\n");
 89                 }
 90                 sb.append("</Row>");
 91                 if (i % 5000 == 0) {
 92                     rafs.write(sb.toString().getBytes());
 93                     rafs.flush();
 94                     sb.setLength(0);
 95                 }
 96                 sb.append("\n");
 97                 currentRecord++;
 98             }
 99             rafs.write(sb.toString().getBytes());
100             sb.setLength(0);
101             sb.append("</Table>");
102             sb.append("<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">");
103             sb.append("\n");
104             sb.append("<ProtectObjects>False</ProtectObjects>");
105             sb.append("\n");
106             sb.append("<ProtectScenarios>False</ProtectScenarios>");
107             sb.append("\n");
108             sb.append("</WorksheetOptions>");
109             sb.append("\n");
110             sb.append("</Worksheet>");
111             sb.append("</Workbook>");
112             sb.append("\n");
113             rafs.write(sb.toString().getBytes());
114             rafs.flush();
115             rafs.close();
116         } catch (FileNotFoundException e) {
117             e.printStackTrace();
118         } catch (IOException e) {
119             e.printStackTrace();
120         }
121     }
122 }

导出xml文件之后直接修改后缀名为.xlsx就可以直接打开,弊端:无法导出.xls格式的excel文件.以上只是一种简单想法,留待以后具体实现.

扩展:既然可以使用xml文件导出excel,那么导出csv文件之后也可以直接改后缀名为.xls,目前只是一种想法,尚未证实可行性.

时间: 2024-10-10 07:57:30

java导出大批量(百万以上)数据的excel文件的相关文章

java导出数据库里的数据至Excel进行数据备份

调用部分: package com.otdrmsys.action; import com.otdrmsys.util.ResultSetToExcel; public class ExcelExport { public static void main(String[] args) { // String fileName = "otdr";//文件名,不带路径,不带.xls后缀 // String [] coloumItems = {"otdr编号",&quo

导出数据库任意表数据为EXCEL

public class ExportAsExcel { final Logger logger = LoggerFactory.getLogger(getClass()); static SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** * 公共组件,导出Excel表格数据方法<p> * 使用方法: 数据为List<Object>类型,注意当中object的

PHP导出MySQL数据到Excel文件

PHP导出MySQL数据到Excel文件 转载 常会碰到需要从数据库中导出数据到Excel文件,用一些开源的类库,比如PHPExcel,确实比较容易实现,但对大量数据的支持很不好,很容易到达PHP内存使用上限.这里的方法是利用fputcsv写CSV文件的方法,直接向浏览器输出Excel文件. ? 1 <br><!--?php// 输出Excel文件头,可把user.csv换成你要的文件名header('Content-Type: application/vnd.ms-excel');he

C#读取Excel表格数据到DataGridView中和导出DataGridView中的数据到Excel

其实想在datagridview中显示excel表格中的数据跟读取数据库中的数据没什么差别,只不过是创建数据库连接的时候连接字段稍有差别. private void btnShow_Click(object sender, EventArgs e) { OpenFileDialog fd = new OpenFileDialog();//首先根据打开文件对话框,选择excel表格 ofd.Filter = "表格|*.xls";//打开文件对话框筛选器 string strPath;/

CodeIgniterCodeigniter+PHPExcel导出数据到Excel文件

解压压缩包里的Classes文件夹中的内容到application\libraries\目录下,目录结构如下:--application\libraries\PHPExcel.php--application\libraries\PHPExcel(文件夹)修改application\libraries\PHPExcel\IOFactory.php文件--将其类名从PHPExcel_IOFactory改为IOFactory,遵从CI类命名规则.--将其构造函数改为public $this->loa

自动更新开奖数据的excel文件,供大家下载

自动更新开奖数据的excel文件,供大家下载 2010-03-14 20:22 228492人阅读打印来源:乐彩网 作者:eren 很多人拥有自制excel电子表格,常要更新最基本的开奖信息.如有多期未更新,则费时更多.乐彩网为大家提供八种彩票的自动更新文件,供下载.您只需点击更新按钮,就能得到最及时全面的开奖信息,省时省力. 2011年10月12日修改说明:已更新全部开奖数据.福彩3Dexcel文件中,因描述更新范围的高度小了,导致更新后,最下面内容会右移.如此文件单独存在,请直接下载.如已将

导出大批量图片的名字到txt文件的一种笨但有效的方法

我经常对很多图片进行操作,所以经常要导出大批量图片的名字到txt文件里保存起来供后续批量处理图片. 我的方法是,假如你大量的图片存储在d:/img/里,那么你用鼠标选中img 文件夹,按住shift键,右键在此处打开命令窗口. 键入 TREE /F >d:\list.txt 这样在D盘就会生成一个list.txt文件,不过要手动删掉首尾的一些字和空行,这样剩下每一行的图片名字前都有空行,下面我贴出来我在网上找到的的用来去除这些空格的代码. // //本程序用于将文件中的多余空格去除并保存到另一文

excel数据 入库mysql 和 mysql数据 导入excel文件

1.excel数据入库mysql 首先准备excel文件, 标红的地方需要留意,一个是字段名所在行,一个表名对应页: 然后私用mysql工具 navicat, 选择数据库,然后导入文件, 选中相应execl文件,即可导入. 栏位名行  对应excel文件中,字段名所在的行. 第一个数据行  对应excel文件中,第一行数据所在的行. ----------------------------------------------------------------------------------

java使用poi包将数据写入Excel表格

1.Excel相关操作代码 1 import java.io.File; 2 import java.io.FileInputStream; 3 import java.io.FileNotFoundException; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.lang.reflect.Field; 7 import java.lang.reflect.Method; 8 imp