Kaydet (Commit) 8ef47e60 authored tarafından Markus Mohrhard's avatar Markus Mohrhard

support multiple columns in column data transformations

Change-Id: Ic911fb7d5f99f692c960ef5267e37b263e798672
Reviewed-on: https://gerrit.libreoffice.org/49457Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarMarkus Mohrhard <markus.mohrhard@googlemail.com>
üst c7b4546e
...@@ -53,7 +53,7 @@ void ScDataTransformationTest::testColumnRemove() ...@@ -53,7 +53,7 @@ void ScDataTransformationTest::testColumnRemove()
} }
} }
sc::ColumnRemoveTransformation aTransformation(5); sc::ColumnRemoveTransformation aTransformation({5});
aTransformation.Transform(*m_pDoc); aTransformation.Transform(*m_pDoc);
for (SCROW nRow = 0; nRow < 10; ++nRow) for (SCROW nRow = 0; nRow < 10; ++nRow)
...@@ -109,7 +109,7 @@ void ScDataTransformationTest::testColumnMerge() ...@@ -109,7 +109,7 @@ void ScDataTransformationTest::testColumnMerge()
m_pDoc->SetString(4, 2, 0, "France"); m_pDoc->SetString(4, 2, 0, "France");
m_pDoc->SetString(4, 3, 0, "China"); m_pDoc->SetString(4, 3, 0, "China");
sc::MergeColumnTransformation aTransform(2, 4, ", "); sc::MergeColumnTransformation aTransform({2, 4}, ", ");
aTransform.Transform(*m_pDoc); aTransform.Transform(*m_pDoc);
CPPUNIT_ASSERT_EQUAL(OUString("Berlin, Germany"), m_pDoc->GetString(2, 0, 0)); CPPUNIT_ASSERT_EQUAL(OUString("Berlin, Germany"), m_pDoc->GetString(2, 0, 0));
......
...@@ -26,8 +26,8 @@ SCROW DataTransformation::getLastRow(const ScDocument& rDoc, SCCOL nCol) ...@@ -26,8 +26,8 @@ SCROW DataTransformation::getLastRow(const ScDocument& rDoc, SCCOL nCol)
return nEndRow; return nEndRow;
} }
ColumnRemoveTransformation::ColumnRemoveTransformation(SCCOL nCol): ColumnRemoveTransformation::ColumnRemoveTransformation(const std::set<SCCOL>& rColumns):
mnCol(nCol) maColumns(rColumns)
{ {
} }
...@@ -37,7 +37,10 @@ ColumnRemoveTransformation::~ColumnRemoveTransformation() ...@@ -37,7 +37,10 @@ ColumnRemoveTransformation::~ColumnRemoveTransformation()
void ColumnRemoveTransformation::Transform(ScDocument& rDoc) const void ColumnRemoveTransformation::Transform(ScDocument& rDoc) const
{ {
rDoc.DeleteCol(0, 0, MAXROW, 0, mnCol, 1); for (auto& rCol : maColumns)
{
rDoc.DeleteCol(0, 0, MAXROW, 0, rCol, 1);
}
} }
SplitColumnTransformation::SplitColumnTransformation(SCCOL nCol, sal_Unicode cSeparator): SplitColumnTransformation::SplitColumnTransformation(SCCOL nCol, sal_Unicode cSeparator):
...@@ -68,27 +71,46 @@ void SplitColumnTransformation::Transform(ScDocument& rDoc) const ...@@ -68,27 +71,46 @@ void SplitColumnTransformation::Transform(ScDocument& rDoc) const
} }
} }
MergeColumnTransformation::MergeColumnTransformation(SCCOL nCol1, SCCOL nCol2, const OUString& rMergeString): MergeColumnTransformation::MergeColumnTransformation(const std::set<SCCOL>& rColumns, const OUString& rMergeString):
mnCol1(nCol1), maColumns(rColumns),
mnCol2(nCol2),
maMergeString(rMergeString) maMergeString(rMergeString)
{ {
} }
void MergeColumnTransformation::Transform(ScDocument& rDoc) const void MergeColumnTransformation::Transform(ScDocument& rDoc) const
{ {
SCROW nEndRow1 = getLastRow(rDoc, mnCol1); if (maColumns.empty())
SCROW nEndRow2 = getLastRow(rDoc, mnCol2); return;
SCROW nEndRow = std::max(nEndRow1, nEndRow2);
for (SCROW nRow = 0; nRow <= nEndRow; ++nRow) SCROW nMaxRow = 0;
for (auto& itr : maColumns)
{ {
OUString aStr1 = rDoc.GetString(mnCol1, nRow, 0); nMaxRow = getLastRow(rDoc, itr);
OUString aStr2 = rDoc.GetString(mnCol2, nRow, 0);
rDoc.SetString(mnCol1, nRow, 0, aStr1 + maMergeString + aStr2);
} }
rDoc.DeleteCol(0, 0, MAXROW, 0, mnCol2, 1); SCCOL nTargetCol = *maColumns.begin();
for (SCROW nRow = 0; nRow <= nMaxRow; ++nRow)
{
OUStringBuffer aStr = rDoc.GetString(nTargetCol, nRow, 0);
for (auto& itr : maColumns)
{
if (itr != nTargetCol)
{
aStr.append(maMergeString).append(rDoc.GetString(itr, nRow, 0));
}
}
rDoc.SetString(nTargetCol, nRow, 0, aStr.makeStringAndClear());
}
for (auto& itr : maColumns)
{
if (itr == nTargetCol)
continue;
rDoc.DeleteCol(0, 0, MAXROW, 0, itr, 1);
}
} }
SortTransformation::SortTransformation(const ScSortParam& rSortParam): SortTransformation::SortTransformation(const ScSortParam& rSortParam):
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
#include <sortparam.hxx> #include <sortparam.hxx>
#include <set>
class ScDocument; class ScDocument;
namespace sc { namespace sc {
...@@ -34,11 +36,11 @@ public: ...@@ -34,11 +36,11 @@ public:
class SC_DLLPUBLIC ColumnRemoveTransformation : public DataTransformation class SC_DLLPUBLIC ColumnRemoveTransformation : public DataTransformation
{ {
SCCOL mnCol; std::set<SCCOL> maColumns;
public: public:
ColumnRemoveTransformation(SCCOL nCol); ColumnRemoveTransformation(const std::set<SCCOL>& rColumns);
virtual ~ColumnRemoveTransformation() override; virtual ~ColumnRemoveTransformation() override;
virtual void Transform(ScDocument& rDoc) const override; virtual void Transform(ScDocument& rDoc) const override;
...@@ -57,13 +59,12 @@ public: ...@@ -57,13 +59,12 @@ public:
class SC_DLLPUBLIC MergeColumnTransformation : public DataTransformation class SC_DLLPUBLIC MergeColumnTransformation : public DataTransformation
{ {
SCCOL mnCol1; std::set<SCCOL> maColumns;
SCCOL mnCol2;
OUString maMergeString; OUString maMergeString;
public: public:
MergeColumnTransformation(SCCOL nCol1, SCCOL nCol2, const OUString& rMergeString); MergeColumnTransformation(const std::set<SCCOL>& rColumns, const OUString& rMergeString);
virtual void Transform(ScDocument& rDoc) const override; virtual void Transform(ScDocument& rDoc) const override;
}; };
......
...@@ -327,7 +327,8 @@ ScMergeColumnTransformationControl::ScMergeColumnTransformationControl(vcl::Wind ...@@ -327,7 +327,8 @@ ScMergeColumnTransformationControl::ScMergeColumnTransformationControl(vcl::Wind
std::shared_ptr<sc::DataTransformation> ScMergeColumnTransformationControl::getTransformation() std::shared_ptr<sc::DataTransformation> ScMergeColumnTransformationControl::getTransformation()
{ {
return std::make_shared<sc::MergeColumnTransformation>(0, 1, ","); std::set<SCCOL> maColumns = {0, 1};
return std::make_shared<sc::MergeColumnTransformation>(maColumns, ",");
} }
} }
......
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