Axlsx 基于行列号合并单元格,如电子表格 gem
Axlsx merge cells based on row-column number like in Spreadsheet gem
我一直在使用电子表格gem来编写xls文件。
使用电子表格 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
有没有一种方法可以像在电子表格 gem 中那样根据行号和列号合并 Axlsx 中的单元格?也可以合并单元格后写入数据吗?
可能最简单的方法是传入实际的单元格(未经测试):
merge_cells sheet.rows.last.cells[(1..2)]
merge_cells sheet.rows.last.cells[(3..4)]
但您也可以使用 Axlsx::col_ref
or Axlsx::cell_r
method 将 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.
我一直在使用电子表格gem来编写xls文件。 使用电子表格 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
有没有一种方法可以像在电子表格 gem 中那样根据行号和列号合并 Axlsx 中的单元格?也可以合并单元格后写入数据吗?
可能最简单的方法是传入实际的单元格(未经测试):
merge_cells sheet.rows.last.cells[(1..2)]
merge_cells sheet.rows.last.cells[(3..4)]
但您也可以使用 Axlsx::col_ref
or Axlsx::cell_r
method 将 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.