26 #include <rtl/math.hxx>
27 #include <osl/diagnose.h>
30 #include <document.hxx>
43 #include <com/sun/star/sheet/DataImportMode.hpp>
44 #include <com/sun/star/sheet/DataPilotFieldReference.hpp>
45 #include <com/sun/star/sheet/DataPilotFieldReferenceType.hpp>
46 #include <com/sun/star/sheet/DataPilotFieldReferenceItemType.hpp>
47 #include <com/sun/star/sheet/DataPilotFieldSortInfo.hpp>
48 #include <com/sun/star/sheet/DataPilotFieldAutoShowInfo.hpp>
49 #include <com/sun/star/sheet/DataPilotFieldLayoutInfo.hpp>
50 #include <com/sun/star/sheet/DataPilotFieldShowItemsMode.hpp>
51 #include <com/sun/star/sheet/DataPilotFieldSortMode.hpp>
52 #include <com/sun/star/sheet/DataPilotFieldLayoutMode.hpp>
53 #include <com/sun/star/sheet/DataPilotFieldGroupBy.hpp>
54 #include <com/sun/star/sheet/GeneralFunction2.hpp>
72 switch (aFilterOperator)
105 OSL_FAIL(
"This FilterOperator is not supported.");
114 if (bIsCaseSensitive)
147 if (nQueryEntryCount <= 0)
152 bool bHasEntries(
true);
156 for ( j = 0; (j < nQueryEntryCount) && bHasEntries; ++j)
173 nQueryEntryCount = nEntries;
174 if (!nQueryEntryCount)
178 (static_cast<SCCOLROW>(aQueryParam.
nCol1) == static_cast<SCCOLROW>(aQueryParam.
nRow1)) &&
183 OUString sConditionRange;
185 if (!sConditionRange.isEmpty())
192 if (nQueryEntryCount == 1)
196 else if (bOr && !bAnd)
199 for (j = 0; j < nQueryEntryCount; ++j)
204 else if (bAnd && !bOr)
207 for (j = 0; j < nQueryEntryCount; ++j)
217 bool bOpenAndElement;
219 if (aConnection ==
SC_AND)
222 bOpenAndElement =
true;
225 bOpenAndElement =
false;
226 for (j = 1; j < nQueryEntryCount; ++j)
234 bOpenAndElement =
true;
236 aPrevFilterField = aQueryParam.
GetEntry(j);
237 if (j == nQueryEntryCount - 1)
241 bOpenAndElement =
false;
247 aPrevFilterField = aQueryParam.
GetEntry(j);
251 bOpenAndElement =
false;
253 if (j == nQueryEntryCount - 1)
262 aPrevFilterField = aQueryParam.
GetEntry(j);
263 if (j == nQueryEntryCount - 1)
276 switch (pRef->ReferenceType)
281 case sheet::DataPilotFieldReferenceType::ITEM_DIFFERENCE :
284 case sheet::DataPilotFieldReferenceType::ITEM_PERCENTAGE :
287 case sheet::DataPilotFieldReferenceType::ITEM_PERCENTAGE_DIFFERENCE :
290 case sheet::DataPilotFieldReferenceType::RUNNING_TOTAL :
293 case sheet::DataPilotFieldReferenceType::ROW_PERCENTAGE :
296 case sheet::DataPilotFieldReferenceType::COLUMN_PERCENTAGE :
299 case sheet::DataPilotFieldReferenceType::TOTAL_PERCENTAGE :
302 case sheet::DataPilotFieldReferenceType::INDEX :
306 if (!sValueStr.isEmpty())
309 if (!pRef->ReferenceField.isEmpty())
312 if (pRef->ReferenceItemType == sheet::DataPilotFieldReferenceItemType::NAMED)
320 switch(pRef->ReferenceItemType)
322 case sheet::DataPilotFieldReferenceItemType::PREVIOUS :
325 case sheet::DataPilotFieldReferenceItemType::NEXT :
329 if (!sValueStr.isEmpty())
339 const sheet::DataPilotFieldSortInfo* pSortInfo = pDim->
GetSortInfo();
343 if (pSortInfo->IsAscending)
349 switch (pSortInfo->Mode)
354 case sheet::DataPilotFieldSortMode::MANUAL:
357 case sheet::DataPilotFieldSortMode::NAME:
360 case sheet::DataPilotFieldSortMode::DATA:
362 if (!pSortInfo->Field.isEmpty())
366 if (!sValueStr.isEmpty())
373 const sheet::DataPilotFieldAutoShowInfo* pAutoInfo = pDim->
GetAutoShowInfo();
377 if (pAutoInfo->IsEnabled)
383 switch (pAutoInfo->ShowItemsMode)
385 case sheet::DataPilotFieldShowItemsMode::FROM_TOP:
388 case sheet::DataPilotFieldShowItemsMode::FROM_BOTTOM:
392 if (!sValueStr.isEmpty())
404 const sheet::DataPilotFieldLayoutInfo* pLayoutInfo = pDim->
GetLayoutInfo();
408 if (pLayoutInfo->AddEmptyLines)
414 switch (pLayoutInfo->LayoutMode)
416 case sheet::DataPilotFieldLayoutMode::TABULAR_LAYOUT:
419 case sheet::DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_TOP:
422 case sheet::DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_BOTTOM:
426 if (!sValueStr.isEmpty())
434 std::optional<OUString> pLayoutName;
439 if (nSubTotalCount <= 0)
444 for (sal_Int32 nSubTotal = 0; nSubTotal < nSubTotalCount; nSubTotal++)
447 sal_Int16 nFunc =
static_cast<sal_Int16
>(pDim->
GetSubTotalFunc(nSubTotal));
450 if (pLayoutName && nFunc == sheet::GeneralFunction2::AUTO)
459 if (rMembers.empty())
464 for (
const auto& rpMember : rMembers)
471 const std::optional<OUString> & pLayoutName = rpMember->GetLayoutName();
476 OUStringBuffer sBuffer;
491 OUStringBuffer sBuffer;
497 OUStringBuffer sBuffer;
515 case css::sheet::DataPilotFieldGroupBy::SECONDS :
520 case css::sheet::DataPilotFieldGroupBy::MINUTES :
525 case css::sheet::DataPilotFieldGroupBy::HOURS :
530 case css::sheet::DataPilotFieldGroupBy::DAYS :
535 case css::sheet::DataPilotFieldGroupBy::MONTHS :
540 case css::sheet::DataPilotFieldGroupBy::QUARTERS :
545 case css::sheet::DataPilotFieldGroupBy::YEARS :
555 OSL_ENSURE(rGroupInfo.
mbEnable,
"group dimension should be enabled");
562 OUStringBuffer sDate;
570 OUStringBuffer sDate;
581 OUString sValue( ::rtl::math::doubleToUString( rGroupInfo.
mfStart,
582 rtl_math_StringFormat_Automatic,
583 rtl_math_DecimalPlaces_Max,
'.',
true));
590 OUString sValue( ::rtl::math::doubleToUString( rGroupInfo.
mfEnd,
591 rtl_math_StringFormat_Automatic,
592 rtl_math_DecimalPlaces_Max,
'.',
true));
596 OUString sValue( ::rtl::math::doubleToUString( rGroupInfo.
mfStep,
597 rtl_math_StringFormat_Automatic,
598 rtl_math_DecimalPlaces_Max,
'.',
true));
643 OSL_ENSURE((!pGroupDim || !pNumGroupDim),
"there should be no NumGroup and Group at the same field");
645 if (!(pGroupDim || pNumGroupDim))
656 for (sal_Int32
i = 0;
i < nCount; ++
i)
662 for(sal_Int32 j = 0; j < nElemCount; ++j)
681 const std::optional<OUString> & pLayoutName = pDim->
GetLayoutName();
689 sheet::DataPilotFieldOrientation eOrientation = pDim->
GetOrientation();
692 if( !sValueStr.isEmpty() )
701 if (eOrientation == sheet::DataPilotFieldOrientation_PAGE)
713 if( pDim->
GetOrientation() != sheet::DataPilotFieldOrientation_DATA )
720 for (
auto const& iter : rDimensions)
753 for (
size_t i = 0;
i < nDPCount; ++
i)
759 ScRange aOutRange((*pDPs)[
i].GetOutRange());
760 OUString sTargetRangeAddress;
767 OUString sOUButtonList;
768 const ScPatternAttr* pAttr = aAttrItr.GetNext(nCol, nRow1, nRow2);
774 for (
SCROW nButtonRow = nRow1; nButtonRow <= nRow2; ++nButtonRow)
781 pAttr = aAttrItr.GetNext(nCol, nRow1, nRow2);
783 OUString
sName((*pDPs)[
i].GetName());
784 OUString sApplicationData((*pDPs)[
i].GetTag());
791 if (!(bRowGrand && bColumnGrand))
795 else if (bColumnGrand)
808 if ((*pDPs)[
i].GetHeaderLayout())
819 if (bRowGrand && bColumnGrand)
831 if ((*pDPs)[
i].IsSheetData())
846 OUString sCellRangeAddress;
856 else if ((*pDPs)[
i].IsImportData())
859 switch (pImpSource->
nType)
861 case sheet::DataImportMode_NONE :
break;
862 case sheet::DataImportMode_QUERY :
870 case sheet::DataImportMode_TABLE :
878 case sheet::DataImportMode_SQL :
891 else if ((*pDPs)[
i].IsServiceData())
const ScDPDimensionSaveData * GetExistingDimensionData() const
const std::optional< OUString > & GetLayoutName() const
XML_DATA_PILOT_GRAND_TOTAL
OUString getString() const
This class has to do with handling exclusively grouped dimensions? TODO: Find out what this class doe...
SC_DLLPUBLIC size_t GetCount() const
SC_DLLPUBLIC const std::optional< OUString > & GetGrandTotalName() const
void WriteGroupDimAttributes(const ScDPSaveGroupDimension *pGroupDim)
const Item & GetQueryItem() const
const MemberList & GetMembers() const
static void GetStringFromRange(OUString &rString, const ScRange &rRange, const ScDocument *pDocument, formula::FormulaGrammar::AddressConvention eConv, sal_Unicode cSeparator= ' ', bool bAppendStr=false, ScRefFlags nFormatFlags=ScRefFlags::VALID|ScRefFlags::TAB_3D)
css::sheet::DataPilotFieldOrientation GetOrientation() const
void WriteLevels(const ScDPSaveDimension *pDim)
const SvXMLUnitConverter & GetMM100UnitConverter() const
ScGeneralFunction GetSubTotalFunc(tools::Long nIndex) const
const css::sheet::DataPilotFieldLayoutInfo * GetLayoutInfo() const
Classes to save Data Pilot settings that create new dimensions (fields).
const OUString & GetGroupName() const
bool HasPivotButton() const
SC_DLLPUBLIC ScDPCollection * GetDPCollection()
void WriteDatePart(sal_Int32 nPart)
const OUString & GetSourceDimName() const
XML_DATABASE_SOURCE_QUERY
void WriteSortInfo(const ScDPSaveDimension *pDim)
void WriteDimensions(const ScDPSaveData *pDPSave)
constexpr sal_uInt16 XML_NAMESPACE_LO_EXT
sal_Int32 GetDatePart() const
bool IsQueryByEmpty() const
bool IsDataLayout() const
const ScDPNumGroupInfo & GetDateInfo() const
static void GetStringFromAddress(OUString &rString, const ScAddress &rAddress, const ScDocument *pDocument, formula::FormulaGrammar::AddressConvention eConv, sal_Unicode cSeparator= ' ', bool bAppendStr=false, ScRefFlags nFormatFlags=ScRefFlags::VALID|ScRefFlags::TAB_3D)
Range to String core.
constexpr sal_uInt16 XML_NAMESPACE_CALC_EXT
tools::Long GetUsedHierarchy() const
const ScDPSaveGroupDimension * GetNamedGroupDim(const OUString &rGroupDimName) const
size_t SCSIZE
size_t typedef to be able to find places where code was changed from USHORT to size_t and is used to ...
void WriteGrandTotal(::xmloff::token::XMLTokenEnum eOrient, bool bVisible, const std::optional< OUString > &pGrandTotal)
XML_OUTLINE_SUBTOTALS_TOP
SC_DLLPUBLIC SCSIZE GetEntryCount() const
void AddAttribute(sal_uInt16 nPrefix, const char *pName, const OUString &rValue)
void StartElement(sal_uInt16 nPrefix, enum::xmloff::token::XMLTokenEnum eName, bool bIgnWSOutside)
SC_DLLPUBLIC const ScQueryEntry & GetEntry(SCSIZE n) const
SC_DLLPUBLIC const ScRange & GetSourceRange() const
Get the range that contains the source data.
ScGeneralFunction GetFunction() const
bool HasShowEmpty() const
bool GetIgnoreEmptyRows() const
sal_Int32 GetDatePart() const
size_t GetElementCount() const
void WriteMembers(const ScDPSaveDimension *pDim)
std::vector< ScDPSaveMember * > MemberList
bool GetRepeatItemLabels() const
const SfxPoolItem & GetItem(sal_uInt16 nWhichP) const
const ScQueryParam & GetQueryParam() const
bool GetDrillDown() const
tools::Long GetGroupCount() const
SvtSaveOptions::ODFSaneDefaultVersion getSaneDefaultVersion() const
const ScDPSaveGroupItem & GetGroupByIndex(tools::Long nIndex) const
const css::sheet::DataPilotFieldSortInfo * GetSortInfo() const
constexpr sal_uInt16 XML_NAMESPACE_TABLE_EXT
tools::Long GetSubTotalsCount() const
void WriteDPFilter(const ScQueryParam &aQueryParam)
const OUString * GetElementByIndex(size_t nIndex) const
void WriteFieldReference(const ScDPSaveDimension *pDim)
void WriteAutoShowInfo(const ScDPSaveDimension *pDim)
Represents a group dimension that introduces a new hierarchy for an existing dimension.
bool IsQueryByNonEmpty() const
XML_DRILL_DOWN_ON_DOUBLE_CLICK
void WriteNumGroupInfo(const ScDPNumGroupInfo &pGroupInfo)
static SC_DLLPUBLIC OUString getSourceDimensionName(const OUString &rName)
XML_DATA_PILOT_GROUP_MEMBER
void convertDateTime(OUStringBuffer &rBuffer, const double &fDateTime, bool const bAddTimeIf0AM=false)
XML_MEMBER_PERCENTAGE_DIFFERENCE
bool GetRepeatIfEmpty() const
const ScDPNumGroupInfo & GetDateInfo() const
OUString GetQNameByKey(sal_uInt16 nKey, const OUString &rLocalName, bool bCache=true) const
void WriteSubTotals(const ScDPSaveDimension *pDim)
OUString GetCurrentPage() const
svl::SharedString maString
const SvXMLNamespaceMap & GetNamespaceMap() const
const std::optional< OUString > & GetSubtotalName() const
bool GetFilterButton() const
static bool convertBool(bool &rBool, std::u16string_view rString)
css::sheet::DataImportMode nType
bool HasRangeName() const
bool GetColumnGrand() const
ScDocument * GetDocument()
constexpr TypedWhichId< ScMergeFlagAttr > ATTR_MERGE_FLAG(145)
void WriteGroupDimElements(const ScDPSaveDimension *pDim, const ScDPDimensionSaveData *pDimData)
constexpr sal_uInt16 XML_NAMESPACE_TABLE
const DimsType & GetDimensions() const
void EndElement(sal_uInt16 nPrefix, enum::xmloff::token::XMLTokenEnum eName, bool bIgnWSInside)
const OUString & GetXMLToken(enum XMLTokenEnum eToken)
void WriteDimension(const ScDPSaveDimension *pDim, const ScDPDimensionSaveData *pDimData)
bool GetShowEmpty() const
const OUString & GetName() const
std::vector< std::unique_ptr< ScDPSaveDimension > > DimsType
Represents a new group dimension whose dimension ID is higher than the highest source dimension ID...
const OUString & GetRangeName() const
const css::sheet::DataPilotFieldAutoShowInfo * GetAutoShowInfo() const
XML_DATA_PILOT_FIELD_REFERENCE
ScXMLExportDataPilot(ScXMLExport &rExport)
XML_OUTLINE_SUBTOTALS_BOTTOM
const ScDPNumGroupInfo & GetInfo() const
XML_CONDITION_SOURCE_RANGE_ADDRESS
static void GetStringFromFunction(OUString &rString, const sal_Int16 eFunction)
void WriteNumGroupDim(const ScDPSaveNumGroupDimension *pNumGroupDim)
const ScDPSaveNumGroupDimension * GetNumGroupDim(const OUString &rGroupDimName) const
void WriteLayoutInfo(const ScDPSaveDimension *pDim)
static OUString getDPOperatorXML(const ScQueryOp aFilterOperator, const utl::SearchParam::SearchType eSearchType)
css::uno::Any const SvXMLExport & rExport
This class contains authoritative information on the internal reference used as the data source for d...
XML_DATA_PILOT_DISPLAY_INFO
XML_DATABASE_SOURCE_TABLE
Each instance of this struct represents a single filtering criteria.
void WriteDPCondition(const ScQueryEntry &aQueryEntry, bool bIsCaseSensitive, utl::SearchParam::SearchType eSearchType)
utl::SearchParam::SearchType eSearchType
const css::sheet::DataPilotFieldReference * GetReferenceValue() const
XML_DATA_PILOT_LAYOUT_INFO
static void GetStringFromOrientation(OUString &rString, const css::sheet::DataPilotFieldOrientation eOrientation)