Java大批量导出数据,格式可以为xml或excel.

最近项目中用到大数据量导出功能.不能确定到底有多大,最少十来万条记录. 
        100M的excel文件,excel2003已经不能够打开了,只能用2007版.不知道后期数据量更大的时候怎么办.废话不多说,上代码.Copy别人的.以备以后使用. 
        
Java代码   收藏代码
  1. package com.epay.utils;  
  2.   
  3. /** 
  4.  * 大数据量导出成EXCEL或XML 
  5.  * @author J.W 
  6.  * 2011-06-08 
  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.xml"))));  
  22.             sb.append("<?xml version=\"1.0\"?>");  
  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(" <Styles>\n");  
  37.             sb.append("  <Style ss:ID=\"Default\" ss:Name=\"Normal\">\n");  
  38.             sb.append("   <Alignment ss:Vertical=\"Center\"/>\n");  
  39.             sb.append("   <Borders/>\n");  
  40.             sb.append("   <Font ss:FontName=\"宋体\" x:CharSet=\"134\" ss:Size=\"12\"/>\n");  
  41.             sb.append("   <Interior/>\n");  
  42.             sb.append("   <NumberFormat/>\n");  
  43.             sb.append("   <Protection/>\n");  
  44.             sb.append("  </Style>\n");  
  45.             sb.append(" </Styles>\n");  
  46.             int sheetcount = 0;  
  47.             int recordcount = 20;  
  48.             int currentRecord = 0;  
  49.             int total = 100;  
  50.             int col = 20;  
  51.             sb.append("<Worksheet ss:Name=\"Sheet0\">");  
  52.             sb.append("\n");  
  53.             sb.append("<Table ss:ExpandedColumnCount=\"" + col  
  54.                     + "\" ss:ExpandedRowCount=\"" + total  
  55.                     + "\" x:FullColumns=\"1\" x:FullRows=\"1\">");  
  56.             sb.append("\n");  
  57.             for (int i = 0; i < total; i++) {  
  58.                 if ((currentRecord == recordcount  
  59.                         || currentRecord > recordcount || currentRecord == 0)  
  60.                         && i != 0) {// 一个sheet写满  
  61.                     currentRecord = 0;  
  62.                     rafs.write(sb.toString().getBytes());  
  63.                     sb.setLength(0);  
  64.                     sb.append("</Table>");  
  65.                     sb.append("<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">");  
  66.                     sb.append("\n");  
  67.                     sb.append("<ProtectObjects>False</ProtectObjects>");  
  68.                     sb.append("\n");  
  69.                     sb.append("<ProtectScenarios>False</ProtectScenarios>");  
  70.                     sb.append("\n");  
  71.                     sb.append("</WorksheetOptions>");  
  72.                     sb.append("\n");  
  73.                     sb.append("</Worksheet>");  
  74.                     sb.append("<Worksheet ss:Name=\"Sheet" + i / recordcount  
  75.                             + "\">");  
  76.                     sb.append("\n");  
  77.                     sb.append("<Table ss:ExpandedColumnCount=\"" + col  
  78.                             + "\" ss:ExpandedRowCount=\"" + recordcount  
  79.                             + "\" x:FullColumns=\"1\" x:FullRows=\"1\">");  
  80.                     sb.append("\n");  
  81.                 }  
  82.                 sb.append("<Row>");  
  83.                 for (int j = 0; j < col; j++) {  
  84.                     System.out.println(i);  
  85.                     sb.append("<Cell><Data ss:Type=\"String\">111</Data></Cell>");  
  86.                     sb.append("\n");  
  87.                 }  
  88.                 sb.append("</Row>");  
  89.                 if (i % 5000 == 0) {  
  90.                     rafs.write(sb.toString().getBytes());  
  91.                     rafs.flush();  
  92.                     sb.setLength(0);  
  93.                 }  
  94.                 sb.append("\n");  
  95.                 currentRecord++;  
  96.             }  
  97.             rafs.write(sb.toString().getBytes());  
  98.             sb.setLength(0);  
  99.             sb.append("</Table>");  
  100.             sb.append("<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">");  
  101.             sb.append("\n");  
  102.             sb.append("<ProtectObjects>False</ProtectObjects>");  
  103.             sb.append("\n");  
  104.             sb.append("<ProtectScenarios>False</ProtectScenarios>");  
  105.             sb.append("\n");  
  106.             sb.append("</WorksheetOptions>");  
  107.             sb.append("\n");  
  108.             sb.append("</Worksheet>");  
  109.             sb.append("</Workbook>");  
  110.             sb.append("\n");  
  111.             rafs.write(sb.toString().getBytes());  
  112.             rafs.flush();  
  113.             rafs.close();  
  114.         } catch (FileNotFoundException e) {  
  115.             e.printStackTrace();  
  116.         } catch (IOException e) {  
  117.             e.printStackTrace();  
  118.         }  
  119.     }  
  120. }  

        
        文件格式可以自定义,改成XML或者excel都可以, 代码复制到eclipse可以直接运行.还需要再研究研究poi导出.完了以后做个比较,顺便记录下来.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中进行大批量导出Excel时,可能会遇到内存溢出的问题。这是因为Excel文件通常占用较大的内存空间,当数据量较大时,可能会超过JVM所分配的内存限制。 为了解决这个问题,可以采取以下几种方法: 1. 分批次导出:将要导出数据分成多个批次进行导出,每次导出一部分数据,以减少内存占用。可以根据数据的大小和服务器的内存情况来确定每个批次的大小。 2. 使用XSSFWorkbook替代HSSFWorkbook:HSSFWorkbook是用于处理Excel 97-2003格式的库,而XSSFWorkbook则是处理Excel 2007及更高版本的库。后者的内存占用要比前者低,因此可以考虑将工作簿对象由HSSFWorkbook替换为XSSFWorkbook。 3. 使用SXSSFWorkbook:SXSSFWorkbook是Apache POI提供的一种特殊的工作簿对象,它可以将数据直接写入磁盘而不是内存,从而大大降低内存占用。使用SXSSFWorkbook需要注意的是,导出Excel文件不能被随机访问,只能顺序读取。 4. 增加JVM内存限制:可以通过增加JVM的堆内存限制来解决内存溢出问题。可以通过修改JVM启动参数中的-Xmx和-Xms来增加堆内存限制。但是这种方法需要根据服务器的硬件资源和其他应用的内存需求进行合理的配置和调优。 5. 使用CSV格式代替Excel:如果Excel格式并不是必须要求,可以考虑将数据导出为CSV格式。CSV格式的文件较小,占用较少的内存,并且可以直接用文本编辑器打开和编辑。 以上是解决Java大批量导出Excel内存溢出问题的几种方法,可以根据具体情况选择适合的方法进行解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值