ruby-on-rails - 使用 Node 或 ruby 读取非常大的 Excel [XLSX] 的最佳方法

标签 ruby-on-rails ruby excel node.js

我需要解析大约 25 MB 大小的 XLXS [有大约 100 万条记录]。我通读了很多 Node 模块,包括下面的

https://github.com/trevordixon/excel.js

https://github.com/dkiyatkin/node-office

我也尝试过将 Ruby 与 Roo 结合使用

https://github.com/Empact/roo

但是他们挂了。有什么建议可以做到这一点吗?或者我最终需要将文件分成多个小块?

根据“carlosramireziii”的建议使用“oxcelix”!

"https://github.com/gbiczo/oxcelix "

2.0.0-p247 :001 > require 'oxcelix'
 => true 
2.0.0-p247 :002 > s = Oxcelix::Workbook.new("/var/www/fullcontact/current/public/uploads/fileupload/filename/Book1.xlsx")
Killed
root@createresume:/var/www/fullcontact/current/public/uploads# irb
2.0.0-p247 :001 > require 'oxcelix'
 => true 
2.0.0-p247 :002 > s = Oxcelix::Workbook.new("/var/www/fullcontact/current/public/uploads/fileupload/filename/Book1.xlsx")
Errno::EEXIST: File exists - /var/www/fullcontact/shared/uploads/tmp
    from /usr/local/rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/fileutils.rb:245:in `mkdir'
    from /usr/local/rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/fileutils.rb:245:in `fu_mkdir'
    from /usr/local/rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/fileutils.rb:174:in `block in mkdir'
    from /usr/local/rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/fileutils.rb:173:in `each'
    from /usr/local/rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/fileutils.rb:173:in `mkdir'
    from /usr/local/rvm/gems/ruby-2.0.0-p247/gems/oxcelix-0.3.2/lib/oxcelix/workbook.rb:52:in `initialize'
    from (irb):2:in `new'
    from (irb):2
    from /usr/local/rvm/rubies/ruby-2.0.0-p247/bin/irb:13:in `<main>'
2.0.0-p247 :003 > exit
root@createresume:/var/www/fullcontact/current/public/uploads# rm -rf tmp/
root@createresume:/var/www/fullcontact/current/public/uploads# irb
2.0.0-p247 :001 > require 'oxcelix'
 => true 
2.0.0-p247 :002 > s = Oxcelix::Workbook.new("/var/www/fullcontact/current/public/uploads/fileupload/filename/Book1.xlsx")
Killed
root@createresume:/var/www/fullcontact/current/public/uploads# 

最佳答案

根据您使用的解析库,您的解析例程可能会尝试将整个 XLXS 文件转换为对象,然后将其存储在内存中。对于非常大的文件,这可能会导致您看到的挂起行为。

经常用于避免此问题的一个选项是使用 SAX parser . SAX 解析器不会尝试一次解析整个文件,而是一次一位地顺序读取文档的每一部分,这不会导致前一种方法的内存爆炸。

要解析 XLSX 文档,您应该尝试使用 Oxcelix gem for Ruby,它在底层使用 SAX 解析器。

<罢工> https://github.com/gbiczo/oxcelix

更新:

不幸的是,Oxcelix gem 确实在幕后使用 SAX 解析,但它随后将解析结果作为数组返回,在文件非常大的情况下,它会在内存中爆炸。

如果您能够将 Excel 工作表转换为 XML,那么您就可以使用任何 SAX 样式的解析器。在这种情况下,我会推荐 SAXMachine 的这个分支。 ,它允许您创建声明性模型并使用 lazy 按顺序返回它们选项。

关于ruby-on-rails - 使用 Node 或 ruby 读取非常大的 Excel [XLSX] 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22042350/

相关文章:

ruby-on-rails - 启动 Rails 时定义 "current time"?

ruby-on-rails - ElasticBeanstalk 和 Rails - 部署应用程序但只得到 404 Not Found nginx/1.4.3

ruby-on-rails - 尝试加载 gem 'uglifier' 时出错。 - 维尔克

excel - 更改 Excel 公式中的排名值

c# - Excel 工作表错误

ruby-on-rails - Rails,将多个文件上传到相册

ruby-on-rails - 在 Rails 路由中将路径重定向到新域

ruby-on-rails - Rails 中的 Google 身份验证 - "uninitialized constant GoogleAuthExample (NameError)"

mysql - Rails 5 和 Ruby 2.3.3 加载 libmysql.dll 失败

excel - 如何使用 VBA 在 Excel 单元格中输入大字符串?