百万数据导出到 Excel的两种方案

百万数据导出到 Excel的两种方案

需求背景

随着系统数据日增量的增加,导出接口的性能也面临着巨大挑战。为了解决导出性能问题,我们想出了两种优化方案。

方案一:同步导出

  1. 确定导出数据量:首先确定需要导出的数据量。

  2. 定义写入规则:定义每次写入 sheet 页的数据量。

  3. 计算写入次数:计算总共需要同步写入多少次。通过总数据量除以每次写入的数量得到总写入次数。

  4. 循环写入数据

    1. 每次查询写入之后,获取上一次数据中的最大 ID。
    2. 下一次写入时,使用 SQL 的 ID 大于上一次的 ID 值并限制写入 sheet 页的数量。这样操作是为了避免数据量太大导致 SQL 查询偏移量过大而影响性能。

方案二:多线程异步查询导出

  1. 确定导出数据量:同样需要确定需要导出的数据量。

  2. 定义写入规则:定义每次写入 sheet 页的数据量。

  3. 计算写入次数:计算总共需要异步写入多少次。

  4. 异步查询数据

    1. 循环写入数据,每个循环开启一个异步线程去查询数据。
    2. 计算每个异步线程的查询偏移量,确保每个线程查询的数据不重复。
  5. 同步写入 Excel:最后需要多线程加锁同步写入 Excel。这是因为 Excel 不支持并发写入,否则会抛出异常。

结语

以上是两种提高百万数据导出Excel 优化的方案,大家可以根据实际情况选择适合的方案来优化系统性能。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
具体内容请参考我的BLOG:http://blog.csdn.net/smallwhiteyt/archive/2009/11/08/4784771.aspx 如果你耐心仔细看完本文,相信以后再遇到导出EXCLE操作的时候你会很顺手觉得SO EASY,主要给新手朋友们看的,老鸟可以直接飘过了,花了一晚上的时间写的很辛苦,如果觉得对你有帮助烦请留言支持一下,我会写更多基础的原创内容来回报大家。 C#导出数据EXCEL表格是个老生常谈的问题了,写这篇文章主要是给和我一样的新手朋友提供两种导出EXCEL的方法并探讨一下导出的效率问题,本文中的代码直接就可用,其中部分代码参考其他的代码并做了修改,抛砖引玉,希望大家一起探讨,如有不对的地方还请大家多多包涵并指出来,我也是个新手,出错也是难免的。 首先先总结下自己知道的导出EXCEL表格的方法,大致有以下几种,有疏漏的请大家补充。 1.数据逐条逐条的写入EXCEL 2.通过OLEDB把EXCEL做为数据源来写 3.通过RANGE范围写入多行多列内存数据EXCEL 4.利用系统剪贴板写入EXCEL 好了,我想这些方法已经足够完成我们要实现的功能了,方法不在多,在精,不是么?以上4中方法都可以实现导出EXCEL,方法1为最基础的方法,意思就是效率可能不是太高,当遇到数据量过大时所要付出的时间也是巨大的,后面3种方法都是第一种的衍生,在第一种方法效率低下的基础上改进的,这里主要就是一个效率问题了,当然如果你数据量都很小,我想4种方法就代码量和复杂程度来说第1种基本方法就可以了,或当你的硬件非常牛逼了,那再差的方法也可以高效的完成也没有探讨的实际意义了,呵呵说远了,本文主要是在不考虑硬件或同等硬件条件下单从软件角度出发探讨较好的解决方案
### 回答1: 可以使用以下步骤实现Ajax导出Excel文件: 1.前端发送Ajax请求,后端返回Excel文件流。 ```javascript $.ajax({ url: '/export/excel', type: 'POST', dataType: 'json', data: { // 请求参数 }, success: function (result) { // 返回的数据Excel文件流,可以进行下载 var blob = new Blob([result], { type: 'application/vnd.ms-excel' }); var fileName = 'export.xlsx'; if (window.navigator.msSaveOrOpenBlob) { navigator.msSaveBlob(blob, fileName); } else { var downloadLink = window.URL.createObjectURL(blob); var a = document.createElement('a'); a.style.display = 'none'; a.href = downloadLink; a.download = fileName; document.body.appendChild(a); a.click(); window.URL.revokeObjectURL(downloadLink); document.body.removeChild(a); } }, error: function (xhr, status, error) { // 错误处理 } }); ``` 2.后端生成Excel文件流并返回给前端。 ```java @RequestMapping(value = "/export/excel", method = RequestMethod.POST) public void exportExcel(HttpServletRequest request, HttpServletResponse response) { try { // 构造Excel文件 Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue("Hello, World!"); // 输出Excel文件流 response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition", "attachment; filename=export.xlsx"); ServletOutputStream outputStream = response.getOutputStream(); workbook.write(outputStream); outputStream.flush(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } ``` 以上代码仅供参考,具体实现需要根据实际情况进行调整。 ### 回答2: 在使用AJAX导出Excel文件时,可以通过以下步骤实现: 1. 创建一个包含导出功能的按钮或链接,并在其上绑定一个点击事件。 2. 在点击事件中,使用AJAX向服务器发送一个GET或POST请求,请求导出Excel文件的URL。 3. 服务器接收到该请求后,根据请求参数生成Excel文件,并将其保存到服务器本地或者内存中。 4. 服务器将生成的Excel文件的路径或内容返回给前端。 5. 前端接收到来自服务器的响应后,可以通过以下两种方式进行处理: - 使用window.open()函数将返回的Excel文件路径作为参数,在新窗口中打开Excel文件进行下载。例如: window.open(response.path),其中response.path是从服务器返回的Excel文件路径。 - 使用FileSaver.js等文件保存库将返回的Excel文件内容保存为本地文件。例如: 使用FileSaver.js可以通过以下代码将返回的Excel文件内容保存为本地文件:saveAs(new Blob([response.content]), "excel.xls"),其中response.content是从服务器返回的Excel文件内容。 需要注意的是,在服务器端生成Excel文件时,可以使用像OpenPyXL或PHPExcel这样的Excel文件处理库来生成和处理Excel文件。此外,服务器需要将生成的Excel文件转换为可下载的格式,如.xls或.xlsx,或者返回Excel文件的二进制内容。 总之,通过AJAX实现导出Excel文件,可以通过向服务器发送请求,生成Excel文件,并将其返回给前端,然后前端根据需要进行下载或保存。 ### 回答3: Ajax导出excel文件可以通过以下步骤实现: 1. 在前端页面中,首先要引入jquery等相关库文件,以便使用Ajax进行异步操作。 2. 在页面中添加一个导出按钮,并为按钮添加点击事件。 3. 在点击事件中,使用Ajax发送一个请求到后端服务器。请求的URL应该指向用于生成excel文件的接口。 4. 后端接口接收到请求后,根据请求参数生成excel文件,并将其保存到服务器指定的路径。 5. 后端excel文件的路径返回给前端。 6. 前端接收到excel文件的路径后,可以通过创建一个`<a>`标签,设置其`href`属性为excel文件的路径,同时设置`download`属性为文件名。 7. 通过使用`document.body.appendChild(a)`和`a.click()`操作,模拟用户点击下载链接的过程。 8. 这样,用户就可以通过点击导出按钮来下载生成的excel文件。 需要注意的是,由于浏览器的安全策略限制,不能直接通过Ajax将文件内容返回给前端,而是需要先将文件保存到服务器端,再将文件路径返回给前端进行下载。另外,生成excel文件的后端代码可以使用一些库或工具,如PHPExcel、Node.js等,具体使用哪种方案可以根据实际需求来选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值