【问题标题】:xlsx issue: create excel sheet with large number of rowsxlsx 问题:创建包含大量行的 excel 工作表
【发布时间】:2012-04-05 15:45:04
【问题描述】:

我正在使用 Axlsx 创建一个 excel 文件。对于一个小数据集,它工作得很好。但是一旦数据集变大,它就会挂起。我在这个过程中运行了 strace,它做了很多 brk。

a = Axlsx::Package.new
book = a.workbook
book.add_worksheet(:name => "test") do |sheet|

  input_array.each do |input_data|
     ...# covert input_data to row_data
     sheet.add_row(row_data)
  end
end
File.open("testfile", 'w') { |f| f.write(p.to_stream().read) }

我的 input_array 大小约为 400,000,因此工作表有 400,000 行,相当大。它卡在p.to_stream().read。任何帮助都会很棒。谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 export-to-excel axlsx


    【解决方案1】:

    看来我需要开始关注 SO! 这是随机的(axlsx的作者)

    我想指出几件事,它们应该可以帮助您完成您需要完成的事情,好吧……完成了!

    1. 如果您正在写入文件,请考虑使用 Package#serialize - 不是因为它更快,而是因为它需要您维护的代码更少。

      p.serialize 'filename.xlsx'

    2. 在过去几周内,性能得到了重大改进。请升级到 1.1.1 gem 不再依赖 RMagic,不再需要 use_autowidth = false。

    https://github.com/randym/axlsx

    大师的基准:

    Benchmarks w/40k rows:
                                user     system      total        real
    axlsx_noautowidth      68.130000   1.690000  69.820000 ( 80.257108)
    axlsx                  61.520000   2.290000  63.810000 ( 78.187423)
    axlsx_shared           53.280000   1.170000  54.450000 ( 62.880780)
    axlsx_stream           52.110000   1.360000  53.470000 ( 61.980672)
    csv                    10.670000   0.930000  11.600000 ( 14.901387)
    
    Benchmarks w/4k rows:
                                user     system      total        real
    axlsx_noautowidth       4.880000   0.120000   5.000000 (  5.314383)
    axlsx                   5.470000   0.110000   5.580000 (  5.853739)
    axlsx_shared            5.720000   0.080000   5.800000 (  6.135263)
    axlsx_stream            4.840000   0.090000   4.930000 (  5.194801)
    csv                     1.090000   0.090000   1.180000 (  1.484763)
    

    这是基准测试文件:

    https://gist.github.com/2411144

    希望对你有帮助

    【讨论】:

    • 嗨 randym,我正在尝试在我的 Rails 应用程序中使用 axlsx。我在一个单独的 ruby​​ 程序中使用了这个 gem,效果很好。程序是: p = Axlsx::Package.new p.workbook.add_worksheet(:name => "sample_dataset") do |sheet|数据集.map {|row| sheet.add_row row} end p.use_shared_strings = true # p.serialize('/Users/Rakib/Desktop/New File_files/simple.xlsx') p.serialize('simple.xlsx') 但是当我尝试使用相同的我的 Rails 应用程序中的 ruby​​ 代码不断出错。 SO中的问题:stackoverflow.com/questions/23986981/…
    • 另外,我发现很少有关于在 Rails 中使用 axlsx 的博客文章,例如pramodbshinde.wordpress.com/2013/12/29/… 他们表明 pacakege.serialize 方法不带任何参数。但这目前在我的应用程序中对我不起作用。另外,经过一些调试后,我发现 p.serialize("#{Rails.root}/tmp/basic.xlsx") 这条线在我的应用程序中基本上失败了。你能告诉我为什么这个序列化在我的 Rails 应用程序中不起作用吗?如果您能指出问题,我将不胜感激。提前谢谢兰迪姆。
    • 但是另一个数量级呢? OP 适用于 400k 行,而不是 40k。我还在我的应用程序中发现了 @ 400k 行的限制。 axlsx 的限制是什么?
    【解决方案2】:

    您可以尝试禁用处理列自动宽度功能的 RMagick,因为它是一个非常繁重的过程 AFAIK。

    a = Axlsx::Package.new   
    a.use_autowidth = false
    

    【讨论】:

    • 我收到此错误:#<:package:0x00000040b64fc8> 的未定义方法 `use_autowidth=' (NoMethodError)。我正在使用 axlsx-1.0.18。我浏览了 Axlsx 源代码,似乎 use_autowidth 没有定义。
    • @user612308 是的,它被添加到a bit later 并在 1.1 中发布。
    • 感谢纳什。试过了,还是同样的问题。我认为问题不在于 use_autowidth,它与如何实现 to_stream() 有关。现在,我没有好的解决方案。我必须为我可以添加的行数设置一个限制。
    猜你喜欢
    • 1970-01-01
    • 2020-08-19
    • 2014-01-21
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    相关资源
    最近更新 更多