zoukankan      html  css  js  c++  java
  • java导出excel(解决导出几万条数据内存溢出的问题)

    
    import java.io.BufferedOutputStream;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class Test {  
        public static void main(String[] args) {  
        	System.out.println(System.currentTimeMillis());
            StringBuffer sb = new StringBuffer();  
            try {  
                DataOutputStream rafs = new DataOutputStream(  
                        new BufferedOutputStream(new FileOutputStream(new File(  
                                "d://test.xlsx"))));  
                sb.append("<?xml version="1.0"?>");  
                sb.append("
    ");  
                sb.append("<?mso-application progid="Excel.Sheet"?>");  
                sb.append("
    ");  
                sb.append("<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"");  
                sb.append("
    ");  
                sb.append("  xmlns:o="urn:schemas-microsoft-com:office:office"");  
                sb.append("
    ");  
                sb.append(" xmlns:x="urn:schemas-microsoft-com:office:excel"");  
                sb.append("
    ");  
                sb.append(" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"");  
                sb.append("
    ");  
                sb.append(" xmlns:html="http://www.w3.org/TR/REC-html40">");  
                sb.append("
    ");  
                sb.append(" <Styles>
    ");  
                sb.append("  <Style ss:ID="Default" ss:Name="Normal">
    ");  
                sb.append("   <Alignment ss:Vertical="Center"/>
    ");  
                sb.append("   <Borders/>
    ");  
                sb.append("   <Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/>
    ");  
                sb.append("   <Interior/>
    ");  
                sb.append("   <NumberFormat/>
    ");  
                sb.append("   <Protection/>
    ");  
                sb.append("  </Style>
    ");  
                sb.append(" </Styles>
    ");  
    //             int sheetcount = 0;  
                int recordcount = 100000;  
                int currentRecord = 0;  
                int total = 100000;  
                int col = 10;  
                sb.append("<Worksheet ss:Name="Sheet0">");  
                sb.append("
    ");  
                sb.append("<Table ss:ExpandedColumnCount="" + col  
                        + "" ss:ExpandedRowCount="" + total  
                        + "" x:FullColumns="1" x:FullRows="1">");  
                sb.append("
    ");  
                for (int i = 0; i < total; i++) {  
                    if ((currentRecord == recordcount  
                            || currentRecord > recordcount || currentRecord == 0)  
                            && i != 0) {// 一个sheet写满  
                        currentRecord = 0;  
                        rafs.write(sb.toString().getBytes());  
                        sb.setLength(0);  
                        sb.append("</Table>");  
                        sb.append("<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">");  
                        sb.append("
    ");  
                        sb.append("<ProtectObjects>False</ProtectObjects>");  
                        sb.append("
    ");  
                        sb.append("<ProtectScenarios>False</ProtectScenarios>");  
                        sb.append("
    ");  
                        sb.append("</WorksheetOptions>");  
                        sb.append("
    ");  
                        sb.append("</Worksheet>");  
                        sb.append("<Worksheet ss:Name="Sheet" + i / recordcount  
                                + "">");  
                        sb.append("
    ");  
                        sb.append("<Table ss:ExpandedColumnCount="" + col  
                                + "" ss:ExpandedRowCount="" + recordcount  
                                + "" x:FullColumns="1" x:FullRows="1">");  
                        sb.append("
    ");  
                    }  
                    sb.append("<Row>");  
                    for (int j = 0; j < col; j++) {  
                    	if(i==0) sb.append("<Cell><Data ss:Type="String">标题"+j+"</Data></Cell>"); 
                    	else sb.append("<Cell><Data ss:Type="String">c"+i+"&"+j+"</Data></Cell>"); 
                        
                        sb.append("
    ");  
                    }  
                    sb.append("</Row>");  
                    if (i % 5000 == 0) {  
                        rafs.write(sb.toString().getBytes("utf-8"));  //注意编码
                        rafs.flush();  
                        sb.setLength(0);  
                    }  
                    sb.append("
    ");  
                    currentRecord++;  
                }  
                rafs.write(sb.toString().getBytes());  
                sb.setLength(0);  
                sb.append("</Table>");  
                sb.append("<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">");  
                sb.append("
    ");  
                sb.append("<ProtectObjects>False</ProtectObjects>");  
                sb.append("
    ");  
                sb.append("<ProtectScenarios>False</ProtectScenarios>");  
                sb.append("
    ");  
                sb.append("</WorksheetOptions>");  
                sb.append("
    ");  
                sb.append("</Worksheet>");  
                sb.append("</Workbook>");  
                sb.append("
    ");  
                rafs.write(sb.toString().getBytes());  
                rafs.flush();  
                rafs.close();  
                System.out.println(System.currentTimeMillis());
            } catch (FileNotFoundException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    } 
    

      

  • 相关阅读:
    设计模式之简单数据工厂
    Linux CPU affinity
    QT操作Excel(通过QAxObject使用了OLE,前提是本地安装了Excel)
    QT 4.2.2的安装(安装完还要再编译,注意设置Windows Path)
    你要看透的56条人生哲理(还可以)
    提升Delphi编程效率必须使用的快捷键(Delphi2007版本)
    Delphi中复制带有String的记录结构时不能使用Move之类的内存操作函数
    普林斯顿大学算法公开课(1)----介绍
    iOS7 初体验
    SQL Server 性能优化之——系统化方法提高性能
  • 原文地址:https://www.cnblogs.com/Nbge/p/3792781.html
Copyright © 2011-2022 走看看