Rails 为什么我导出的 excel 只有 20 条记录,怎么导出全部或者查询的所有数据?

zhangyanan · 2014年03月07日 · 最后由 karmue 回复于 2014年03月19日 · 4768 次阅读

index 页面,显示所有明细记录,分页显示 20/perpage, 导出 excel 功能,只导出了一页的数据,这可怎么办?? 如何导出所有数据或者查询之后的数据,前提数据量巨大 (100w),并且会逐渐增长

如果想全部导出这 100w 数据有点不可能啊,内存溢出,有没有好的办法可以解决,总之是为了导出 excel

单独写一个导出 excel 文件数据的处理(比如单独的 SQL 语句)

至于性能问题,xls 文件单 sheet 只能支持 65535 行条数据,你确定要导出数据只能用在 xlsx 格式的么

我们是这样搞的,使用 axlsx 生成 xlsx,支持超过 65535 条数据。 使用 sidekiq 来在后台导出生成文件。 然后数据查询里边分页导出,每次导出 5000 条,自动下一页,一直循环直到完成。

...导出多半是 csv 嘛。。。导出的时候就别分页呗。。。

#2 楼 @raofeng 朋友,能简单的给个 demo 吗??我还在迷惑这一块

#2 楼 @raofeng 你是怎么分页导出的?需要其他插件吗?怎么规定 5000 条是一页?

Resource.all.find_each do ||
   ...
end

#6 楼 @michael_roshen 无法分配内存怎么解决?

#7 楼 @zhangyanan 写错,直接用 Resource.find_each 默认一次加载 1000 条,还有一个方法叫 find_in_batches, 可以指定加载 N 条,比如 5000 条,把这 5000 条保存到 excel, 这样下来就会到处多个 excel 了,可以看一下 api

是不是查询语句里你加了分页的限制啊,去掉就行了。。。

#5 楼 @zhangyanan 我是先计算多少页,就是先 count,再除以 5000(比如)(取模不为 0 则要多加 1 页),算出比如有 30 页,然后循环 30 次,像这样 limit(5000).offset(page*5000 - 5000),page 就是第几页,这样每次就只取 5000 条,不断地把这 5000 条写入 xlsx。这只是我的思路。

我以前都是这样做

step = Resource.all.count/10
10.times do |x|
   resources = Resource.offset(step*x).limt(step*(x+1))
   %导出csv
end
需要 登录 后方可回复, 如果你还没有账号请 注册新账号