`
dongmingj
  • 浏览: 10062 次
文章分类
社区版块
存档分类
最新评论

异步导出excel表格(1)

阅读更多

        在现在的ERP系统中,数据库往往很大,批量导出几万甚至几十万条记录已经是很常见的事情。一般数据库里存在着上百万甚至上千万的数据,这种情况,对于一般的服务器,数据库查询时间要超过十分钟,对于复杂的查询操作,甚至几十分钟。这时对于客户端的请求,可能会等待很长时间才能返回响应。客户的感觉好像是系统没有响应。

       针对大数据处理问题,ERP系统一般采用异步处理方式。

       异步导出excel包括提交导出操作、处理导出操作、下载导出文件、定期删除生成的临时文件。

       系统中用到的框架:jxls(主要用于生成excel)、quartz(定时删除临时文件)

       用户请求操作流程基本如下:

        用户提交任务后,保存任务数据(方便用户查询任务处理状态)到数据库,提交线程到ExcecutorService里。我采用的是mysql数据库,经过测试,发现执行一条SQL语句会占用CPU一个线程,并且在处理过程中,系统占用率一般在95%。如果多个线程导出操作同时处理,会造成系统CPU占用过量,ERP系统本身响应变的很慢或处在假死的状态。因此,我采用Executors.newSingleThreadExecutor 线程池(这个线程保持同一时间只有一个线程在处理,其它的依次排队等待)处理导出线程。

任务PMD如下:



 

        数据获取类名、数据获取方法名、数据获取参数串三个字段主要用于处理系统在处理导出的过程中被异常关闭,下次系统启动时,会自动执行未执行完的操作。具体实现方法见后面章节。

        文件模板编码,用于标识模板文件,方便以后扩展,此例中暂时不使用。

        导出文件文件模板路径,主要保存excel模板的路径。

        数据与模板关联文件,保存jxls上面关联规则beansMap

        任务当前状态,任务状态:已提交、正处理、处理完成、处理失败。

        任务文件是否已删除,标识当前导出文件是否已经被quartz删除(可以设置时间,过期文件会被Job删除)。

        任务来源,标识属于哪类线程。

      

        任务处理完成后,用户可以请求系统下载文件。

        用户下载流程如下:


下载文件部分代码分享:

	public void downloadFile(HttpServletRequest request, HttpServletResponse response) {
		try {
		String filePath = request.getParameter("filePath");
		final String generateFilePrefix = request.getSession().getServletContext().getRealPath("/") + "export\\generate\\";
		File outputFile = new File(generateFilePrefix + filePath);
		long fileLength = outputFile.length();
		if(!outputFile.exists()){
			response.setCharacterEncoding( "GBK" );
			response.setContentType("text/html");
			response.getOutputStream().println(new String("找不到导出文件,请重新导出!".getBytes(), "ISO-8859-1") );
			response.getOutputStream().flush();
			response.getOutputStream().close();
			return;
		}
		response.setContentType("text/html;charset=UTF-8");
		response.setHeader("Content-Disposition", "attachment;filename=\""
						+ new String(filePath.getBytes("GBK"), "ISO-8859-1")
						+ "\"");
		response.setHeader("Content-Length", String.valueOf(fileLength));
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		bis = new BufferedInputStream(new FileInputStream(generateFilePrefix + filePath));
		bos = new BufferedOutputStream(response.getOutputStream());
		byte[] buff = new byte[2048];
		int bytesRead;
		while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { 
			bos.write(buff, 0, bytesRead);
		}
		bis.close();
		bos.close();
		} catch(IOException e) {
			e.printStackTrace();
			try {
				response.setCharacterEncoding( "GBK" );
				response.setContentType("text/html");
				response.getOutputStream().println(new String("导出失败!请联系管理员!".getBytes(), "ISO-8859-1") );
				response.getOutputStream().flush();
				response.getOutputStream().close();
			} catch(IOException ioe) {
				ioe.printStackTrace();
			}
			return;
		}
	}

  

  • 大小: 14.5 KB
  • 大小: 20.2 KB
  • 大小: 11.9 KB
分享到:
评论

相关推荐

    jQuery把页面上的表格导出Excel表格

    通过jQuery技术,把页面上的表格导出Excel,导出时解决纯数据导出后显示科学计数法和日期型导出后为#号显示问题

    gridview导出excel表格

    3. **性能考虑**:对于大数据量的导出,应考虑分页导出或者后台异步导出等方式,避免阻塞UI线程。 4. **安全性**:在导出过程中,还需要注意防止XSS攻击等问题。 #### 五、总结 通过上述分析可以看出,利用ASP.NET ...

    android 导出数据到excel表格文件 .zip

    在Android平台上,将数据导出到Excel表格是一项常见的需求,特别是在数据管理和分析的应用场景中。这个.zip文件似乎包含了实现这一功能的代码或资源,命名为"familybill",可能是一个家庭账单管理应用的示例。下面...

    qml导出到excel

    - 如果数据量很大,考虑分批处理或者异步导出,以免阻塞UI。 以上就是从QML的`TableView`导出数据到Excel的关键步骤和技术。实际应用中,你可能需要根据具体的需求和环境进行调整,例如添加进度条反馈、支持自定义...

    Easyui+SpringMVC导出Excel

    你可以根据数据结构动态生成Excel表格。 5. **设置响应头**:在SpringMVC的响应中,你需要设置合适的HTTP头信息,如`Content-Type`设为`application/vnd.ms-excel`,`Content-Disposition`设为`attachment; ...

    将listcontrl控件里的数据导出到excel表格里

    标题提到的"将listcontrl控件里的数据导出到excel表格里"就是这样一个需求。 要实现这个功能,你需要遵循以下步骤: 1. **数据获取**:首先,你需要从listctrl控件中读取所有数据。这通常通过遍历控件的所有行和列...

    easyui datagrid 数据导出到Excel

    文件`Jquery_easyui_datagrid_js导出excel.doc`可能是文档说明或者包含插件使用的示例代码。通常,jQuery插件能简化Datagrid数据导出的操作。一种常见的方式是使用`html2canvas`和`jsPDF`库,它们可以将HTML内容转换...

    多线程导出Excel(百万级别)_Java版优化.zip

    用开源 Apache POI 技术导出Excel,解决导出大数据出现OOM、栈溢出问题,此资源可实现百万级数据多线程分批导出Excel文件,不会内存溢出,生产环境已很稳定的使用者,所以用到的技术很核心、值得参考

    QT 高效 导入导出excel , tableWidget显示

    在QT编程中,高效地导入和导出Excel数据并将其显示在`tableWidget`中是一项常见的需求。这里我们将深入探讨如何实现这一功能,以及优化性能的方法。QT是一个跨平台的应用程序开发框架,提供了丰富的GUI组件,`...

    easyui导出excel工具

    总结,EasyUI的datagrid导出Excel工具类为开发者提供了一种便捷的方式,通过前后端配合,将网页中的数据快速转换成Excel文件,满足了用户对数据管理的需求。在实际应用中,需要注意数据安全和性能优化,确保功能的...

    js导出excel封装【原生、配置式】 示例

    在JavaScript开发中,导出Excel是一项常见的需求,特别是在数据分析、报表生成或用户数据导出的场景下。原生JavaScript导出Excel的方式可以帮助我们摆脱对第三方库的依赖,提高项目的轻量化。本示例将详细介绍如何...

    excel导出工具类可用于项目中的execl表格导出

    在项目开发中,Excel表格的导出功能是一个常见的需求,特别是在数据分析、报表生成以及数据交换等领域。本知识点将深入探讨如何使用Java或.NET(如ASP.NET MVC)来实现Excel导出工具类,以便在项目中有效地处理Excel...

    jQuery表格导出转为excel表格插件.zip

    本资源"jQuery表格导出转为excel表格插件.zip"显然是一个提供功能,允许用户将jQuery表格数据导出为Excel格式的插件。这种功能在数据管理、报告生成和数据分析等场景下非常有用。 首先,我们来了解一下jQuery库的...

    导出和打印Excel 太慢 请加进度条

    在Excel中,导出和打印大型工作簿可能会消耗大量时间,特别是在处理包含复杂公式、大量数据或图表的工作表时。这种延迟可能会影响工作效率,并且在没有进度指示的情况下,用户可能会感到不安。为了解决这个问题,...

    Asp.Net五种方法导出Excel表格

    在Asp.Net开发环境中,导出数据到Excel是常见的需求,...总结来说,Asp.Net导出Excel有多种途径,每种方法都有其适用场景和优缺点。选择哪种方法取决于项目需求、服务器配置、性能要求以及团队对不同技术的熟悉程度。

    C#下成功登录后datagridview数据导出excel

    在这个场景中,"C#下成功登录后datagridview数据导出excel"的标题描述了一个常见的需求:用户通过登录窗口验证身份后,能够将数据显示在datagridview控件中,并且支持将这些数据导出到Excel文件中。这一过程涵盖了多...

    JSP页面导出EXCEL简单方法

    在IT行业中,尤其是在Web开发领域,常常需要...此外,为了提高性能和用户体验,还可以考虑异步导出,即通过Ajax请求触发导出,避免刷新整个页面。总之,熟练掌握这些技巧,可以极大地提升Web应用的功能性和用户满意度。

    Android数据转化为Excel表格导入导出

    在Android开发中,有时我们需要将应用内部的数据导出为Excel表格,以便用户可以方便地查看、编辑或在其他系统中使用。"Android数据转化为Excel表格导入导出"这个主题涉及了如何在Android环境中处理数据并将其转换成...

    前端表格导出Excel

    在前端开发中,导出表格...以上就是关于“前端表格导出Excel”的主要知识点。实际应用中,开发者需要根据项目需求和性能考虑,选择合适的实现方式和技术栈。通过熟练掌握这些技术,可以有效地提高前端项目的用户体验。

    C#-WinForm(2种dataGridView导出Excel)批量导出,高效率,36列万行,15秒

    1. 并行处理:如果系统资源允许,可以考虑使用多线程或异步操作,同时处理多行数据。 2. 分批次写入:将数据分批写入Excel,而不是一次性全部写入,可以降低内存占用并提高性能。 3. 内存管理:避免不必要的内存分配...

Global site tag (gtag.js) - Google Analytics