我以前一直使用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"
然而,这感觉错误 - 因为它滥用了生成工作表的方式。
如何生成这样的社区建议?
答案 0 :(得分:1)
如果您正在接收数据列,您是否尝试将每列作为一行放在中间数组中,转置它并将其行加载到Axlsx电子表格中?
intermediate = [column1, column2, column3]
sheet.add_row ['Header1', 'Header2', 'Header3']
intermediate.transpose.each do |row|
sheet.add_row row
end
我不知道"适当的"方式会是,但转置对这类问题非常有用。
这可能是内存密集型的大量数据btw。