sc/source/filter/xml/xmltransformationi.cxx | 169 ++++++++++++++++++++++++++++ sc/source/filter/xml/xmltransformationi.hxx | 33 +++++ 2 files changed, 202 insertions(+)
New commits: commit d1fa83231c8afd2b2c14f89f869ba14ba2f3e628 Author: Vikas Mahato <vikasmaha...@gmail.com> AuthorDate: Sat Jul 28 23:31:11 2018 +0530 Commit: Markus Mohrhard <markus.mohrh...@googlemail.com> CommitDate: Mon Aug 6 22:05:08 2018 +0200 Import ODF with data transformations - follow-up Change-Id: If8bef32ff4a08edef3bb86f366a7b47d8ac1e397 Reviewed-on: https://gerrit.libreoffice.org/58258 Tested-by: Jenkins Reviewed-by: Markus Mohrhard <markus.mohrh...@googlemail.com> diff --git a/sc/source/filter/xml/xmltransformationi.cxx b/sc/source/filter/xml/xmltransformationi.cxx index 857895149bf5..f48fa02ecdc0 100644 --- a/sc/source/filter/xml/xmltransformationi.cxx +++ b/sc/source/filter/xml/xmltransformationi.cxx @@ -75,6 +75,11 @@ uno::Reference<xml::sax::XFastContextHandler> pContext = new ScXMLColumnNumberContext(GetScImport(), pAttribList); } break; + case XML_ELEMENT(CALC_EXT, XML_COLUMN_REPLACENULL_TRANSFORMATION): + { + pContext = new ScXMLColumnRemoveNullContext(GetScImport(), pAttribList); + } + break; } if (!pContext) @@ -511,4 +516,168 @@ uno::Reference<xml::sax::XFastContextHandler> return new SvXMLImportContext(GetImport()); } +ScXMLColumnRemoveNullContext::ScXMLColumnRemoveNullContext( + ScXMLImport& rImport, const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList) + : ScXMLImportContext(rImport) +{ + if (rAttrList.is()) + { + for (auto& aIter : *rAttrList) + { + switch (aIter.getToken()) + { + case XML_ELEMENT(CALC_EXT, XML_REPLACE_STRING): + { + maReplaceString = aIter.toString(); + } + break; + } + } + } +} + +ScXMLColumnRemoveNullContext::~ScXMLColumnRemoveNullContext() +{ + ScDocument* pDoc = GetScImport().GetDocument(); + auto& rDataSources = pDoc->GetExternalDataMapper().getDataSources(); + if (!rDataSources.empty()) + { + rDataSources[rDataSources.size() - 1].AddDataTransformation( + std::make_shared<sc::ReplaceNullTransformation>(maColumns, maReplaceString)); + } +} + +uno::Reference<xml::sax::XFastContextHandler> + SAL_CALL ScXMLColumnRemoveNullContext::createFastChildContext( + sal_Int32 nElement, const uno::Reference<xml::sax::XFastAttributeList>& xAttrList) +{ + sax_fastparser::FastAttributeList* pAttribList + = sax_fastparser::FastAttributeList::castToFastAttributeList(xAttrList); + const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList = pAttribList; + switch (nElement) + { + case XML_ELEMENT(CALC_EXT, XML_COLUMN): + { + if (rAttrList.is()) + { + for (auto& aIter : *rAttrList) + { + switch (aIter.getToken()) + { + case XML_ELEMENT(CALC_EXT, XML_COLUMN): + { + maColumns.insert(aIter.toInt32()); + } + break; + } + } + } + } + break; + } + return new SvXMLImportContext(GetImport()); +} + +ScXMLDateTimeContext::ScXMLDateTimeContext( + ScXMLImport& rImport, const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList) + : ScXMLImportContext(rImport) +{ + if (rAttrList.is()) + { + for (auto& aIter : *rAttrList) + { + switch (aIter.getToken()) + { + case XML_ELEMENT(CALC_EXT, XML_TYPE): + { + aType = aIter.toString(); + } + break; + } + } + } + + if (!aType.isEmpty()) + { + if (aType == "date-string") + maType = sc::DATETIME_TRANSFORMATION_TYPE::DATE_STRING; + else if (aType == "year") + maType = sc::DATETIME_TRANSFORMATION_TYPE::YEAR; + else if (aType == "start-of-year") + maType = sc::DATETIME_TRANSFORMATION_TYPE::START_OF_YEAR; + else if (aType == "end-of-year") + maType = sc::DATETIME_TRANSFORMATION_TYPE::END_OF_YEAR; + else if (aType == "month") + maType = sc::DATETIME_TRANSFORMATION_TYPE::MONTH; + else if (aType == "month-name") + maType = sc::DATETIME_TRANSFORMATION_TYPE::MONTH_NAME; + else if (aType == "start-of-month") + maType = sc::DATETIME_TRANSFORMATION_TYPE::START_OF_MONTH; + else if (aType == "end-of-month") + maType = sc::DATETIME_TRANSFORMATION_TYPE::END_OF_MONTH; + else if (aType == "day") + maType = sc::DATETIME_TRANSFORMATION_TYPE::DAY; + else if (aType == "day-of-week") + maType = sc::DATETIME_TRANSFORMATION_TYPE::DAY_OF_WEEK; + else if (aType == "day-of-year") + maType = sc::DATETIME_TRANSFORMATION_TYPE::DAY_OF_YEAR; + else if (aType == "quarter") + maType = sc::DATETIME_TRANSFORMATION_TYPE::QUARTER; + else if (aType == "start-of-quarter") + maType = sc::DATETIME_TRANSFORMATION_TYPE::START_OF_QUARTER; + else if (aType == "end-of-quarter") + maType = sc::DATETIME_TRANSFORMATION_TYPE::END_OF_QUARTER; + else if (aType == "time") + maType = sc::DATETIME_TRANSFORMATION_TYPE::TIME; + else if (aType == "hour") + maType = sc::DATETIME_TRANSFORMATION_TYPE::HOUR; + else if (aType == "minute") + maType = sc::DATETIME_TRANSFORMATION_TYPE::MINUTE; + else if (aType == "seconds") + maType = sc::DATETIME_TRANSFORMATION_TYPE::SECOND; + } +} + +ScXMLDateTimeContext::~ScXMLDateTimeContext() +{ + ScDocument* pDoc = GetScImport().GetDocument(); + auto& rDataSources = pDoc->GetExternalDataMapper().getDataSources(); + if (!rDataSources.empty()) + { + rDataSources[rDataSources.size() - 1].AddDataTransformation( + std::make_shared<sc::DateTimeTransformation>(maColumns, maType)); + } +} + +uno::Reference<xml::sax::XFastContextHandler> SAL_CALL ScXMLDateTimeContext::createFastChildContext( + sal_Int32 nElement, const uno::Reference<xml::sax::XFastAttributeList>& xAttrList) +{ + sax_fastparser::FastAttributeList* pAttribList + = sax_fastparser::FastAttributeList::castToFastAttributeList(xAttrList); + const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList = pAttribList; + + switch (nElement) + { + case XML_ELEMENT(CALC_EXT, XML_COLUMN): + { + if (rAttrList.is()) + { + for (auto& aIter : *rAttrList) + { + switch (aIter.getToken()) + { + case XML_ELEMENT(CALC_EXT, XML_COLUMN): + { + maColumns.insert(aIter.toInt32()); + } + break; + } + } + } + } + break; + } + return new SvXMLImportContext(GetImport()); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/filter/xml/xmltransformationi.hxx b/sc/source/filter/xml/xmltransformationi.hxx index 42c8a66090f4..2fc712f158fe 100644 --- a/sc/source/filter/xml/xmltransformationi.hxx +++ b/sc/source/filter/xml/xmltransformationi.hxx @@ -135,6 +135,39 @@ public: sal_Int32 nElement, const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList) override; }; + +class ScXMLColumnRemoveNullContext : public ScXMLImportContext +{ + std::set<SCCOL> maColumns; + OUString maReplaceString; + +public: + ScXMLColumnRemoveNullContext( + ScXMLImport& rImport, const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList); + + virtual ~ScXMLColumnRemoveNullContext() override; + + virtual css::uno::Reference<css::xml::sax::XFastContextHandler> SAL_CALL createFastChildContext( + sal_Int32 nElement, + const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList) override; +}; + +class ScXMLDateTimeContext : public ScXMLImportContext +{ + OUString aType; + sc::DATETIME_TRANSFORMATION_TYPE maType; + std::set<SCCOL> maColumns; + +public: + ScXMLDateTimeContext(ScXMLImport& rImport, + const rtl::Reference<sax_fastparser::FastAttributeList>& rAttrList); + + virtual ~ScXMLDateTimeContext() override; + + virtual css::uno::Reference<css::xml::sax::XFastContextHandler> SAL_CALL createFastChildContext( + sal_Int32 nElement, + const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList) override; +}; #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits