diff options
author | Samuel Mehrbrodt <samuel.mehrbrodt@allotropia.de> | 2021-04-28 16:25:42 +0200 |
---|---|---|
committer | Samuel Mehrbrodt <samuel.mehrbrodt@allotropia.de> | 2021-05-04 13:02:27 +0200 |
commit | e2bdd31c0231444f1ba1463bffb5656c230c3073 (patch) | |
tree | 335cdc78b2af1ed05e0558cee1844f1f52deb5f9 /sc | |
parent | e23436d347bb44a720932a2e7badc56147f5b167 (diff) |
tdf#76258 Add ODF import/export
XML looks like:
<table:filter-condition table:field-number="0" loext:data-type="background-color" table:value="#ffd7d7" table:operator="="/>
<table:filter-condition table:field-number="1" loext:data-type="text-color" table:value="#3465a4" table:operator="="/>
Change-Id: Idcddf0ce436da69567e5a7e9dfd7d796dc872586
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114812
Tested-by: Jenkins
Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
Reviewed-by: Samuel Mehrbrodt <samuel.mehrbrodt@allotropia.de>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/qa/unit/data/ods/autofilter-colors.ods | bin | 0 -> 9556 bytes | |||
-rw-r--r-- | sc/qa/unit/subsequent_export-test.cxx | 16 | ||||
-rw-r--r-- | sc/source/filter/xml/XMLExportDatabaseRanges.cxx | 26 | ||||
-rw-r--r-- | sc/source/filter/xml/xmlfilti.cxx | 9 |
4 files changed, 47 insertions, 4 deletions
diff --git a/sc/qa/unit/data/ods/autofilter-colors.ods b/sc/qa/unit/data/ods/autofilter-colors.ods Binary files differnew file mode 100644 index 000000000000..d5a88e9299fb --- /dev/null +++ b/sc/qa/unit/data/ods/autofilter-colors.ods diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx index b25aae6c4ab4..01cf0a236a24 100644 --- a/sc/qa/unit/subsequent_export-test.cxx +++ b/sc/qa/unit/subsequent_export-test.cxx @@ -218,6 +218,7 @@ public: void testTdf95640_ods_to_xlsx_with_standard_list(); void testTdf95640_xlsx_to_xlsx(); void testDateAutofilterXLSX(); + void testAutofilterColorsODF(); void testRefStringXLSX(); void testRefStringConfigXLSX(); @@ -404,6 +405,7 @@ public: CPPUNIT_TEST(testTdf95640_ods_to_xlsx_with_standard_list); CPPUNIT_TEST(testTdf95640_xlsx_to_xlsx); CPPUNIT_TEST(testDateAutofilterXLSX); + CPPUNIT_TEST(testAutofilterColorsODF); CPPUNIT_TEST(testRefStringXLSX); CPPUNIT_TEST(testRefStringConfigXLSX); @@ -4611,6 +4613,20 @@ void ScExportTest::testDateAutofilterXLSX() xDocSh->DoClose(); } +void ScExportTest::testAutofilterColorsODF() +{ + ScDocShellRef xDocSh = loadDoc(u"autofilter-colors.", FORMAT_ODS); + CPPUNIT_ASSERT(xDocSh.is()); + + xmlDocUniquePtr pDoc = XPathHelper::parseExport2(*this, *xDocSh, m_xSFactory, "content.xml", FORMAT_ODS); + CPPUNIT_ASSERT(pDoc); + + assertXPath(pDoc, "//table:filter/table:filter-and/table:filter-condition[1]", "value", "#e8f2a1"); + assertXPath(pDoc, "//table:filter/table:filter-and/table:filter-condition[1][@loext:data-type='background-color']"); + assertXPath(pDoc, "//table:filter/table:filter-and/table:filter-condition[2]", "value", "#3465a4"); + assertXPath(pDoc, "//table:filter/table:filter-and/table:filter-condition[2][@loext:data-type='text-color']"); +} + void ScExportTest::testTdf88657ODS() { ScDocShellRef xDocSh = loadDoc(u"tdf88657.", FORMAT_ODS); diff --git a/sc/source/filter/xml/XMLExportDatabaseRanges.cxx b/sc/source/filter/xml/XMLExportDatabaseRanges.cxx index d329bdf2385f..c3f651e5416b 100644 --- a/sc/source/filter/xml/XMLExportDatabaseRanges.cxx +++ b/sc/source/filter/xml/XMLExportDatabaseRanges.cxx @@ -448,10 +448,6 @@ private: return; } - mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FIELD_NUMBER, OUString::number(rEntry.nField - nFieldStart)); - if (bCaseSens) - mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CASE_SENSITIVE, XML_TRUE); - if (rItems.size() == 1) { // Single item condition. @@ -463,6 +459,22 @@ private: mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_TYPE, XML_TEXT); mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString.getString()); } + else if (rItem.meType == ScQueryEntry::ByTextColor + || rItem.meType == ScQueryEntry::ByBackgroundColor) + { + if (mrExport.getSaneDefaultVersion() & SvtSaveOptions::ODFSVER_EXTENDED) + { + if (rItem.meType == ScQueryEntry::ByTextColor) + mrExport.AddAttribute(XML_NAMESPACE_LO_EXT, XML_DATA_TYPE, XML_TEXT_COLOR); + else + mrExport.AddAttribute(XML_NAMESPACE_LO_EXT, XML_DATA_TYPE, + XML_BACKGROUND_COLOR); + } + + OUStringBuffer buffer; + sax::Converter::convertColor(buffer, rItem.maColor); + mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, buffer.makeStringAndClear()); + } else { mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_DATA_TYPE, XML_NUMBER); @@ -472,6 +484,9 @@ private: } mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_OPERATOR, getOperatorXML(rEntry, eSearchType)); + mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FIELD_NUMBER, OUString::number(rEntry.nField - nFieldStart)); + if (bCaseSens) + mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CASE_SENSITIVE, XML_TRUE); SvXMLElementExport aElemC(mrExport, XML_NAMESPACE_TABLE, XML_FILTER_CONDITION, true, true); } else @@ -495,6 +510,9 @@ private: mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_VALUE, rItem.maString.getString()); } mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_OPERATOR, OUString("=")); + mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_FIELD_NUMBER, OUString::number(rEntry.nField - nFieldStart)); + if (bCaseSens) + mrExport.AddAttribute(XML_NAMESPACE_TABLE, XML_CASE_SENSITIVE, XML_TRUE); SvXMLElementExport aElemC(mrExport, XML_NAMESPACE_TABLE, XML_FILTER_CONDITION, true, true); std::for_each(rItems.begin(), rItems.end(), WriteSetItem(mrExport, mpDoc)); diff --git a/sc/source/filter/xml/xmlfilti.cxx b/sc/source/filter/xml/xmlfilti.cxx index 7e22395a90d9..3990849cf6a4 100644 --- a/sc/source/filter/xml/xmlfilti.cxx +++ b/sc/source/filter/xml/xmlfilti.cxx @@ -26,6 +26,7 @@ #include <document.hxx> #include <o3tl/safeint.hxx> +#include <sax/tools/converter.hxx> #include <svl/sharedstringpool.hxx> #include <xmloff/xmltoken.hxx> #include <xmloff/xmlnamespace.hxx> @@ -304,6 +305,7 @@ ScXMLConditionContext::ScXMLConditionContext( } break; case XML_ELEMENT( TABLE, XML_DATA_TYPE ): + case XML_ELEMENT( LO_EXT, XML_DATA_TYPE ): { sDataType = aIter.toString(); } @@ -425,6 +427,13 @@ void SAL_CALL ScXMLConditionContext::endFastElement( sal_Int32 /*nElement*/ ) rItem.mfVal = sConditionValue.toDouble(); rItem.meType = ScQueryEntry::ByValue; } + else if (IsXMLToken(sDataType, XML_TEXT_COLOR) + || IsXMLToken(sDataType, XML_BACKGROUND_COLOR)) + { + rItem.meType = IsXMLToken(sDataType, XML_TEXT_COLOR) ? ScQueryEntry::ByTextColor + : ScQueryEntry::ByBackgroundColor; + sax::Converter::convertColor(rItem.maColor, sConditionValue); + } else { svl::SharedStringPool& rPool = GetScImport().GetDocument()->GetSharedStringPool(); |