生成axlsx电子表格,这些电子表格很难通过简单使用`add_row`轻松形成

时间:2016-05-20 09:42:17

标签: ruby rubygems axlsx

背景

我以前一直使用gem spreadsheet生成.xls电子表格作为ruby项目的一部分。

但是,这会导致各种格式和兼容性问题 - 最新版本是旧版本的Excel only support up to 256 columns per sheet(列IV)。因此,不是乱用VB或将数据重新格式化为多个表格,而是重构代码以使用.xlsx生成器更有意义。

输入axlsx

问题:

我生成的电子表格如下所示:

Header1 | Header2 | Header3 |
-----------------------------
aaa     | bbb     | ccc
-----------------------------
        | ddd     | eee
-----------------------------
        | fff     |

(实际上有300列和500行,但你明白了。)

使用spreadsheet gem生成此方法的旧方法遵循以下方法:

def initialize
  @book = Spreadsheet::Workbook.new
  @sheet = book.create_worksheet
  @columns = 0
end

def write_column(header, rows)
  @sheet[0, @columns] = header
  rows.each_with_index do |data, i|
    @sheet[i+1, @columns] = data
  end
  @columns += 1
end

,此方法对axlsx无效。正如the documentation所述:

  

注意:生成单元格的推荐方法是通过工作表#add_row

问题:

什么是"权利"生成如上所述的电子表格的方法,显然"看起来像"它们应该由add_column方法生成,而不是add_row

记录在案的方法是做类似的事情:

sheet.add_row ['Header1', 'Header2', 'Header3']
sheet.add_row ['aaa', 'bbb', 'ccc']
sheet.add_row [nil, 'ddd', 'eee']
sheet.add_row [nil, 'fff', nil]

...但是,这并不好,因为我现在无法直接遍历每一列数据。

另一种方法可能是初始化一大块细胞,例如:

sheet.add_row ['Header1', 'Header2', 'Header3']
3.times { sheet.add_row [nil, nil, nil] }

然后在单独的步骤中添加我的数据,例如:

sheet["A2"] = "aaa"

然而,这感觉错误 - 因为它滥用了生成工作表的方式。

如何生成这样的社区建议?

1 个答案:

答案 0 :(得分:1)

如果您正在接收数据列,您是否尝试将每列作为一行放在中间数组中,转置它并将其行加载到Axlsx电子表格中?

intermediate = [column1, column2, column3]
sheet.add_row ['Header1', 'Header2', 'Header3']
intermediate.transpose.each do |row|
  sheet.add_row row
end

我不知道"适当的"方式会是,但转置对这类问题非常有用。

这可能是内存密集型的大量数据btw。