lib/rubyXL/convenience_methods/worksheet.rb in rubyXL-3.4.16 vs lib/rubyXL/convenience_methods/worksheet.rb in rubyXL-3.4.17
- old
+ new
@@ -104,10 +104,24 @@
next if cell.nil?
cell.r = RubyXL::Reference.new(r, c)
}
}
+ # Update merged cells for all rows below
+ self.merged_cells ||= RubyXL::MergedCells.new
+ merged_cells.each { |mc|
+ next if mc.ref.row_range.last < row_index
+
+ in_merged_cell = mc.ref.row_range.first < row_index
+ mc.ref = RubyXL::Reference.new(
+ mc.ref.row_range.first + (in_merged_cell ? 0 : 1),
+ mc.ref.row_range.last + 1,
+ mc.ref.col_range.first,
+ mc.ref.col_range.last,
+ )
+ }
+
return new_row
end
def delete_row(row_index=0)
validate_workbook
@@ -119,10 +133,26 @@
row_index.upto(sheet_data.size - 1) { |index|
row = sheet_data[index]
row && row.cells.each{ |c| c.row -= 1 unless c.nil? }
}
+ # Update row number of merged cells
+ self.merged_cells ||= RubyXL::MergedCells.new
+ merged_cells.delete_if { |mc| mc.ref.row_range == (row_index..row_index) }
+ merged_cells.each { |mc|
+ next if mc.ref.row_range.last < row_index
+
+ in_merged_cell = mc.ref.row_range.first <= row_index
+ mc.ref = RubyXL::Reference.new(
+ mc.ref.row_range.first - (in_merged_cell ? 0 : 1),
+ mc.ref.row_range.last - 1,
+ mc.ref.col_range.first,
+ mc.ref.col_range.last,
+ )
+ }
+ merged_cells.delete_if { |mc| mc.ref.single_cell? }
+
return deleted
end
# Inserts column at +column_index+, pushes everything right, takes styles from column to left
# NOTE: use of this method will break formulas which reference cells which are being "pushed right"
@@ -150,10 +180,24 @@
row.insert_cell_shift_right(c, column_index)
}
cols.insert_column(column_index)
+ # Update merged cells for all rows below
+ self.merged_cells ||= RubyXL::MergedCells.new
+ merged_cells.each { |mc|
+ next if mc.ref.col_range.last < column_index
+
+ in_merged_cell = mc.ref.row_range.first < column_index
+ mc.ref = RubyXL::Reference.new(
+ mc.ref.row_range.first,
+ mc.ref.row_range.last,
+ mc.ref.col_range.first + (in_merged_cell ? 0 : 1),
+ mc.ref.col_range.last + 1,
+ )
+ }
+
# TODO: update column numbers
end
def delete_column(column_index = 0)
validate_workbook
@@ -169,9 +213,25 @@
c.column = ci if c.is_a?(Cell)
}
}
cols.each { |range| range.delete_column(column_index) }
+
+ # Update row number of merged cells
+ self.merged_cells ||= RubyXL::MergedCells.new
+ merged_cells.delete_if { |mc| mc.ref.col_range == (column_index..column_index) }
+ merged_cells.each { |mc|
+ next if mc.ref.col_range.last < column_index
+
+ in_merged_cell = mc.ref.col_range.first <= column_index
+ mc.ref = RubyXL::Reference.new(
+ mc.ref.row_range.first,
+ mc.ref.row_range.last,
+ mc.ref.col_range.first - (in_merged_cell ? 0 : 1),
+ mc.ref.col_range.last - 1,
+ )
+ }
+ merged_cells.delete_if { |mc| mc.ref.single_cell? }
end
def get_row_style(row_index)
row = sheet_data.rows[row_index]
(row && row.style_index) || 0