`

如何导出大数据量的Excel文件

    博客分类:
  • Java
阅读更多

一般导出Excel可以选择POI或者JXL,poi比较方便但是处理大数据量效果不佳,jxl可以支持较大数据量,但是超过5W条也会报OOM错误。

那么如果有上百万条的数据怎么到处Excel呢?

其实Excel可以保存成HTML格式的文档(包括图片),我们可以研究html文件格式,然后用io方式往里面输出数据就可以了。

html格式如下:

 

<html xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<meta name=ProgId content=Excel.Sheet>
<meta name=Generator content="Microsoft Excel 11">
<link rel=File-List href="Book1.files/filelist.xml">
<link rel=Edit-Time-Data href="Book1.files/editdata.mso">
<link rel=OLE-Object-Data href="Book1.files/oledata.mso">
<!--[if !mso]>
<style>
v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
x\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]--><!--[if gte mso 9]><xml>
 <o:DocumentProperties>
  <o:Author>www.jujumao.com</o:Author>
  <o:LastAuthor>www.jujumao.com</o:LastAuthor>
  <o:Created>2010-05-24T10:00:21Z</o:Created>
  <o:LastSaved>2010-05-25T01:00:34Z</o:LastSaved>
  <o:Company>微软</o:Company>
  <o:Version>11.5606</o:Version>
 </o:DocumentProperties>
</xml><![endif]-->
<style>
<!--table
	{mso-displayed-decimal-separator:"\.";
	mso-displayed-thousand-separator:"\,";}
@page
	{margin:1.0in .75in 1.0in .75in;
	mso-header-margin:.5in;
	mso-footer-margin:.5in;}
tr
	{mso-height-source:auto;
	mso-ruby-visibility:none;}
col
	{mso-width-source:auto;
	mso-ruby-visibility:none;}
br
	{mso-data-placement:same-cell;}
.style0
	{mso-number-format:General;
	text-align:general;
	vertical-align:middle;
	white-space:nowrap;
	mso-rotate:0;
	mso-background-source:auto;
	mso-pattern:auto;
	color:windowtext;
	font-size:12.0pt;
	font-weight:400;
	font-style:normal;
	text-decoration:none;
	font-family:宋体;
	mso-generic-font-family:auto;
	mso-font-charset:134;
	border:none;
	mso-protection:locked visible;
	mso-style-name:常规;
	mso-style-id:0;}
td
	{mso-style-parent:style0;
	padding:0px;
	mso-ignore:padding;
	color:windowtext;
	font-size:12.0pt;
	font-weight:400;
	font-style:normal;
	text-decoration:none;
	font-family:宋体;
	mso-generic-font-family:auto;
	mso-font-charset:134;
	mso-number-format:General;
	text-align:general;
	vertical-align:middle;
	border:none;
	mso-background-source:auto;
	mso-pattern:auto;
	mso-protection:locked visible;
	white-space:nowrap;
	mso-rotate:0;}
.xl24
	{mso-style-parent:style0;
	white-space:normal;}
ruby
	{ruby-align:left;}
rt
	{color:windowtext;
	font-size:9.0pt;
	font-weight:400;
	font-style:normal;
	text-decoration:none;
	font-family:宋体;
	mso-generic-font-family:auto;
	mso-font-charset:134;
	mso-char-type:none;
	display:none;}
-->
</style>
<!--[if gte mso 9]><xml>
 <x:ExcelWorkbook>
  <x:ExcelWorksheets>
   <x:ExcelWorksheet>
    <x:Name>Sheet1</x:Name>
    <x:WorksheetOptions>
     <x:DefaultRowHeight>285</x:DefaultRowHeight>
     <x:Selected/>
     <x:Panes>
      <x:Pane>
       <x:Number>3</x:Number>
       <x:ActiveRow>2</x:ActiveRow>//默认选中的行
       <x:ActiveCol>2</x:ActiveCol>//默认选中的列
















      </x:Pane>
     </x:Panes>
     <x:ProtectContents>False</x:ProtectContents>
     <x:ProtectObjects>False</x:ProtectObjects>
     <x:ProtectScenarios>False</x:ProtectScenarios>
    </x:WorksheetOptions>
   </x:ExcelWorksheet>
   <x:ExcelWorksheet>
    <x:Name>Sheet2</x:Name>
    <x:WorksheetOptions>
     <x:DefaultRowHeight>285</x:DefaultRowHeight>
     <x:ProtectContents>False</x:ProtectContents>
     <x:ProtectObjects>False</x:ProtectObjects>
     <x:ProtectScenarios>False</x:ProtectScenarios>
    </x:WorksheetOptions>
   </x:ExcelWorksheet>
   <x:ExcelWorksheet>
    <x:Name>Sheet3</x:Name>
    <x:WorksheetOptions>
     <x:DefaultRowHeight>285</x:DefaultRowHeight>
     <x:ProtectContents>False</x:ProtectContents>
     <x:ProtectObjects>False</x:ProtectObjects>
     <x:ProtectScenarios>False</x:ProtectScenarios>
    </x:WorksheetOptions>
   </x:ExcelWorksheet>
  </x:ExcelWorksheets>
  <x:WindowHeight>9225</x:WindowHeight>
  <x:WindowWidth>17100</x:WindowWidth>
  <x:WindowTopX>120</x:WindowTopX>
  <x:WindowTopY>105</x:WindowTopY>
  <x:ProtectStructure>False</x:ProtectStructure>
  <x:ProtectWindows>False</x:ProtectWindows>
 </x:ExcelWorkbook>
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1027"/>
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1"/>
 </o:shapelayout></xml><![endif]-->
</head>

<body link=blue vlink=purple>

//正文内容
<table x:str border=0 cellpadding=0 cellspacing=0 width=912 style='border-collapse:
 collapse;table-layout:fixed;width:684pt'>
 <col width=72 style='width:54pt'>
 <col width=237 style='mso-width-source:userset;mso-width-alt:7584;width:178pt'>
 <col width=215 style='mso-width-source:userset;mso-width-alt:6880;width:161pt'>
 <col width=28 style='mso-width-source:userset;mso-width-alt:896;width:21pt'>
 <col width=72 span=5 style='width:54pt'>
 <tr height=76 style='height:57.0pt'><!--数据列-->
  <td height=76 width=72 style='height:57.0pt;width:54pt'>萨地方</td>
  <td class=xl24 width=237 style='width:178pt'>阿送大幅大赛sadf<br>
    dsafsafds<br>
    &lt;&gt;&lt;''&quot;&gt;<br>
    afdsa----</td>
  <td align=right width=215 style='width:161pt' x:num>1</td>
  <td width=28 style='width:21pt'></td>
  <td width=72 style='width:54pt'></td>
  <td width=72 style='width:54pt'></td>
  <td width=72 style='width:54pt'></td>
  <td width=72 style='width:54pt'></td>
  <td width=72 style='width:54pt'></td>
 </tr>
















 <tr height=19 style='height:14.25pt'>
  <td height=19 align=right style='height:14.25pt' x:num>2</td>
  <td align=right x:num>2</td>
  <td align=right x:num>2</td>
  <td colspan=6 style='mso-ignore:colspan'></td>
 </tr>
 <tr height=57 style='height:42.75pt;mso-xlrowspan:3'>
  <td height=57 colspan=9 style='height:42.75pt;mso-ignore:colspan'></td>
 </tr>
 <tr height=19 style='height:14.25pt'>
  <td height=19 colspan=2 style='height:14.25pt;mso-ignore:colspan'></td>
  <td colspan=7 rowspan=14 height=266 width=603 style='mso-ignore:colspan-rowspan;
  height:199.5pt;width:452pt'><!--[if gte vml 1]><v:shapetype id="_x0000_t75"
   coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"
   filled="f" stroked="f">
   <v:stroke joinstyle="miter"/>
   <v:formulas>
    <v:f eqn="if lineDrawn pixelLineWidth 0"/>
    <v:f eqn="sum @0 1 0"/>
    <v:f eqn="sum 0 0 @1"/>
    <v:f eqn="prod @2 1 2"/>
    <v:f eqn="prod @3 21600 pixelWidth"/>
    <v:f eqn="prod @3 21600 pixelHeight"/>
    <v:f eqn="sum @0 0 1"/>
    <v:f eqn="prod @6 1 2"/>
    <v:f eqn="prod @7 21600 pixelWidth"/>
    <v:f eqn="sum @8 21600 0"/>
    <v:f eqn="prod @7 21600 pixelHeight"/>
    <v:f eqn="sum @10 21600 0"/>
   </v:formulas>
   <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
   <o:lock v:ext="edit" aspectratio="t"/>
  </v:shapetype><v:shape id="_x0000_s1026" type="#_x0000_t75" style='position:absolute;
   margin-left:68.25pt;margin-top:7.5pt;width:347.25pt;height:186pt;z-index:1'
   fillcolor="windowText [64]" strokecolor="window [65]" strokeweight="3e-5mm"
   o:insetmode="auto">
   <v:fill color2="window [65]"/>
   <v:imagedata src="Book1.files/image001.png" o:title=""/>
   <x:ClientData ObjectType="Pict">
    <x:MoveWithCells/>
    <x:SizeWithCells/>
    <x:Locked>False</x:Locked>
    <x:AutoFill>False</x:AutoFill>
    <x:AutoLine>False</x:AutoLine>
    <x:CF>Bitmap</x:CF>
   </x:ClientData>
  </v:shape><![endif]--><![if !vml]><span style='mso-ignore:vglayout'>
  <table cellpadding=0 cellspacing=0>
   <tr>
    <td width=91 height=10></td>
   </tr>
   <tr>
    <td></td>
    <td><img width=463 height=248 src="Book1.files/image002.jpg" v:shapes="_x0000_s1026"></td>
    <td width=49></td>
   </tr>
   <tr>
    <td height=8></td>
   </tr>
  </table>
  </span><![endif]><!--[if !mso & vml]><span style='width:452.25pt;height:199.5pt'></span><![endif]--></td>
 </tr>
 <tr height=19 style='height:14.25pt'>
  <td height=19 colspan=2 style='height:14.25pt;mso-ignore:colspan'></td>
 </tr>
 <tr height=19 style='height:14.25pt'>
  <td height=19 colspan=2 style='height:14.25pt;mso-ignore:colspan'></td>
 </tr>
 <tr height=19 style='height:14.25pt'>
  <td height=19 colspan=2 style='height:14.25pt;mso-ignore:colspan'></td>
 </tr>
 <tr height=19 style='height:14.25pt'>
  <td height=19 colspan=2 style='height:14.25pt;mso-ignore:colspan'></td>
 </tr>
 <tr height=19 style='height:14.25pt'>
  <td height=19 colspan=2 style='height:14.25pt;mso-ignore:colspan'></td>
 </tr>
 <tr height=19 style='height:14.25pt'>
  <td height=19 colspan=2 style='height:14.25pt;mso-ignore:colspan'></td>
 </tr>
 <tr height=19 style='height:14.25pt'>
  <td height=19 colspan=2 style='height:14.25pt;mso-ignore:colspan'></td>
 </tr>
 <tr height=19 style='height:14.25pt'>
  <td height=19 colspan=2 style='height:14.25pt;mso-ignore:colspan'></td>
 </tr>
 <tr height=19 style='height:14.25pt'>
  <td height=19 colspan=2 style='height:14.25pt;mso-ignore:colspan'></td>
 </tr>
 <tr height=19 style='height:14.25pt'>
  <td height=19 colspan=2 style='height:14.25pt;mso-ignore:colspan'></td>
 </tr>
 <tr height=19 style='height:14.25pt'>
  <td height=19 colspan=2 style='height:14.25pt;mso-ignore:colspan'></td>
 </tr>
 <tr height=19 style='height:14.25pt'>
  <td height=19 colspan=2 style='height:14.25pt;mso-ignore:colspan'></td>
 </tr>
 <tr height=19 style='height:14.25pt'>
  <td height=19 colspan=2 style='height:14.25pt;mso-ignore:colspan'></td>
 </tr>
 <![if supportMisalignedColumns]>
 <tr height=0 style='display:none'>
  <td width=72 style='width:54pt'></td>
  <td width=237 style='width:178pt'></td>
  <td width=215 style='width:161pt'></td>
  <td width=28 style='width:21pt'></td>
  <td width=72 style='width:54pt'></td>
  <td width=72 style='width:54pt'></td>
  <td width=72 style='width:54pt'></td>
  <td width=72 style='width:54pt'></td>
  <td width=72 style='width:54pt'></td>
 </tr>
 <![endif]>
</table>

</body>

</html>
 

 

在项目中,我们可以先定制出一个excel模板并填充一两条数据(比如包含头、体、尾),在输出的时候,我们只需要把正文内容(文件体)那一部分用JAVA的IO输出就可以了,如果数据量很大,可以每隔一段时间就flush一下。

 

至此,可通过数据生成如上格式的HTML文本信息则避开大量对象的建立,如果将该HTML直接以application/excel返回浏览器时则Excel文件会比普通大一点,可以通过配置过滤器对该HTML进行压缩即可,如下:

response.reset();      
response.setContentType("application/zip;charset=GBK");     
String s = "查询-" + new java.sql.Date(System.currentTimeMillis()).toString().replaceAll("-","") + ".xls";     
String filename = s + ".zip";     
response.addHeader("Content-Disposition", "inline;filename=" + filename); 

 

---简单总结----

先建一个excel文件,如a.xls。填上两条伪数据。然后另存为网页,即htm格式,如a.htm。  
然后,用记事本打开htm格式的a.htm,这样excel文件格式代码就暴露在你面前。  
剩下的事,就是把a.htm源代码的伪数据部分,替成数据库里的数据,然后把替换后的整个a.htm源代码,用java的io写成一个后缀为xls的文件。就打完收工了。  
注意:为了不给内存增加压力,要把a.htm源代码分成三部分:头(伪数据部分 前的代码) + 伪数据部分 + 尾(伪数据部分 后的代码)。  
先把 头 写到文件,并flush。然后是 伪数据部分 ,替一条数据库里的记录就写到文件里,并flush。最后把 尾 写到文件,并flush。

 

重点就是要经常flush,不然数据大就OOM了;另外如果使用了list取数据,在使用完以后要及时list.clear().

 

 

不同版本下Excel数据量极限:

excel2000的工作表中最大只能有65536行数据,每一行最大只能有256列
2003下
行:65536
列:IV即230
2007下
行:1048576
列:XFD,26进制,16384列.

(在excel中atrl+shift+右箭头 atrl+shift+下箭头即可查看)

 

 

 

分享到:
评论
5 楼 tdqing 2010-09-01  
jdllove86 写道
但是如果数据在5W甚至更多文件会特别大,我导出的文件30多列。5W大约50-60M,打开需要很长时间,大约5分钟以上吧!而且特别容易把机器的内存全吃光了,不懂LZ有什么好办法没?

这里说的是导出,至于打开慢,就和offie有关了。
ps:剑走偏锋,你可以设置一下response的head,弹出下载窗口而不是直接打开,这样就不会显得应用反应慢了。
4 楼 jdllove86 2010-08-31  
但是如果数据在5W甚至更多文件会特别大,我导出的文件30多列。5W大约50-60M,打开需要很长时间,大约5分钟以上吧!而且特别容易把机器的内存全吃光了,不懂LZ有什么好办法没?
3 楼 jdllove86 2010-08-31  
很好,是我想要的。
2 楼 newwpp 2010-06-01  
很专业。长见识
1 楼 welody 2010-05-28  
田哥,太强大了。

相关推荐

    Java_批量导出大数据量Excel方法.zip

    在Java开发中,批量导出大数据量到Excel是一项常见的任务,尤其在数据分析、报表生成或者数据交换场景下。为了高效地处理这种情况,开发者通常需要掌握一些特定的技术和策略。本资料"Java_批量导出大数据量Excel方法...

    java poi导出大量数据到Excel

    1. **内存优化**:当数据量非常大时,建议使用Apache POI提供的SXSSF类来降低内存占用。 2. **性能考虑**:在实际应用中,应尽可能减少对Excel文件的读写操作,避免频繁创建和销毁对象。 3. **异常处理**:在处理...

    导出大量数据到excel

    在导出数据时,可选择将Excel或CSV文件进行压缩,具体步骤如下: 1. 文件压缩:使用WinRAR、7-Zip等压缩软件,将数据文件添加到压缩包中。 2. 设置参数:根据需求调整压缩级别,以平衡压缩比和压缩速度。 3. 传输与...

    多个excel导出压缩成zip 文件 数据量大导出

    # 导出数据到多个Excel文件 data = ... # 数据 for i, chunk in enumerate(pd.groupby(data, group_keys=False, chunksize=10000)): chunk.to_excel(f'chunk_{i}.xlsx', index=False) # 压缩文件 with ...

    数据库大量数据导出Excel

    其次,在实验过程中,大数据量的导出很容易引发内存溢出,调整JVM的内存大小治标不治本。很多人建议保存为.CSV格式的文件。不过,.CSV方式导出也存在问题:首先,如果用excel来打开csv,超过65536行的数据都会看不见...

    从数据库将大量数据导出到Excel文件程序总结

    这是我在公司实习的时候研究的课题,主要将大量数据从数据库导出到Excel文件。(一般是值Excel2007及以后版本)因为Excel2003及以前的版本中能保持的数据量是有限制的。Excel2007及以后版本中的数据能保持100万条...

    C# 大数据量快速导出到 Excel方法

    在C#编程中,将大数据量导出到Excel是一个常见的需求,特别是在数据分析、报表生成或者数据交换场景下。Microsoft.Office.Interop.Excel库是.NET Framework提供的一个用于与Microsoft Excel交互的COM接口,它允许...

    C#大量数据导出到Excel自动分页导出

    C#大量数据导出到Excel,超过65536行时自动分页导出

    使用POI导出大数据量到EXCEL

    "使用POI导出大数据量到EXCEL"这个主题涉及到如何高效地利用POI处理大量数据并将其导出到Excel文件中。以下是对这个主题的详细讲解。 1. **Apache POI简介** Apache POI 是一个开源项目,它提供了Java API来创建、...

    delphi高效率导出数据到excel

    这时,如果使用传统的方法,例如使用 OLE 自动化来一个一个地将数据写入到 Excel 中,这将非常耗时,尤其是在数据量很大的情况下。为了解决这个问题,我们可以使用 DBGridEh 控件来快速导出数据到 Excel 中。 使用 ...

    数据库导出数据为excel文件

    数据库导出数据为Excel文件是IT领域中常见的数据处理任务,尤其在数据分析、报表生成以及数据交换时非常实用。这个工具显然旨在简化这一过程,它支持多种类型的数据库,这意味着无论你使用的是MySQL、Oracle、SQL ...

    plsql导出数据到excel的三种方法

    4. **查看导出内容**:导出完成后,系统会自动打开包含导出数据的Excel文件,其中不仅包含数据本身,还会显示用于查询数据的SQL脚本。 5. **查看SQL脚本**:点击文件中的“SQL Statement”标签页,可以查看所使用的...

    java导出30万数据量的excel(采用生成多个excel,最后打包zip)

    在Java开发中,处理大数据量的Excel导出是一项常见的任务,尤其当数据量达到数十万条时,单个Excel文件可能会遇到性能瓶颈或格式限制。本项目针对这一问题提出了一种解决方案,即分块生成多个Excel文件,然后将它们...

    Excel数据批量导入与Excel文件的导出

    3. **Power Pivot数据模型**:对于大数据量的分析,Excel的Power Pivot提供了强大的数据建模功能。用户可以构建数据模型并导出为Power BI报表,实现更高级的数据可视化和分析。 4. **VBA编程导出**:通过VBA,可以...

    extjs grid数据导出excel文件

    在实际应用中,可能还需要考虑性能优化,例如分批导出大数据量,或者在后台服务器处理导出以避免阻塞浏览器。此外,为了提供更好的用户体验,可以添加进度提示、错误处理等功能。 总结来说,EXTJS Grid的数据导出到...

    Java导出数据到Excel文件中(支持多表头)

    在Java编程中,导出数据到Excel文件是一项常见的任务,特别是在数据分析、报表生成或数据交换等场景下。这里我们将深入探讨如何使用Java实现从数据库中查询数据并将其以多级表头的形式导入到Excel文件中。 首先,...

    C# 导入Excel文件到ListView和导出ListView到Excel文件

    - **性能优化**: 大文件或大量数据导入/导出时,应考虑分批处理,避免一次性加载所有数据导致内存占用过高。 - **用户交互**: 提供进度指示器或取消功能,提升用户体验。 - **错误处理**: 捕获可能出现的文件读写...

    C# 快速导出大量数据至Excel2007和2003(原码)

    对于C#来说,处理Excel文件可以借助Microsoft的Office Interop库,但这种方式在处理大量数据时效率较低,因为需要启动Excel进程并进行内存映射。因此,更推荐使用第三方库,如EPPlus(用于.xlsx)和NPOI(支持.xlsx...

    JAVA导出数据到excel中大数据量的解决方法

    web项目中需要有将数据导出excel的操作需求 使用html格式导出方法,但在...待所有数据写完,将各个小excel文件进行打包,输出到输出流中。 一小部分说明 见 http://blog.csdn.net/lisen1987/article/details/16857359

    easyui+数据导出为Excel

    同时,由于纯前端导出可能会面临大数据量的性能挑战,所以对于非常大的数据集,可能需要考虑分批导出或者服务端处理。 总的来说,通过结合EasyUI的前端界面和SheetJS的数据处理能力,我们可以实现在浏览器端直接将...

Global site tag (gtag.js) - Google Analytics