Kaydet (Commit) 38ec31b6 authored tarafından Vikas Mahato's avatar Vikas Mahato Kaydeden (comit) Markus Mohrhard

Added date and time transformations

Change-Id: Icbea042f14ec6559597923f42fee26e666b2cc3c
Reviewed-on: https://gerrit.libreoffice.org/58152
Tested-by: Jenkins
Reviewed-by: 's avatarMarkus Mohrhard <markus.mohrhard@googlemail.com>
üst c40109cc
......@@ -52,6 +52,24 @@ public:
void testNumberOdd();
void testNumberSign();
void testReplaceNull();
void testGetDateString();
void testGetYear();
void testGetStartOfYear();
void testGetEndOfYear();
void testGetMonth();
void testGetMonthName();
void testGetStartOfMonth();
void testGetEndOfMonth();
void testGetDay();
void testGetDayOfWeek();
void testGetDayOfYear();
void testGetQuarter();
void testGetStartOfQuarter();
void testGetEndOfQuarter();
void testGetTime();
void testGetHour();
void testGetMinute();
void testGetSecond();
CPPUNIT_TEST_SUITE(ScDataTransformationTest);
CPPUNIT_TEST(testColumnRemove);
......@@ -78,6 +96,24 @@ public:
CPPUNIT_TEST(testNumberOdd);
CPPUNIT_TEST(testNumberSign);
CPPUNIT_TEST(testReplaceNull);
CPPUNIT_TEST(testGetDateString);
CPPUNIT_TEST(testGetYear);
CPPUNIT_TEST(testGetStartOfYear);
CPPUNIT_TEST(testGetEndOfYear);
CPPUNIT_TEST(testGetMonth);
CPPUNIT_TEST(testGetMonthName);
CPPUNIT_TEST(testGetStartOfMonth);
CPPUNIT_TEST(testGetEndOfMonth);
CPPUNIT_TEST(testGetDay);
CPPUNIT_TEST(testGetDayOfWeek);
CPPUNIT_TEST(testGetDayOfYear);
CPPUNIT_TEST(testGetQuarter);
CPPUNIT_TEST(testGetStartOfQuarter);
CPPUNIT_TEST(testGetEndOfQuarter);
CPPUNIT_TEST(testGetTime);
CPPUNIT_TEST(testGetHour);
CPPUNIT_TEST(testGetMinute);
CPPUNIT_TEST(testGetSecond);
CPPUNIT_TEST_SUITE_END();
private:
......@@ -505,6 +541,292 @@ void ScDataTransformationTest::testReplaceNull()
}
void ScDataTransformationTest::testGetDateString()
{
m_pDoc->SetValue(2, 0, 0, 43248.5624189815);
m_pDoc->SetValue(2, 1, 0, 42941.5624189815);
m_pDoc->SetValue(2, 2, 0, 42518.5624189815);
sc:: DateTimeTransformation aTransform({2}, sc::DATETIME_TRANSFORMATION_TYPE::DATE_STRING );
aTransform.Transform(*m_pDoc);
CPPUNIT_ASSERT_EQUAL(OUString("05/28/18"), m_pDoc->GetString(2, 0, 0));
CPPUNIT_ASSERT_EQUAL(OUString("07/25/17"), m_pDoc->GetString(2, 1, 0));
CPPUNIT_ASSERT_EQUAL(OUString("05/28/16"), m_pDoc->GetString(2, 2, 0));
}
void ScDataTransformationTest::testGetYear()
{
m_pDoc->SetValue(2, 0, 0, 20);
m_pDoc->SetValue(2, 1, 0, 3342.44);
m_pDoc->SetValue(2, 2, 0, 955.05);
m_pDoc->SetValue(2, 3, 0, 4890.22);
sc:: DateTimeTransformation aTransform({2}, sc::DATETIME_TRANSFORMATION_TYPE::YEAR );
aTransform.Transform(*m_pDoc);
CPPUNIT_ASSERT_DOUBLES_EQUAL(1900, m_pDoc->GetValue(2, 0, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(1909, m_pDoc->GetValue(2, 1, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(1902, m_pDoc->GetValue(2, 2, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(1913, m_pDoc->GetValue(2, 3, 0), 0);
}
void ScDataTransformationTest::testGetStartOfYear()
{
m_pDoc->SetValue(2, 0, 0, 43248.5624189815);
m_pDoc->SetValue(2, 1, 0, 42941.5624189815);
m_pDoc->SetValue(2, 2, 0, 42518.5624189815);
m_pDoc->SetValue(2, 3, 0, 44217.5624189815);
sc:: DateTimeTransformation aTransform({2}, sc::DATETIME_TRANSFORMATION_TYPE::START_OF_YEAR );
aTransform.Transform(*m_pDoc);
CPPUNIT_ASSERT_EQUAL(OUString("01/01/18"), m_pDoc->GetString(2, 0, 0));
CPPUNIT_ASSERT_EQUAL(OUString("01/01/17"), m_pDoc->GetString(2, 1, 0));
CPPUNIT_ASSERT_EQUAL(OUString("01/01/16"), m_pDoc->GetString(2, 2, 0));
CPPUNIT_ASSERT_EQUAL(OUString("01/01/21"), m_pDoc->GetString(2, 3, 0));
}
void ScDataTransformationTest::testGetEndOfYear()
{
m_pDoc->SetValue(2, 0, 0, 43248.5624189815);
m_pDoc->SetValue(2, 1, 0, 42941.5624189815);
m_pDoc->SetValue(2, 2, 0, 42518.5624189815);
m_pDoc->SetValue(2, 3, 0, 44217.5624189815);
sc:: DateTimeTransformation aTransform({2}, sc::DATETIME_TRANSFORMATION_TYPE::END_OF_YEAR );
aTransform.Transform(*m_pDoc);
CPPUNIT_ASSERT_EQUAL(OUString("12/31/18"), m_pDoc->GetString(2, 0, 0));
CPPUNIT_ASSERT_EQUAL(OUString("12/31/17"), m_pDoc->GetString(2, 1, 0));
CPPUNIT_ASSERT_EQUAL(OUString("12/31/16"), m_pDoc->GetString(2, 2, 0));
CPPUNIT_ASSERT_EQUAL(OUString("12/31/21"), m_pDoc->GetString(2, 3, 0));
}
void ScDataTransformationTest::testGetMonth()
{
m_pDoc->SetValue(2, 0, 0, 20);
m_pDoc->SetValue(2, 1, 0, 3342.44);
m_pDoc->SetValue(2, 2, 0, 955.05);
m_pDoc->SetValue(2, 3, 0, 4890.22);
sc:: DateTimeTransformation aTransform({2}, sc::DATETIME_TRANSFORMATION_TYPE::MONTH );
aTransform.Transform(*m_pDoc);
CPPUNIT_ASSERT_DOUBLES_EQUAL(1, m_pDoc->GetValue(2, 0, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(2, m_pDoc->GetValue(2, 1, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(8, m_pDoc->GetValue(2, 2, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(5, m_pDoc->GetValue(2, 3, 0), 0);
}
void ScDataTransformationTest::testGetMonthName()
{
m_pDoc->SetValue(2, 0, 0, 20);
m_pDoc->SetValue(2, 1, 0, 3342.44);
m_pDoc->SetValue(2, 2, 0, 955.05);
m_pDoc->SetValue(2, 3, 0, 4890.22);
sc:: DateTimeTransformation aTransform({2}, sc::DATETIME_TRANSFORMATION_TYPE::MONTH_NAME);
aTransform.Transform(*m_pDoc);
CPPUNIT_ASSERT_EQUAL(OUString("January"), m_pDoc->GetString(2, 0, 0));
CPPUNIT_ASSERT_EQUAL(OUString("February"), m_pDoc->GetString(2, 1, 0));
CPPUNIT_ASSERT_EQUAL(OUString("August"), m_pDoc->GetString(2, 2, 0));
CPPUNIT_ASSERT_EQUAL(OUString("May"), m_pDoc->GetString(2, 3, 0));
}
void ScDataTransformationTest::testGetStartOfMonth()
{
m_pDoc->SetValue(2, 0, 0, 43248.5624189815);
m_pDoc->SetValue(2, 1, 0, 42941.562418981);
m_pDoc->SetValue(2, 2, 0, 42518.5624189815);
m_pDoc->SetValue(2, 3, 0, 44217.5624189815);
sc:: DateTimeTransformation aTransform({2}, sc::DATETIME_TRANSFORMATION_TYPE::START_OF_MONTH );
aTransform.Transform(*m_pDoc);
CPPUNIT_ASSERT_EQUAL(OUString("05/01/18"), m_pDoc->GetString(2, 0, 0));
CPPUNIT_ASSERT_EQUAL(OUString("07/01/17"), m_pDoc->GetString(2, 1, 0));
CPPUNIT_ASSERT_EQUAL(OUString("05/01/16"), m_pDoc->GetString(2, 2, 0));
CPPUNIT_ASSERT_EQUAL(OUString("01/01/21"), m_pDoc->GetString(2, 3, 0));
}
void ScDataTransformationTest::testGetEndOfMonth()
{
m_pDoc->SetValue(2, 0, 0, 43248.5624189815);
m_pDoc->SetValue(2, 1, 0, 42941.5624189815);
m_pDoc->SetValue(2, 2, 0, 42518.5624189815);
m_pDoc->SetValue(2, 3, 0, 44217.5624189815);
sc:: DateTimeTransformation aTransform({2}, sc::DATETIME_TRANSFORMATION_TYPE::END_OF_MONTH );
aTransform.Transform(*m_pDoc);
CPPUNIT_ASSERT_EQUAL(OUString("05/31/18"), m_pDoc->GetString(2, 0, 0));
CPPUNIT_ASSERT_EQUAL(OUString("07/31/17"), m_pDoc->GetString(2, 1, 0));
CPPUNIT_ASSERT_EQUAL(OUString("05/31/16"), m_pDoc->GetString(2, 2, 0));
CPPUNIT_ASSERT_EQUAL(OUString("01/31/21"), m_pDoc->GetString(2, 3, 0));
}
void ScDataTransformationTest::testGetDay()
{
m_pDoc->SetValue(2, 0, 0, 20);
m_pDoc->SetValue(2, 1, 0, 3342.44);
m_pDoc->SetValue(2, 2, 0, 955.05);
m_pDoc->SetValue(2, 3, 0, 4890.22);
sc:: DateTimeTransformation aTransform({2}, sc::DATETIME_TRANSFORMATION_TYPE::DAY );
aTransform.Transform(*m_pDoc);
CPPUNIT_ASSERT_DOUBLES_EQUAL(20, m_pDoc->GetValue(2, 0, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(24, m_pDoc->GetValue(2, 1, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(13, m_pDoc->GetValue(2, 2, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(22, m_pDoc->GetValue(2, 3, 0), 0);
}
void ScDataTransformationTest::testGetDayOfWeek()
{
m_pDoc->SetValue(2, 0, 0, 20);
m_pDoc->SetValue(2, 1, 0, 3342.44);
m_pDoc->SetValue(2, 2, 0, 955.05);
m_pDoc->SetValue(2, 3, 0, 4890.22);
sc:: DateTimeTransformation aTransform({2}, sc::DATETIME_TRANSFORMATION_TYPE::DAY_OF_WEEK );
aTransform.Transform(*m_pDoc);
CPPUNIT_ASSERT_DOUBLES_EQUAL(5, m_pDoc->GetValue(2, 0, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(2, m_pDoc->GetValue(2, 1, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(2, m_pDoc->GetValue(2, 2, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(3, m_pDoc->GetValue(2, 3, 0), 0);
}
void ScDataTransformationTest::testGetDayOfYear()
{
m_pDoc->SetValue(2, 0, 0, 20);
m_pDoc->SetValue(2, 1, 0, 3342.44);
m_pDoc->SetValue(2, 2, 0, 955.05);
m_pDoc->SetValue(2, 3, 0, 4890.22);
sc:: DateTimeTransformation aTransform({2}, sc::DATETIME_TRANSFORMATION_TYPE::DAY_OF_YEAR );
aTransform.Transform(*m_pDoc);
CPPUNIT_ASSERT_DOUBLES_EQUAL(20, m_pDoc->GetValue(2, 0, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(55, m_pDoc->GetValue(2, 1, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(225, m_pDoc->GetValue(2, 2, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(142, m_pDoc->GetValue(2, 3, 0), 0);
}
void ScDataTransformationTest::testGetQuarter()
{
m_pDoc->SetValue(2, 0, 0, 20);
m_pDoc->SetValue(2, 1, 0, 3342.44);
m_pDoc->SetValue(2, 2, 0, 955.05);
m_pDoc->SetValue(2, 3, 0, 4890.22);
sc:: DateTimeTransformation aTransform({2}, sc::DATETIME_TRANSFORMATION_TYPE::QUARTER );
aTransform.Transform(*m_pDoc);
CPPUNIT_ASSERT_DOUBLES_EQUAL(1, m_pDoc->GetValue(2, 0, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(1, m_pDoc->GetValue(2, 1, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(3, m_pDoc->GetValue(2, 2, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(2, m_pDoc->GetValue(2, 3, 0), 0);
}
void ScDataTransformationTest::testGetStartOfQuarter()
{
m_pDoc->SetValue(2, 0, 0, 43148.5624189815);
m_pDoc->SetValue(2, 1, 0, 43264.3055555556);
m_pDoc->SetValue(2, 2, 0, 43306.4946990741);
m_pDoc->SetValue(2, 3, 0, 43406.4946990741);
sc:: DateTimeTransformation aTransform({2}, sc::DATETIME_TRANSFORMATION_TYPE::START_OF_QUARTER );
aTransform.Transform(*m_pDoc);
CPPUNIT_ASSERT_EQUAL(OUString("01/01/18"), m_pDoc->GetString(2, 0, 0));
CPPUNIT_ASSERT_EQUAL(OUString("04/01/18"), m_pDoc->GetString(2, 1, 0));
CPPUNIT_ASSERT_EQUAL(OUString("07/01/18"), m_pDoc->GetString(2, 2, 0));
CPPUNIT_ASSERT_EQUAL(OUString("10/01/18"), m_pDoc->GetString(2, 3, 0));
}
void ScDataTransformationTest::testGetEndOfQuarter()
{
m_pDoc->SetValue(2, 0, 0, 43148.5624189815);
m_pDoc->SetValue(2, 1, 0, 43264.3055555556);
m_pDoc->SetValue(2, 2, 0, 43306.4946990741);
m_pDoc->SetValue(2, 3, 0, 43406.4946990741);
sc:: DateTimeTransformation aTransform({2}, sc::DATETIME_TRANSFORMATION_TYPE::END_OF_QUARTER );
aTransform.Transform(*m_pDoc);
CPPUNIT_ASSERT_EQUAL(OUString("03/31/18"), m_pDoc->GetString(2, 0, 0));
CPPUNIT_ASSERT_EQUAL(OUString("06/30/18"), m_pDoc->GetString(2, 1, 0));
CPPUNIT_ASSERT_EQUAL(OUString("09/30/18"), m_pDoc->GetString(2, 2, 0));
CPPUNIT_ASSERT_EQUAL(OUString("12/31/18"), m_pDoc->GetString(2, 3, 0));
}
void ScDataTransformationTest::testGetTime()
{
m_pDoc->SetValue(2, 0, 0, 20.562419);
m_pDoc->SetValue(2, 1, 0, 43249.3077546296);
m_pDoc->SetValue(2, 2, 0, 43249.3990740741);
m_pDoc->SetValue(2, 3, 0, 43249.4234837963);
sc:: DateTimeTransformation aTransform({2}, sc::DATETIME_TRANSFORMATION_TYPE::TIME );
aTransform.Transform(*m_pDoc);
CPPUNIT_ASSERT_EQUAL(OUString("01:29:53 PM"), m_pDoc->GetString(2, 0, 0));
CPPUNIT_ASSERT_EQUAL(OUString("07:23:09 AM"), m_pDoc->GetString(2, 1, 0));
CPPUNIT_ASSERT_EQUAL(OUString("09:34:40 AM"), m_pDoc->GetString(2, 2, 0));
CPPUNIT_ASSERT_EQUAL(OUString("10:09:49 AM"), m_pDoc->GetString(2, 3, 0));
}
void ScDataTransformationTest::testGetHour()
{
m_pDoc->SetValue(2, 0, 0, 20.562419);
m_pDoc->SetValue(2, 1, 0, 43249.3077546296);
m_pDoc->SetValue(2, 2, 0, 43249.3990740741);
m_pDoc->SetValue(2, 3, 0, 43249.4234837963);
sc:: DateTimeTransformation aTransform({2}, sc::DATETIME_TRANSFORMATION_TYPE::HOUR );
aTransform.Transform(*m_pDoc);
CPPUNIT_ASSERT_DOUBLES_EQUAL(13, m_pDoc->GetValue(2, 0, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(7, m_pDoc->GetValue(2, 1, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(9, m_pDoc->GetValue(2, 2, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(10, m_pDoc->GetValue(2, 3, 0), 0);
}
void ScDataTransformationTest::testGetMinute()
{
m_pDoc->SetValue(2, 0, 0, 20.562419);
m_pDoc->SetValue(2, 1, 0, 43249.3077546296);
m_pDoc->SetValue(2, 2, 0, 43249.3990740741);
m_pDoc->SetValue(2, 3, 0, 43249.4234837963);
sc:: DateTimeTransformation aTransform({2}, sc::DATETIME_TRANSFORMATION_TYPE::MINUTE );
aTransform.Transform(*m_pDoc);
CPPUNIT_ASSERT_DOUBLES_EQUAL(29, m_pDoc->GetValue(2, 0, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(23, m_pDoc->GetValue(2, 1, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(34, m_pDoc->GetValue(2, 2, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(9, m_pDoc->GetValue(2, 3, 0), 0);
}
void ScDataTransformationTest::testGetSecond()
{
m_pDoc->SetValue(2, 0, 0, 20.562419);
m_pDoc->SetValue(2, 1, 0, 43249.3077546296);
m_pDoc->SetValue(2, 2, 0, 43249.3990740741);
m_pDoc->SetValue(2, 3, 0, 43249.4234837963);
sc:: DateTimeTransformation aTransform({2}, sc::DATETIME_TRANSFORMATION_TYPE::SECOND );
aTransform.Transform(*m_pDoc);
CPPUNIT_ASSERT_DOUBLES_EQUAL(53, m_pDoc->GetValue(2, 0, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(9, m_pDoc->GetValue(2, 1, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(40, m_pDoc->GetValue(2, 2, 0), 0);
CPPUNIT_ASSERT_DOUBLES_EQUAL(49, m_pDoc->GetValue(2, 3, 0), 0);
}
ScDataTransformationTest::ScDataTransformationTest() :
ScBootstrapFixture( "sc/qa/unit/data/dataprovider" ),
m_pDoc(nullptr)
......
......@@ -12,9 +12,68 @@
#include <document.hxx>
#include <rtl/math.hxx>
#include <cmath>
#include <tools/datetime.hxx>
#include <svl/zforlist.hxx>
namespace {
namespace sc {
int getHour(double nDateTime)
{
long nDays = std::trunc(nDateTime);
double nTime = nDateTime - nDays;
return std::trunc(nTime*24);
}
int getMinute(double nDateTime)
{
long nDays = std::trunc(nDateTime);
double nTime = nDateTime - nDays;
nTime = nTime*24;
nTime = nTime - std::trunc(nTime);
return std::trunc(nTime*60);
}
int getSecond(double nDateTime)
{
double nDays = std::trunc(nDateTime);
double nTime = nDateTime - nDays;
nTime = nTime*24;
nTime = nTime - std::trunc(nTime);
nTime = nTime*60;
nTime = nTime - std::trunc(nTime);
return std::trunc(nTime*60);
}
OUString getTwoDigitString(OUString sString)
{
if(sString.getLength() == 1)
sString = "0" + sString;
return sString;
}
DateTime getDate(double nDateTime, SvNumberFormatter* pFormatter)
{
sal_Int32 nDays = std::trunc(nDateTime);
Date aDate = pFormatter->GetNullDate();
aDate.AddDays(nDays + 1);
return aDate;
}
OUString getTimeString(double nDateTime)
{
OUString sHour = OUString::number(getHour(nDateTime));
sHour = getTwoDigitString(sHour);
OUString sMinute = OUString::number(getMinute(nDateTime));
sMinute = getTwoDigitString(sMinute);
OUString sSecond = OUString::number(getSecond(nDateTime));
sSecond = getTwoDigitString(sSecond);
return sHour + ":" + sMinute + ":" + sSecond;
}
}
namespace sc {
DataTransformation::~DataTransformation()
{
}
......@@ -697,6 +756,471 @@ TransformationType ReplaceNullTransformation::getTransformationType() const
{
return TransformationType::REMOVE_NULL_TRANSFORMATION;
}
DateTimeTransformation::DateTimeTransformation(const std::set<SCCOL> nCol,const DATETIME_TRANSFORMATION_TYPE rType):
mnCol(nCol),
maType(rType)
{
}
void DateTimeTransformation::Transform(ScDocument& rDoc) const
{
SCROW nEndRow = 0;
for(auto& rCol : mnCol)
{
nEndRow = getLastRow(rDoc, rCol);
}
for(auto& rCol : mnCol)
{
switch (maType)
{
case DATETIME_TRANSFORMATION_TYPE::DATE_STRING:
{
for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
{
CellType eType;
rDoc.GetCellType(rCol, nRow, 0, eType);
if (eType == CELLTYPE_VALUE)
{
double nVal = rDoc.GetValue(rCol, nRow, 0);
SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
SvNumFormatType nFormatType = SvNumFormatType::DATE;
LanguageType eLanguage = ScGlobal::eLnge;
ScAddress aAddress(rCol, nRow, 0);
sal_uLong nFormat = pFormatter->GetStandardFormat( nFormatType, eLanguage );
rDoc.SetValue(rCol, nRow, 0, nVal);
rDoc.SetNumberFormat(aAddress, nFormat);
}
}
}
break;
case DATETIME_TRANSFORMATION_TYPE::YEAR:
{
for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
{
CellType eType;
rDoc.GetCellType(rCol, nRow, 0, eType);
if (eType == CELLTYPE_VALUE)
{
double nVal = rDoc.GetValue(rCol, nRow, 0);
SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
Date aDate = getDate(nVal, pFormatter);
rDoc.SetValue(rCol, nRow, 0, aDate.GetYear());
}
}
}
break;
case DATETIME_TRANSFORMATION_TYPE::START_OF_YEAR:
{
for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
{
CellType eType;
rDoc.GetCellType(rCol, nRow, 0, eType);
if (eType == CELLTYPE_VALUE)
{
double nVal = rDoc.GetValue(rCol, nRow, 0);
SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
Date aDate = getDate(nVal, pFormatter);
nVal -= aDate.GetDayOfYear() - 2;
nVal = std::trunc(nVal);
SvNumFormatType nFormatType = SvNumFormatType::DATE;
LanguageType eLanguage = ScGlobal::eLnge;
ScAddress aAddress(rCol, nRow, 0);
sal_uLong nFormat = pFormatter->GetStandardFormat( nFormatType, eLanguage );
rDoc.SetValue(rCol, nRow, 0, nVal);
rDoc.SetNumberFormat(aAddress, nFormat);
}
}
}
break;
case DATETIME_TRANSFORMATION_TYPE::END_OF_YEAR:
{
for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
{
CellType eType;
rDoc.GetCellType(rCol, nRow, 0, eType);
if (eType == CELLTYPE_VALUE)
{
double nVal = rDoc.GetValue(rCol, nRow, 0);
SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
Date aDate = getDate(nVal, pFormatter);
nVal += ( aDate.GetDaysInYear() - aDate.GetDayOfYear() + 1);
nVal = std::trunc(nVal);
SvNumFormatType nFormatType = SvNumFormatType::DATE;
LanguageType eLanguage = ScGlobal::eLnge;
ScAddress aAddress(rCol, nRow, 0);
sal_uLong nFormat = pFormatter->GetStandardFormat( nFormatType, eLanguage );
rDoc.SetValue(rCol, nRow, 0, nVal);
rDoc.SetNumberFormat(aAddress, nFormat);
}
}
}
break;
case DATETIME_TRANSFORMATION_TYPE::MONTH:
{
for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
{
CellType eType;
rDoc.GetCellType(rCol, nRow, 0, eType);
if (eType == CELLTYPE_VALUE)
{
double nVal = rDoc.GetValue(rCol, nRow, 0);
SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
Date aDate = getDate(nVal, pFormatter);
rDoc.SetValue(rCol, nRow, 0, aDate.GetMonth());
}
}
}
break;
case DATETIME_TRANSFORMATION_TYPE::MONTH_NAME:
{
for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
{
CellType eType;
rDoc.GetCellType(rCol, nRow, 0, eType);
if (eType == CELLTYPE_VALUE)
{
OUString aMonths[] = {"January", "February", "March", "April", "May",
"June", "July", "August", "September", "October", "November", "December"};
double nVal = rDoc.GetValue(rCol, nRow, 0);
SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
Date aDate = getDate(nVal, pFormatter);
rDoc.SetString(rCol, nRow, 0, aMonths[aDate.GetMonth() - 1]);
}
}
}
break;
case DATETIME_TRANSFORMATION_TYPE::START_OF_MONTH:
{
for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
{
CellType eType;
rDoc.GetCellType(rCol, nRow, 0, eType);
if (eType == CELLTYPE_VALUE)
{
double nVal = rDoc.GetValue(rCol, nRow, 0);
SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
SvNumFormatType nFormatType = SvNumFormatType::DATE;
LanguageType eLanguage = ScGlobal::eLnge;
ScAddress aAddress(rCol, nRow, 0);
sal_uLong nFormat = pFormatter->GetStandardFormat( nFormatType, eLanguage );
Date aDate = getDate(nVal, pFormatter);
Date aStart(1,aDate.GetMonth(), aDate.GetYear());
int nDays = aDate.GetDayOfYear() - aStart.GetDayOfYear() - 1;
rDoc.SetValue(rCol, nRow, 0, nVal - nDays);
rDoc.SetNumberFormat(aAddress, nFormat);
}
}
}
break;
case DATETIME_TRANSFORMATION_TYPE::END_OF_MONTH:
{
for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
{
CellType eType;
rDoc.GetCellType(rCol, nRow, 0, eType);
if (eType == CELLTYPE_VALUE)
{
double nVal = rDoc.GetValue(rCol, nRow, 0);
SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
SvNumFormatType nFormatType = SvNumFormatType::DATE;
LanguageType eLanguage = ScGlobal::eLnge;
ScAddress aAddress(rCol, nRow, 0);
sal_uLong nFormat = pFormatter->GetStandardFormat( nFormatType, eLanguage );
Date aDate = getDate(nVal, pFormatter);
Date aEnd(aDate.GetDaysInMonth(),aDate.GetMonth(), aDate.GetYear());
int nDays = aEnd.GetDayOfYear() - aDate.GetDayOfYear() + 1;
rDoc.SetValue(rCol, nRow, 0, nVal + nDays);
rDoc.SetNumberFormat(aAddress, nFormat);
}
}
}
break;
case DATETIME_TRANSFORMATION_TYPE::DAY:
{
for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
{
CellType eType;
rDoc.GetCellType(rCol, nRow, 0, eType);
if (eType == CELLTYPE_VALUE)
{
double nVal = rDoc.GetValue(rCol, nRow, 0);
SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
Date aDate = getDate(nVal, pFormatter);
rDoc.SetValue(rCol, nRow, 0, aDate.GetDay());
}
}
}
break;
case DATETIME_TRANSFORMATION_TYPE::DAY_OF_WEEK:
{
for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
{
CellType eType;
rDoc.GetCellType(rCol, nRow, 0, eType);
if (eType == CELLTYPE_VALUE)
{
double nVal = rDoc.GetValue(rCol, nRow, 0);
SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
Date aDate = getDate(nVal, pFormatter);
rDoc.SetValue(rCol, nRow, 0, aDate.GetDayOfWeek());
}
}
}
break;
case DATETIME_TRANSFORMATION_TYPE::DAY_OF_YEAR:
{
for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
{
CellType eType;
rDoc.GetCellType(rCol, nRow, 0, eType);
if (eType == CELLTYPE_VALUE)
{
double nVal = rDoc.GetValue(rCol, nRow, 0);
SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
Date aDate = getDate(nVal, pFormatter);
rDoc.SetValue(rCol, nRow, 0, aDate.GetDayOfYear());
}
}
}
break;
case DATETIME_TRANSFORMATION_TYPE::QUARTER:
{
for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
{
CellType eType;
rDoc.GetCellType(rCol, nRow, 0, eType);
if (eType == CELLTYPE_VALUE)
{
double nVal = rDoc.GetValue(rCol, nRow, 0);
SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
Date aDate = getDate(nVal, pFormatter);
int nMonth = 1 + aDate.GetMonth();
if(nMonth >= 1 && nMonth <=3)
rDoc.SetValue(rCol, nRow, 0, 1);
else if(nMonth >= 4 && nMonth <=6)
rDoc.SetValue(rCol, nRow, 0, 2);
else if(nMonth >= 7 && nMonth <=9)
rDoc.SetValue(rCol, nRow, 0, 3);
else if(nMonth >= 10 && nMonth <=12)
rDoc.SetValue(rCol, nRow, 0, 4);
else
rDoc.SetValue(rCol, nRow, 0, -1);
}
}
}
break;
case DATETIME_TRANSFORMATION_TYPE::START_OF_QUARTER:
{
for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
{
CellType eType;
rDoc.GetCellType(rCol, nRow, 0, eType);
if (eType == CELLTYPE_VALUE)
{
double nVal = rDoc.GetValue(rCol, nRow, 0);
SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
SvNumFormatType nFormatType = SvNumFormatType::DATE;
LanguageType eLanguage = ScGlobal::eLnge;
ScAddress aAddress(rCol, nRow, 0);
sal_uLong nFormat = pFormatter->GetStandardFormat( nFormatType, eLanguage );
Date aDate = getDate(nVal, pFormatter);
int nMonth = aDate.GetMonth();
if(nMonth >= 1 && nMonth <=3)
{
Date aQuarterDate(1,1,aDate.GetYear());
int days = aDate.GetDayOfYear() - aQuarterDate.GetDayOfYear() - 1;
nVal -= days;
rDoc.SetValue(rCol, nRow, 0, nVal);
rDoc.SetNumberFormat(aAddress, nFormat);
}
else if(nMonth >= 4 && nMonth <=6)
{
Date aQuarterDate(1,4,aDate.GetYear());
int days = aDate.GetDayOfYear() - aQuarterDate.GetDayOfYear() - 1;
nVal -= days;
rDoc.SetValue(rCol, nRow, 0, nVal);
rDoc.SetNumberFormat(aAddress, nFormat);
}
else if(nMonth >= 7 && nMonth <=9)
{
Date aQuarterDate(1,7,aDate.GetYear());
int days = aDate.GetDayOfYear() - aQuarterDate.GetDayOfYear() - 1;
nVal -= days;
rDoc.SetValue(rCol, nRow, 0, nVal);
rDoc.SetNumberFormat(aAddress, nFormat);
}
else if(nMonth >= 10 && nMonth <=12)
{
Date aQuarterDate(1,10,aDate.GetYear());
int days = aDate.GetDayOfYear() - aQuarterDate.GetDayOfYear() - 1;
nVal -= days;
rDoc.SetValue(rCol, nRow, 0, nVal);
rDoc.SetNumberFormat(aAddress, nFormat);
}
else
rDoc.SetValue(rCol, nRow, 0, -1);
}
}
}
break;
case DATETIME_TRANSFORMATION_TYPE::END_OF_QUARTER:
{
for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
{
SvNumberFormatter* pFormatter = rDoc.GetFormatTable();
SvNumFormatType nFormatType = SvNumFormatType::DATE;
LanguageType eLanguage = ScGlobal::eLnge;
ScAddress aAddress(rCol, nRow, 0);
sal_uLong nFormat = pFormatter->GetStandardFormat( nFormatType, eLanguage );
CellType eType;
rDoc.GetCellType(rCol, nRow, 0, eType);
if (eType == CELLTYPE_VALUE)
{
double nVal = rDoc.GetValue(rCol, nRow, 0);
nVal = std::trunc(nVal);
Date aDate = getDate(nVal, pFormatter);
int nMonth = aDate.GetMonth();
if(nMonth >= 1 && nMonth <=3)
{
Date aQuarterDate(31,3,aDate.GetYear());
int days = aQuarterDate.GetDayOfYear() - aDate.GetDayOfYear() + 1;
nVal += days;
rDoc.SetValue(rCol, nRow, 0, nVal);
rDoc.SetNumberFormat(aAddress, nFormat);
}
else if(nMonth >= 4 && nMonth <=6)
{
Date aQuarterDate(30,6,aDate.GetYear());
int days = aQuarterDate.GetDayOfYear() - aDate.GetDayOfYear() + 1;
nVal += days;
rDoc.SetValue(rCol, nRow, 0, nVal);
rDoc.SetNumberFormat(aAddress, nFormat);
}
else if(nMonth >= 7 && nMonth <=9)
{
Date aQuarterDate(30,9,aDate.GetYear());
int days = aQuarterDate.GetDayOfYear() - aDate.GetDayOfYear() + 1;
nVal += days;
rDoc.SetValue(rCol, nRow, 0, nVal);
rDoc.SetNumberFormat(aAddress, nFormat);
}
else if(nMonth >= 10 && nMonth <=12)
{
Date aQuarterDate(31,12,aDate.GetYear());
int days = aQuarterDate.GetDayOfYear() - aDate.GetDayOfYear() + 1;
nVal += days;
rDoc.SetValue(rCol, nRow, 0, nVal);
rDoc.SetNumberFormat(aAddress, nFormat);
}
else
rDoc.SetValue(rCol, nRow, 0, -1);
}
}
}
break;
case DATETIME_TRANSFORMATION_TYPE::TIME:
{
for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
{
CellType eType;
rDoc.GetCellType(rCol, nRow, 0, eType);
if (eType == CELLTYPE_VALUE)
{
double nVal = rDoc.GetValue(rCol, nRow, 0);
rDoc.SetString(rCol, nRow, 0, getTimeString(nVal));
}
}
}
break;
case DATETIME_TRANSFORMATION_TYPE::HOUR:
{
for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
{
CellType eType;
rDoc.GetCellType(rCol, nRow, 0, eType);
if (eType == CELLTYPE_VALUE)
{
double nVal = rDoc.GetValue(rCol, nRow, 0);
rDoc.SetValue(rCol, nRow, 0, getHour(nVal));
}
}
}
break;
case DATETIME_TRANSFORMATION_TYPE::MINUTE:
{
for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
{
CellType eType;
rDoc.GetCellType(rCol, nRow, 0, eType);
if (eType == CELLTYPE_VALUE)
{
double nVal = rDoc.GetValue(rCol, nRow, 0);
rDoc.SetValue(rCol, nRow, 0, getMinute(nVal));
}
}
}
break;
case DATETIME_TRANSFORMATION_TYPE::SECOND:
{
for (SCROW nRow = 0; nRow <= nEndRow; ++nRow)
{
CellType eType;
rDoc.GetCellType(rCol, nRow, 0, eType);
if (eType == CELLTYPE_VALUE)
{
double nVal = rDoc.GetValue(rCol, nRow, 0);
rDoc.SetValue(rCol, nRow, 0, getSecond(nVal));
}
}
}
break;
default:
break;
}
}
}
TransformationType DateTimeTransformation::getTransformationType() const
{
return TransformationType::DATETIME_TRANSFORMATION;
}
DATETIME_TRANSFORMATION_TYPE DateTimeTransformation::getDateTimeTransfromationType() const
{
return maType;
}
std::set<SCCOL>DateTimeTransformation::getColumn() const
{
return mnCol;
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -30,7 +30,8 @@ enum class TransformationType
TEXT_TRANSFORMATION,
AGGREGATE_FUNCTION,
NUMBER_TRANSFORMATION,
REMOVE_NULL_TRANSFORMATION
REMOVE_NULL_TRANSFORMATION,
DATETIME_TRANSFORMATION
};
enum class TEXT_TRANSFORM_TYPE { TO_LOWER, TO_UPPER, CAPITALIZE, TRIM };
......@@ -40,6 +41,10 @@ enum class AGGREGATE_FUNCTION { SUM, AVERAGE, MIN, MAX };
enum class NUMBER_TRANSFORM_TYPE { ROUND, ROUND_UP, ROUND_DOWN, ABSOLUTE, LOG_E, LOG_10, CUBE,
SQUARE, SQUARE_ROOT, EXPONENT, IS_EVEN, IS_ODD, SIGN };
enum class DATETIME_TRANSFORMATION_TYPE { DATE_STRING, YEAR, START_OF_YEAR, END_OF_YEAR, MONTH,
MONTH_NAME, START_OF_MONTH, END_OF_MONTH, DAY, DAY_OF_WEEK, DAY_OF_YEAR, QUARTER, START_OF_QUARTER,
END_OF_QUARTER, TIME, HOUR, MINUTE, SECOND };
class SC_DLLPUBLIC DataTransformation
{
protected:
......@@ -162,6 +167,19 @@ class SC_DLLPUBLIC ReplaceNullTransformation : public DataTransformation
OUString getReplaceString() const;
};
class SC_DLLPUBLIC DateTimeTransformation : public DataTransformation
{
std::set<SCCOL> mnCol;
DATETIME_TRANSFORMATION_TYPE maType;
public:
DateTimeTransformation(const std::set<SCCOL> nCol, const DATETIME_TRANSFORMATION_TYPE rType);
virtual void Transform(ScDocument& rDoc) const override;
virtual TransformationType getTransformationType() const override;
DATETIME_TRANSFORMATION_TYPE getDateTimeTransfromationType() const;
std::set<SCCOL> getColumn() const;
};
}
#endif
......
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