2012-04-05 44 views
4

我正在使用Axlsx创建excel文件。对于小数据集,它工作正常。但一旦数据集变大,它就会挂起。我在这个过程中运行了一段时间,它做了很多事情。xlsx问题:创建具有大量行的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

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

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

我得到这个错误:未定义的方法'use_autowidth ='为#(NoMethodError)。我正在使用axlsx-1.0.18。我经历了Axlsx源代码,它似乎没有定义use_autowidth。 – user612308 2012-04-09 14:04:26

+0

@ user612308是的,它被添加了[稍后](https://github.com/randym/axlsx/commit/26a8ad445d84b9dcb9fc36702ec761603a74ee20),并在1.1中发布。 – 2012-04-09 15:21:39

+0

感谢纳什。尝试过,仍然是同样的问题。我认为问题不在于use_autowidth,它与如何实现to_stream()有关。现在,我没有很好的解决方案。我必须为我可以添加的行数设置一个限制。 – user612308 2012-04-10 08:28:43

5

看起来我需要开始关注SO! 这是randym(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

希望这有助于

+0

嗨randym,我想在我的Rails应用程序中使用axlsx。我在一个单独的ruby程序中使用了这个gem,这个程序非常棒。该程序是: p = Axlsx :: Package.new p.workbook.add_worksheet(:name =>“sample_dataset”)do | sheet | dataset.map {| row | sheet.add_row行} 结束 p.use_shared_strings =真 #p.serialize( '/用户/ Rakib /桌面/新File_files/simple.xlsx') p.serialize( 'simple.xlsx') 但是当我尝试在我的Rails应用程序中使用相同的ruby代码,我一直在收到错误。问题在SO:http:// stackoverflow。com/questions/23986981/uninitialized-constant-zipdostime-error-when-using-axlsx-gem-in-rails-app – 2014-06-02 05:20:35

+1

另外,我发现很少有关在Rails中使用axlsx的博客文章,例如http://pramodbshinde.wordpress.com/2013/12/29/design-spreadsheets-using-axlsx-in-rails/ 他们表明,pacakege.serialize方法不采用任何参数。但是目前这在我的应用程序中并不适用于我。此外,经过一些调试后,我发现,p.serialize(“#{Rails.root} /tmp/basic.xlsx”)这行基本上在我的应用程序中失败。你能告诉我为什么这个序列化不适用于我的Rails应用程序吗?如果您能指出问题,我将不胜感激。在此先感谢randym。 – 2014-06-02 05:24:55

+0

但另一个数量级呢? OP是40万行,而不是40K。我也在我的应用程序中发现了400k行的限制。 axlsx有什么限制? – 2015-11-02 15:05:28

相关问题