Axlsx根据行列号合并单元格,如Spreadsheet gem

我一直在使用电子表格gem写xls文件。 使用Spreadsheet gem,合并单元格可以像这样根据行号和列号dynamic地完成

merge_cells(start_row, start_col, end_row, end_col) 

我的代码片段

  excel_file = Spreadsheet::Workbook.new sheet1 = excel_file.create_worksheet :name => 'Example' . .#code blocks . . start_col = 4 end_col = 0 wk_array_size.each_with_index do |v,i| end_col = start_col+((v.to_i*2)-1) sheet1.merge_cells(0, start_col, 0, end_col) start_col = (end_col+3) end . .#code blocks . sheet1.insert_row(0,week_names) 

其中week_array_size是一个数组,其中包含一个散列的大小,这个散列的大小是在这个散列的基础上合并的。

  [11, 10, 3] 

合并将在数组week_array_size上迭代dynamic完成

  start_col = 4 end_col = (4+(11*2)-1) = 25 (0, 4, 0, 25) sheet1.merge_cells(0, 4, 0, 25) . . (0, 28, 0, 47) sheet1.merge_cells(0, 28, 0, 47) . . (0, 50, 0, 55) sheet1.merge_cells(0, 50, 0, 55) 

一旦单元格被合并,数据被写入合并的单元格

  sheet1.insert_row(0,week_names) sheet1.row(0).height = 30 

但是,对于xlsx文件,同样的方法似乎无法应用于AXLSX gem ,因为它使用像这样的“A1:A2”这样的字母 – 数字行列名称。 在合并之前,数据必须用空string值写入,就像下面的例子

  p = Axlsx::Package.new p.workbook.add_worksheet(:name => 'Example') do |sheet| sheet.add_row ["Class Name", "", "", "Time"] merge_cells "A1:A2" merge_cells "A3:A4" end 

有没有一种方法来合并基于行和列号的Axlsx中的单元格,比如在Spreadsheet gem中它是如何完成的? 也可以在合并单元格后写入数据?

最简单的方法可能是传入实际单元格(未经testing):

 merge_cells sheet.rows.last.cells[(1..2)] merge_cells sheet.rows.last.cells[(3..4)] 

但是,您也可以使用Axlsx::col_refAxlsx::cell_r方法将row, column转换为电子表格表示法:

 merge_cells Axlsx::cell_r(0,0) + ':' + Axlsx::cell_r(1,0) merge_cells Axlsx::cell_r(2,0) + ':' + Axlsx::cell_r(3,0) 

编辑

关于你不得不初始化string的问题,我可以合并未初始化的单元格,并在指定单元格之前指定合并。 我正在使用Axlsx 2.0.1。