sc/source/ui/view/tabvwsh4.cxx |   23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

New commits:
commit 0c22a0dd8d2c747a476137ecf2f7cc83e68eb680
Author:     Noel Grandin <[email protected]>
AuthorDate: Thu Jan 29 21:57:59 2026 +0200
Commit:     Noel Grandin <[email protected]>
CommitDate: Fri Jan 30 06:55:35 2026 +0100

    tdf#166121 speed up de-duplication by merge deletes
    
    apply the same logic as commit 1b5b22902e22a24f2782057ec2598b0370aeccad
    but to columns this time.
    
    Change-Id: I3bcd5f11640aa8349b8f4d983d113810f63c6a53
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198379
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <[email protected]>

diff --git a/sc/source/ui/view/tabvwsh4.cxx b/sc/source/ui/view/tabvwsh4.cxx
index d503fba5949a..626459e1a03f 100644
--- a/sc/source/ui/view/tabvwsh4.cxx
+++ b/sc/source/ui/view/tabvwsh4.cxx
@@ -2112,8 +2112,10 @@ void ScTabViewShell::HandleDuplicateRecordsRemove(const 
rtl::Reference<ScTableSh
     {
         std::vector<uno::Sequence<uno::Any>> aUnionArray;
         sal_uInt32 nDeleteCount = 0;
-        sal_uInt32 nColumn = bIncludesHeaders ? 1 : 0;
-        sal_uInt32 lColumns = aDataArray[0].getLength();
+        SCCOL nColumn = bIncludesHeaders ? 1 : 0;
+        SCCOL lColumns = aDataArray[0].getLength();
+        SCCOL nPrevColDeleted = -1;
+        std::vector<table::CellRangeAddress> aDelRanges;
 
         while (nColumn < lColumns)
         {
@@ -2124,10 +2126,16 @@ void ScTabViewShell::HandleDuplicateRecordsRemove(const 
rtl::Reference<ScTableSh
 
             if (lcl_CheckInArrayCols(aUnionArray, aSeq, rSelectedEntries))
             {
-                table::CellRangeAddress aCellRange(aRange.Sheet,
-                            aRange.StartColumn + nColumn - nDeleteCount, 
aRange.StartRow,
-                            aRange.StartColumn + nColumn - nDeleteCount, 
aRange.EndRow);
-                ActiveSheet->removeRange(aCellRange, 
sheet::CellDeleteMode_LEFT);
+                if (nPrevColDeleted + 1 == nColumn)
+                    aDelRanges.back().EndColumn++;
+                else
+                {
+                    table::CellRangeAddress aCellRange(aRange.Sheet,
+                                aRange.StartColumn + nColumn - nDeleteCount, 
aRange.StartRow,
+                                aRange.StartColumn + nColumn - nDeleteCount, 
aRange.EndRow);
+                    aDelRanges.push_back(aCellRange);
+                }
+                nPrevColDeleted = nColumn;
                 ++nDeleteCount;
             }
             else
@@ -2136,7 +2144,8 @@ void ScTabViewShell::HandleDuplicateRecordsRemove(const 
rtl::Reference<ScTableSh
             }
             ++nColumn;
         }
-
+        for (const table::CellRangeAddress & rRange : aDelRanges)
+            ActiveSheet->removeRange(rRange, sheet::CellDeleteMode_LEFT);
     }
 }
 

Reply via email to