From 46aba1db9a8e43da03f4db580b8dc9de7b850b00 Mon Sep 17 00:00:00 2001 From: Markus Mohrhard Date: Mon, 14 Aug 2017 23:45:17 +0200 Subject: external data: add merge column transformation Change-Id: I112650bbb0ed279b386389e7df6b372bde080b62 Reviewed-on: https://gerrit.libreoffice.org/41157 Tested-by: Jenkins Reviewed-by: Markus Mohrhard --- sc/qa/unit/datatransformation_test.cxx | 28 ++++++++++++++++++++++++ sc/source/ui/dataprovider/datatransformation.cxx | 23 +++++++++++++++++++ sc/source/ui/inc/datatransformation.hxx | 12 ++++++++++ 3 files changed, 63 insertions(+) diff --git a/sc/qa/unit/datatransformation_test.cxx b/sc/qa/unit/datatransformation_test.cxx index bcd8c9a88a7a..785b7024a74b 100644 --- a/sc/qa/unit/datatransformation_test.cxx +++ b/sc/qa/unit/datatransformation_test.cxx @@ -30,10 +30,12 @@ public: void testColumnRemove(); void testColumnSplit(); + void testColumnMerge(); CPPUNIT_TEST_SUITE(ScDataTransformationTest); CPPUNIT_TEST(testColumnRemove); CPPUNIT_TEST(testColumnSplit); + CPPUNIT_TEST(testColumnMerge); CPPUNIT_TEST_SUITE_END(); private: @@ -95,6 +97,32 @@ void ScDataTransformationTest::testColumnSplit() CPPUNIT_ASSERT_EQUAL(OUString("Test2,Test3"), m_pDoc->GetString(3, 3, 0)); } +void ScDataTransformationTest::testColumnMerge() +{ + m_pDoc->SetString(2, 0, 0, "Berlin"); + m_pDoc->SetString(2, 1, 0, "Brussels"); + m_pDoc->SetString(2, 2, 0, "Paris"); + m_pDoc->SetString(2, 3, 0, "Peking"); + + m_pDoc->SetString(4, 0, 0, "Germany"); + m_pDoc->SetString(4, 1, 0, "Belgium"); + m_pDoc->SetString(4, 2, 0, "France"); + m_pDoc->SetString(4, 3, 0, "China"); + + sc::MergeColumnTransformation aTransform(2, 4, ", "); + aTransform.Transform(*m_pDoc); + + CPPUNIT_ASSERT_EQUAL(OUString("Berlin, Germany"), m_pDoc->GetString(2, 0, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("Brussels, Belgium"), m_pDoc->GetString(2, 1, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("Paris, France"), m_pDoc->GetString(2, 2, 0)); + CPPUNIT_ASSERT_EQUAL(OUString("Peking, China"), m_pDoc->GetString(2, 3, 0)); + + for (SCROW nRow = 0; nRow <= 3; ++nRow) + { + CPPUNIT_ASSERT(m_pDoc->GetString(4, nRow, 0).isEmpty()); + } +} + ScDataTransformationTest::ScDataTransformationTest() : ScBootstrapFixture( "/sc/qa/unit/data/dataprovider" ), m_pDoc(nullptr) diff --git a/sc/source/ui/dataprovider/datatransformation.cxx b/sc/source/ui/dataprovider/datatransformation.cxx index e5e65dc43344..2c2fe72bbcf4 100644 --- a/sc/source/ui/dataprovider/datatransformation.cxx +++ b/sc/source/ui/dataprovider/datatransformation.cxx @@ -68,6 +68,29 @@ void SplitColumnTransformation::Transform(ScDocument& rDoc) } } +MergeColumnTransformation::MergeColumnTransformation(SCCOL nCol1, SCCOL nCol2, const OUString& rMergeString): + mnCol1(nCol1), + mnCol2(nCol2), + maMergeString(rMergeString) +{ +} + +void MergeColumnTransformation::Transform(ScDocument& rDoc) +{ + SCROW nEndRow1 = getLastRow(rDoc, mnCol1); + SCROW nEndRow2 = getLastRow(rDoc, mnCol2); + SCROW nEndRow = std::max(nEndRow1, nEndRow2); + + for (SCROW nRow = 0; nRow <= nEndRow; ++nRow) + { + OUString aStr1 = rDoc.GetString(mnCol1, nRow, 0); + OUString aStr2 = rDoc.GetString(mnCol2, nRow, 0); + rDoc.SetString(mnCol1, nRow, 0, aStr1 + maMergeString + aStr2); + } + + rDoc.DeleteCol(0, 0, MAXROW, 0, mnCol2, 1); +} + } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/inc/datatransformation.hxx b/sc/source/ui/inc/datatransformation.hxx index 4cb55e72298d..09c677b56aa4 100644 --- a/sc/source/ui/inc/datatransformation.hxx +++ b/sc/source/ui/inc/datatransformation.hxx @@ -53,6 +53,18 @@ public: virtual void Transform(ScDocument& rDoc) override; }; +class SC_DLLPUBLIC MergeColumnTransformation : public DataTransformation +{ + SCCOL mnCol1; + SCCOL mnCol2; + OUString maMergeString; + +public: + + MergeColumnTransformation(SCCOL nCol1, SCCOL nCol2, const OUString& rMergeString); + virtual void Transform(ScDocument& rDoc) override; +}; + } #endif -- cgit