`
flysky
  • 浏览: 65373 次
社区版块
存档分类
最新评论

excel download性能问题解决

阅读更多
性能问题:
QAC系统的excel下载时速度非常非常的慢,今天User需要下载445条记录,系统就没反应了,等30分钟都无法正常下载;不过下载200条以下的记录时是ok的。说明是内存或者什么性能上的问题了。

问题解决:
Debug跟了一下程序,发现QAC里导出excel是用最原始的方式,就是用循环把所有信息拼成一个html长字符串,然后就直接output出来了。问题就出现在这循环里了,假如下载500条记录,每条记录50个columns,那么就是循环500*50次,而这2.5万次循环里,之前的程序是用String的“+”操作直接拼字符串的,因为String是final类,每一次“+”操作实际上都是重新new一个String对象,把引用指向新的对象,所以速度非常非常的慢!

于是我把String的“+”操作换成了StringBuffer的append操作,效率提高了好几个等级!!之前30分钟都download不下来的excel文件,现在不到30秒就能下载下来了!

StringBuffer的效率真赞啊~

哈哈,解决了一个长期以来遗留下来的性能问题,好有成就感,哈哈:)

附:
1. 之前的程序(String的“+”操作):
public static void exportHtmlFileToXLS(CachedRowSet crs, String strFilePath, String strEncode) throws SQLException, IOException
  {
    ResultSetMetaData rsmd = crs.getMetaData();
    int numColumn = rsmd.getColumnCount();
    String temp = "";
    // Build Head of Field Name
    temp += "<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>";
    temp += "<table border='1'>";
    temp += "<tr>";
    for (int i = 1; i <= numColumn; i++) {
      temp += "<td align='center'>";
      temp += rsmd.getColumnName(i);
      temp += "</td>";
    } // End for
    temp += "</tr>";
    temp += "<tr>";
    if (crs.size() > 0) {
      while (crs.next()) {   
      System.out.println(System.currentTimeMillis());
      long time1=System.currentTimeMillis();
        for (int i = 1; i <= numColumn; i++) {
          temp += "<td align='center'>";
          temp += Utility.notNull(crs.getString(rsmd.getColumnName(i))).replaceAll(",", "");
          temp += "</td>";
//          if(debug) System.out.println("[" + rsmd.getColumnName(i) + "][" + rsmd.getColumnTypeName(i) + "]");
        } // End for
        temp += "</tr>";
        System.out.println(System.currentTimeMillis());
        long time2=System.currentTimeMillis();
        long time=time2-time1;
        System.out.println(time);
      } // End while(crs.next())
    } // End if(crs.size()>0)
    temp += "</table>";
    File csvFile = new File(strFilePath);

    FileOutputStream fos = new FileOutputStream(csvFile);
    OutputStreamWriter osw = new OutputStreamWriter(fos, strEncode);
    //System.out.println("encode="+osw.getEncoding());

    osw.write(temp);
    osw.close();
  }
2. 改进后的程序(StringBuffer的append操作):
public static void exportHtmlFileToXLS(CachedRowSet crs, String strFilePath, String strEncode) throws SQLException, IOException
  {
    ResultSetMetaData rsmd = crs.getMetaData();
    int numColumn = rsmd.getColumnCount();
    String temp = "";
    //modified by linna at 20090622;start;
    StringBuffer tempBuf=new StringBuffer();
    tempBuf.append("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>");
    tempBuf.append("<table border='1'>");
    tempBuf.append("<tr>");
    for (int i = 1; i <= numColumn; i++) {
    tempBuf.append("<td align='center'>");
    tempBuf.append(rsmd.getColumnName(i));
    tempBuf.append("</td>");
    } // End for
    tempBuf.append("</tr>");
    tempBuf.append("<tr>");
    if (crs.size() > 0) {
      while (crs.next()) {   
      System.out.println(System.currentTimeMillis());
      long time1=System.currentTimeMillis();
        for (int i = 1; i <= numColumn; i++) {
        tempBuf.append("<td align='center'>");
      tempBuf.append(Utility.notNull(crs.getString(rsmd.getColumnName(i))).replaceAll(",", ""));
        tempBuf.append("</td>");
//          if(debug) System.out.println("[" + rsmd.getColumnName(i) + "][" + rsmd.getColumnTypeName(i) + "]");
        } // End for
        tempBuf.append("</tr>");
        System.out.println(System.currentTimeMillis());
        long time2=System.currentTimeMillis();
        long time=time2-time1;
        System.out.println(time);
      } // End while(crs.next())
    } // End if(crs.size()>0)
    tempBuf.append("</table>");
    temp=tempBuf.toString();
  //modified by linna at 20090622;end;
    File csvFile = new File(strFilePath);

    FileOutputStream fos = new FileOutputStream(csvFile);
    OutputStreamWriter osw = new OutputStreamWriter(fos, strEncode);
    //System.out.println("encode="+osw.getEncoding());

    osw.write(temp);
    osw.close();

  }
分享到:
评论

相关推荐

    BasicExcel_src1.5_basicexcel_

    开发者或使用者可以通过查看源代码来学习如何与Excel文件交互,如何实现跨版本的兼容性,以及如何优化数据读取性能。此外,这个升级过程也可以作为一个案例研究,展示在软件维护和升级中的常见挑战和解决方案。对于...

    table2Excel.rar

    本文将深入探讨Table2Excel.js的原理,以及如何针对IE浏览器进行优化,解决上述问题。 首先,我们来理解Table2Excel.js的工作机制。这个库利用了HTML5的`data:` URL和`navigator.msSaveBlob` API(在IE中特有)来...

    Access批量转Excel(支持WIN11)

    总的来说,"Access批量转Excel(支持WIN11)"工具通过自动化和优化Access到Excel的转换过程,解决了数据处理中的痛点。它为IT专业人员和数据分析师提供了便利,使得他们在处理Access数据库时能够更加灵活高效地进行...

    读取Excel表格的插件库

    - **性能优化**:对于大型Excel文件,可能需要考虑分批读取或缓存策略,避免一次性加载造成内存压力。 - **数据安全**:如果Excel文件包含敏感信息,应确保在转换和存储过程中符合数据安全规范。 - **版本控制**:...

    Export2Excel.js

    总结来说,"Export2Excel.js"是一个利用JavaScript技术,尤其是Blob对象,将数据导出为Excel文件的解决方案。它可能包含了将数据格式化、创建Blob对象、触发文件下载等一系列步骤。在实际应用中,这个功能可以极大地...

    excel合并工具.zip

    "Excel合并工具.zip" 提供的解决方案正是针对这一需求。这个压缩包包含了一个可以帮助用户快速、方便地合并Excel文件的工具。下面将详细介绍这个工具以及与之相关的Excel合并知识点。 1. Excel文件合并的基本概念:...

    C# 对Excel文件进行读取,显示,另存为

    在.NET环境中,C#是一种广泛使用的编程语言,用于创建各种应用程序,包括与数据处理相关的任务。本篇文章将详细探讨如何使用C#对Excel文件进行读取、...无论是读取、显示还是保存Excel文件,都有成熟的解决方案来支持。

    basic_excel excel开源读写库[修正bug1.1]

    为了解决这个问题,开源社区推出了一系列专门用于读写Excel的库,其中,`basic_excel`便是其中之一。本文将详细介绍`basic_excel`开源库的最新修正版1.1,以及如何利用它来高效地处理Excel数据。 `basic_excel`是一...

    Excel-Download:导入数据到 Excel 并提供文件下载接口

    在实际开发中,你可能还会遇到如并发下载、多线程处理、性能优化等问题,都需要结合具体场景进行调整和解决。对于“Excel-Download-master”这个文件名,通常意味着这是一个项目仓库的主分支,包含了完整的代码实现...

    extjs4导出excel

    你的博客文章可能会详细讨论这些问题以及解决方法,对于遇到相同问题的人来说是非常有价值的参考资料。 至于压缩包中的"export"文件,可能包含了一个实现以上步骤的示例代码,或者是一些必要的资源文件,如CSS样式...

    SAP Analysis for Microsoft Excel SP10_70004974 包含 EPM

    这款软件的版本号SP10_70004974表明它已经更新到了服务打包10,这是一个包含了增强性能和新特性的版本。 EPM(Enterprise Performance Management)是SAP Analysis for Microsoft Excel的核心组件之一,它是企业...

    js前端下载并编辑Excel样式

    总结,使用JavaScript在前端下载并编辑Excel样式涉及到多个步骤,包括选择合适的库、创建Excel文件、设置样式、转换为Data URL以及考虑兼容性问题。通过理解这些概念和实践,开发者可以构建出功能丰富的前端Excel...

    Export2Excel.js+Blob导出为表格数据

    为了解决这些问题,可以考虑分批处理数据,或者使用服务端来生成Excel文件。此外,对于兼容性问题,可以使用polyfill或寻找替代方案,如使用`FileSaver.js`库来处理文件保存。 总结起来,`Export2Excel.js`和`Blob....

    Laravel开发-excel-generator

    "Laravel开发-excel-generator"项目专注于为Laravel 5提供一个简单的解决方案,帮助开发者快速实现这个功能。下面我们将深入探讨相关知识点。 首先,我们了解Laravel。Laravel是PHP的一个现代、优雅的开源Web应用...

    vue实现导出Excel的两个js文件-Blob+Export2Excel

    在开发过程中,确保你的数据来源和Vue应用在同一域名下,或者使用CORS等手段解决跨域问题。 此外,对于大数据量的导出,你可能需要考虑性能优化,比如分批导出,或者在服务端生成Excel文件并提供下载链接。同时,...

    java excel 下载功能插件

    6. **安全与性能优化**: 在实现Excel下载时,应考虑性能和安全问题。例如,避免一次性加载大量数据导致内存溢出,可以分批处理数据。另外,限制下载频率和大小,防止恶意用户滥用服务。对于敏感数据,需要确保它们在...

    jquery.table2excel

    同时,开发者也可以根据实际需求对其进行二次开发,例如添加自定义样式到导出的Excel文件,或者处理大量数据时优化性能。 总的来说,jQuery.table2excel是一个实用的工具,对于需要快速实现表格数据导出功能的...

    ASP.NET与Excel的交互

    ASP.NET是一种基于.NET框架的服务器端编程模型,用于构建动态Web应用程序。在B/S(Browser/Server)架构中,它提供了强大的...在实际应用中,还需要注意性能优化、错误处理和安全性问题,确保服务的稳定性和用户体验。

    jquery.table2excel.js

    - 大数据量:对于非常大的表格,由于内存限制,可能会出现性能问题。可以考虑分批导出,或者寻找更专业的数据导出解决方案。 总之,“jquery.table2excel.js”为开发者提供了一种简单而实用的手段,将网页中的HTML...

    纯js-json导出excel

    当需要将JSON格式的数据导出为Excel文件时,纯JavaScript解决方案就显得尤为重要,因为这可以避免依赖服务器端处理或者第三方库。"纯js-json导出excel"的实践就是这样一个例子,它允许开发者直接在客户端将JSON数据...

Global site tag (gtag.js) - Google Analytics