Commit d732e8fe by liyijie

增加导出export的merge选项支持,如果相邻行相同,则合并该列各行单元格

parent 9e2bec53
......@@ -81,11 +81,34 @@ module TalltyImportExport
sheet.add_row headers.map{|header| header[:name]}, style: title2, height: 39
last_row = nil
merge_column_hash = {}
first_content_row_index = respond_to?(:first_header) ? 2 : 1
each_method = records.is_a?(Array) ? :each : :each
records.send(each_method).with_index do |record, index|
row = []
headers.each{ |header| row.push(handle_data(record, header, index)) }
headers.each_with_index do |header, col_index|
_data = handle_data(record, header, index)
if header[:merge].present? && last_row.present? && _data == last_row[index]
merge_index = merge_column_hash[col_index] || []
merge_index << index + first_content_row_index
merge_index << index + first_content_row_index + 1
end
row.push(_data)
end
sheet.add_row row, style: title3, height: @row_height, types: headers.map{|header| header[:format]&.to_sym}
last_row = row
end
# 需要根据column进行多行的内容合并
if merge_column_hash.present?
merge_column_hash.each do |col_index, row_arr|
split_arr(row_arr).each do |arr|
sheet.merge_cells(
Axlsx::cell_r(arr.first, col_index) + ':' + Axlsx::cell_r(arr.last, col_index)
)
end
end
end
sheet.column_widths(*headers.map{|header| header[:width] || @width})
end
......@@ -146,5 +169,28 @@ module TalltyImportExport
data
end
end
private
def split_arr continuous_arr
continuous_arr.sort.each_with_index.reduce([]) do |arr, (i, _index)|
if arr.last.nil?
arr << i
elsif i - arr.last > 2
arr << nil
arr << i
else
if arr[-2].blank?
arr << i
elsif arr[-1] - arr[-2] == i - arr[-1]
arr << i
else
arr << nil
arr << i
end
end
arr
end.split
end
end
end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment