xlsx问题:创建包含大量行的Excel工作表

时间:2012-04-05 15:45:04

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

我正在使用Axlsx创建一个excel文件。对于小型数据集,它工作正常。但是一旦数据集变大,它就会挂起。我对这个过程进行了分析,它做了很多事。

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。任何帮助都会很棒。谢谢。

2 个答案:

答案 0 :(得分:5)

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

有几件事我想指出,应该帮助你得到你需要做的事,好吧......完成!

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

    p.serialize'filename.xlsx'

  2. 过去几周取得了重大的业绩改善。请升级到1.1.1 gem不再依赖于RMagic,并且不再需要use_autowidth = false。

  3. 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

    希望这有帮助

答案 1 :(得分:2)

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

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