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