我一直在使用Spreadsheet gem来编写xls文件.使用Spreadsheet gem,可以根据行和列号动态完成单元格的合并
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上迭代地动态完成
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".并且在合并之前必须使用空字符串值写入数据,如下例所示
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中完成它一样?合并单元格后也可以写入数据吗?
可能最简单的方法是传入实际的单元格(未经测试):
merge_cells sheet.rows.last.cells[(1..2)] merge_cells sheet.rows.last.cells[(3..4)]
但您也可以使用Axlsx::col_ref
or Axlsx::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)
编辑
关于你必须初始化字符串的问题,我能够合并未初始化的单元格,并在指定单元格之前指定合并.我正在使用Axlsx 2.0.1.