1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir #include "oox/xls/pivottablebuffer.hxx" 29*cdf0e10cSrcweir 30*cdf0e10cSrcweir #include <set> 31*cdf0e10cSrcweir #include <com/sun/star/container/XIndexAccess.hpp> 32*cdf0e10cSrcweir #include <com/sun/star/container/XNameAccess.hpp> 33*cdf0e10cSrcweir #include <com/sun/star/sheet/CellFlags.hpp> 34*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldAutoShowInfo.hpp> 35*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldLayoutInfo.hpp> 36*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldLayoutMode.hpp> 37*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldOrientation.hpp> 38*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldReference.hpp> 39*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldReferenceItemType.hpp> 40*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldReferenceType.hpp> 41*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldShowItemsMode.hpp> 42*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldSortInfo.hpp> 43*cdf0e10cSrcweir #include <com/sun/star/sheet/DataPilotFieldSortMode.hpp> 44*cdf0e10cSrcweir #include <com/sun/star/sheet/GeneralFunction.hpp> 45*cdf0e10cSrcweir #include <com/sun/star/sheet/XDataPilotDataLayoutFieldSupplier.hpp> 46*cdf0e10cSrcweir #include <com/sun/star/sheet/XDataPilotField.hpp> 47*cdf0e10cSrcweir #include <com/sun/star/sheet/XDataPilotTablesSupplier.hpp> 48*cdf0e10cSrcweir #include <com/sun/star/sheet/XSheetOperation.hpp> 49*cdf0e10cSrcweir #include "oox/helper/attributelist.hxx" 50*cdf0e10cSrcweir #include "oox/helper/containerhelper.hxx" 51*cdf0e10cSrcweir #include "oox/helper/propertyset.hxx" 52*cdf0e10cSrcweir #include "oox/xls/addressconverter.hxx" 53*cdf0e10cSrcweir #include "oox/xls/biffinputstream.hxx" 54*cdf0e10cSrcweir 55*cdf0e10cSrcweir namespace oox { 56*cdf0e10cSrcweir namespace xls { 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir // ============================================================================ 59*cdf0e10cSrcweir 60*cdf0e10cSrcweir using namespace ::com::sun::star::container; 61*cdf0e10cSrcweir using namespace ::com::sun::star::sheet; 62*cdf0e10cSrcweir using namespace ::com::sun::star::table; 63*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 64*cdf0e10cSrcweir 65*cdf0e10cSrcweir using ::rtl::OUString; 66*cdf0e10cSrcweir 67*cdf0e10cSrcweir // ============================================================================ 68*cdf0e10cSrcweir 69*cdf0e10cSrcweir namespace { 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir const sal_Int32 OOX_PT_DATALAYOUTFIELD = -2; /// Placeholder index of data layout field. 72*cdf0e10cSrcweir 73*cdf0e10cSrcweir const sal_Int32 OOX_PT_PREVIOUS_ITEM = 0x001000FC; /// Calculation of data item result is based on previous item. 74*cdf0e10cSrcweir const sal_Int32 OOX_PT_NEXT_ITEM = 0x001000FD; /// Calculation of data item result is based on next item. 75*cdf0e10cSrcweir 76*cdf0e10cSrcweir // ---------------------------------------------------------------------------- 77*cdf0e10cSrcweir 78*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_DATAFIELD = 0x00000008; 79*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_DEFAULT = 0x00000100; 80*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_SUM = 0x00000200; 81*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_COUNTA = 0x00000400; 82*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_AVERAGE = 0x00000800; 83*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_MAX = 0x00001000; 84*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_MIN = 0x00002000; 85*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_PRODUCT = 0x00004000; 86*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_COUNT = 0x00008000; 87*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_STDDEV = 0x00010000; 88*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_STDDEVP = 0x00020000; 89*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_VAR = 0x00040000; 90*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_VARP = 0x00080000; 91*cdf0e10cSrcweir 92*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_SHOWALL = 0x00000020; 93*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_OUTLINE = 0x00000040; 94*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_INSERTBLANKROW = 0x00000080; 95*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_SUBTOTALTOP = 0x00000100; 96*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_INSERTPAGEBREAK = 0x00000800; 97*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_AUTOSORT = 0x00001000; 98*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_SORTASCENDING = 0x00002000; 99*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_AUTOSHOW = 0x00004000; 100*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_AUTOSHOWTOP = 0x00008000; 101*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTFIELD_MULTIPAGEITEMS = 0x00080000; 102*cdf0e10cSrcweir 103*cdf0e10cSrcweir const sal_uInt16 BIFF12_PTFITEM_HIDDEN = 0x0001; 104*cdf0e10cSrcweir const sal_uInt16 BIFF12_PTFITEM_HIDEDETAILS = 0x0002; 105*cdf0e10cSrcweir 106*cdf0e10cSrcweir const sal_uInt8 BIFF12_PTPAGEFIELD_HASNAME = 0x01; 107*cdf0e10cSrcweir const sal_uInt8 BIFF12_PTPAGEFIELD_HASOLAPCAPTION = 0x02; 108*cdf0e10cSrcweir const sal_Int32 BIFF12_PTPAGEFIELD_MULTIITEMS = 0x001000FE; 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir const sal_uInt16 BIFF12_PTFILTER_HASNAME = 0x0001; 111*cdf0e10cSrcweir const sal_uInt16 BIFF12_PTFILTER_HASDESCRIPTION = 0x0002; 112*cdf0e10cSrcweir const sal_uInt16 BIFF12_PTFILTER_HASSTRVALUE1 = 0x0004; 113*cdf0e10cSrcweir const sal_uInt16 BIFF12_PTFILTER_HASSTRVALUE2 = 0x0008; 114*cdf0e10cSrcweir 115*cdf0e10cSrcweir const sal_uInt8 BIFF12_TOP10FILTER_TOP = 0x01; 116*cdf0e10cSrcweir const sal_uInt8 BIFF12_TOP10FILTER_PERCENT = 0x02; 117*cdf0e10cSrcweir 118*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_SHOWITEMS = 0x00000100; 119*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_DISABLEFIELDLIST = 0x00000400; 120*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HIDECALCMEMBERS = 0x00001000; 121*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_WITHHIDDENTOTALS = 0x00002000; 122*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HIDEDRILL = 0x00100000; 123*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_PRINTDRILL = 0x00200000; 124*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HIDEHEADERS = 0x80000000; 125*cdf0e10cSrcweir 126*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_SHOWEMPTYROW = 0x00000004; 127*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_SHOWEMPTYCOL = 0x00000008; 128*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_ENABLEDRILL = 0x00000020; 129*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_PRESERVEFORMATTING = 0x00000080; 130*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_USEAUTOFORMAT = 0x00000100; 131*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_SHOWERROR = 0x00000200; 132*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_SHOWMISSING = 0x00000400; 133*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_PAGEOVERTHENDOWN = 0x00000800; 134*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_SUBTOTALHIDDENITEMS = 0x00001000; 135*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_ROWGRANDTOTALS = 0x00002000; 136*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_COLGRANDTOTALS = 0x00004000; 137*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_FIELDPRINTTITLES = 0x00008000; 138*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_ITEMPRINTTITLES = 0x00020000; 139*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_MERGEITEM = 0x00040000; 140*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HASDATACAPTION = 0x00080000; 141*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HASGRANDTOTALCAPTION = 0x00100000; 142*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HASPAGESTYLE = 0x00200000; 143*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HASPIVOTTABLESTYLE = 0x00400000; 144*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HASVACATEDSTYLE = 0x00800000; 145*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_APPLYNUMFMT = 0x01000000; 146*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_APPLYFONT = 0x02000000; 147*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_APPLYALIGNMENT = 0x04000000; 148*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_APPLYBORDER = 0x08000000; 149*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_APPLYFILL = 0x10000000; 150*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_APPLYPROTECTION = 0x20000000; 151*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HASTAG = 0x40000000; 152*cdf0e10cSrcweir 153*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_NOERRORCAPTION = 0x00000040; 154*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_NOMISSINGCAPTION = 0x00000080; 155*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HASROWHEADERCAPTION = 0x00000400; 156*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_HASCOLHEADERCAPTION = 0x00000800; 157*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_FIELDLISTSORTASC = 0x00001000; 158*cdf0e10cSrcweir const sal_uInt32 BIFF12_PTDEF_NOCUSTOMLISTSORT = 0x00004000; 159*cdf0e10cSrcweir 160*cdf0e10cSrcweir const sal_uInt8 BIFF12_PTDEF_ROWAXIS = 1; 161*cdf0e10cSrcweir const sal_uInt8 BIFF12_PTDEF_COLAXIS = 2; 162*cdf0e10cSrcweir 163*cdf0e10cSrcweir // ---------------------------------------------------------------------------- 164*cdf0e10cSrcweir 165*cdf0e10cSrcweir const sal_uInt16 BIFF_PT_NOSTRING = 0xFFFF; 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_DATAFIELD = 0x0008; 168*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_DEFAULT = 0x0001; 169*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_SUM = 0x0002; 170*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_COUNTA = 0x0004; 171*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_AVERAGE = 0x0008; 172*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_MAX = 0x0010; 173*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_MIN = 0x0020; 174*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_PRODUCT = 0x0040; 175*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_COUNT = 0x0080; 176*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_STDDEV = 0x0100; 177*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_STDDEVP = 0x0200; 178*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_VAR = 0x0400; 179*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFIELD_VARP = 0x0800; 180*cdf0e10cSrcweir 181*cdf0e10cSrcweir const sal_uInt32 BIFF_PTFIELD2_SHOWALL = 0x00000001; 182*cdf0e10cSrcweir const sal_uInt32 BIFF_PTFIELD2_AUTOSORT = 0x00000200; 183*cdf0e10cSrcweir const sal_uInt32 BIFF_PTFIELD2_SORTASCENDING = 0x00000400; 184*cdf0e10cSrcweir const sal_uInt32 BIFF_PTFIELD2_AUTOSHOW = 0x00000800; 185*cdf0e10cSrcweir const sal_uInt32 BIFF_PTFIELD2_AUTOSHOWTOP = 0x00001000; 186*cdf0e10cSrcweir const sal_uInt32 BIFF_PTFIELD2_OUTLINE = 0x00200000; 187*cdf0e10cSrcweir const sal_uInt32 BIFF_PTFIELD2_INSERTBLANKROW = 0x00400000; 188*cdf0e10cSrcweir const sal_uInt32 BIFF_PTFIELD2_SUBTOTALTOP = 0x00800000; 189*cdf0e10cSrcweir 190*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFITEM_HIDDEN = 0x0001; 191*cdf0e10cSrcweir const sal_uInt16 BIFF_PTFITEM_HIDEDETAILS = 0x0002; 192*cdf0e10cSrcweir 193*cdf0e10cSrcweir const sal_uInt16 BIFF_PTDEF_ROWGRANDTOTALS = 0x0001; 194*cdf0e10cSrcweir const sal_uInt16 BIFF_PTDEF_COLGRANDTOTALS = 0x0002; 195*cdf0e10cSrcweir 196*cdf0e10cSrcweir const sal_uInt8 BIFF_PTDEF_ROWAXIS = 1; 197*cdf0e10cSrcweir const sal_uInt8 BIFF_PTDEF_COLAXIS = 2; 198*cdf0e10cSrcweir 199*cdf0e10cSrcweir const sal_uInt32 BIFF_PTDEF2_PAGEOVERTHENDOWN = 0x00000001; 200*cdf0e10cSrcweir const sal_uInt32 BIFF_PTDE2F_ENABLEDRILL = 0x00020000; 201*cdf0e10cSrcweir const sal_uInt32 BIFF_PTDEF2_PRESERVEFORMATTING = 0x00080000; 202*cdf0e10cSrcweir const sal_uInt32 BIFF_PTDEF2_MERGEITEM = 0x00100000; 203*cdf0e10cSrcweir const sal_uInt32 BIFF_PTDEF2_SHOWERROR = 0x00200000; 204*cdf0e10cSrcweir const sal_uInt32 BIFF_PTDEF2_SHOWMISSING = 0x00400000; 205*cdf0e10cSrcweir const sal_uInt32 BIFF_PTDEF2_SUBTOTALHIDDENITEMS = 0x00800000; 206*cdf0e10cSrcweir 207*cdf0e10cSrcweir const sal_Int16 BIFF_PTPAGEFIELDS_ALLITEMS = 0x7FFD; 208*cdf0e10cSrcweir 209*cdf0e10cSrcweir const sal_Int16 BIFF_PTDATAFIELD_PREVIOUS = 0x7FFB; 210*cdf0e10cSrcweir const sal_Int16 BIFF_PTDATAFIELD_NEXT = 0x7FFC; 211*cdf0e10cSrcweir 212*cdf0e10cSrcweir // ---------------------------------------------------------------------------- 213*cdf0e10cSrcweir 214*cdf0e10cSrcweir OUString lclReadPivotString( const WorkbookHelper& rHelper, BiffInputStream& rStrm, sal_uInt16 nLen ) 215*cdf0e10cSrcweir { 216*cdf0e10cSrcweir if( nLen == BIFF_PT_NOSTRING ) 217*cdf0e10cSrcweir return OUString(); 218*cdf0e10cSrcweir return (rHelper.getBiff() == BIFF8) ? rStrm.readUniStringBody( nLen ) : rStrm.readCharArrayUC( nLen, rHelper.getTextEncoding() ); 219*cdf0e10cSrcweir } 220*cdf0e10cSrcweir 221*cdf0e10cSrcweir } // namespace 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir // ============================================================================ 224*cdf0e10cSrcweir 225*cdf0e10cSrcweir PTFieldItemModel::PTFieldItemModel() : 226*cdf0e10cSrcweir mnCacheItem( -1 ), 227*cdf0e10cSrcweir mnType( XML_data ), 228*cdf0e10cSrcweir mbShowDetails( true ), 229*cdf0e10cSrcweir mbHidden( false ) 230*cdf0e10cSrcweir { 231*cdf0e10cSrcweir } 232*cdf0e10cSrcweir 233*cdf0e10cSrcweir void PTFieldItemModel::setBiffType( sal_uInt16 nType ) 234*cdf0e10cSrcweir { 235*cdf0e10cSrcweir static const sal_Int32 spnTypes[] = { XML_data, XML_default, 236*cdf0e10cSrcweir XML_sum, XML_countA, XML_avg, XML_max, XML_min, XML_product, XML_count, 237*cdf0e10cSrcweir XML_stdDev, XML_stdDevP, XML_var, XML_varP, XML_grand, XML_blank }; 238*cdf0e10cSrcweir mnType = STATIC_ARRAY_SELECT( spnTypes, nType, XML_data ); 239*cdf0e10cSrcweir } 240*cdf0e10cSrcweir 241*cdf0e10cSrcweir // ---------------------------------------------------------------------------- 242*cdf0e10cSrcweir 243*cdf0e10cSrcweir PTFieldModel::PTFieldModel() : 244*cdf0e10cSrcweir mnAxis( XML_TOKEN_INVALID ), 245*cdf0e10cSrcweir mnNumFmtId( 0 ), 246*cdf0e10cSrcweir mnAutoShowItems( 10 ), 247*cdf0e10cSrcweir mnAutoShowRankBy( -1 ), 248*cdf0e10cSrcweir mnSortType( XML_manual ), 249*cdf0e10cSrcweir mnSortRefField( -1 ), 250*cdf0e10cSrcweir mnSortRefItem( -1 ), 251*cdf0e10cSrcweir mbDataField( false ), 252*cdf0e10cSrcweir mbDefaultSubtotal( true ), 253*cdf0e10cSrcweir mbSumSubtotal( false ), 254*cdf0e10cSrcweir mbCountASubtotal( false ), 255*cdf0e10cSrcweir mbAverageSubtotal( false ), 256*cdf0e10cSrcweir mbMaxSubtotal( false ), 257*cdf0e10cSrcweir mbMinSubtotal( false ), 258*cdf0e10cSrcweir mbProductSubtotal( false ), 259*cdf0e10cSrcweir mbCountSubtotal( false ), 260*cdf0e10cSrcweir mbStdDevSubtotal( false ), 261*cdf0e10cSrcweir mbStdDevPSubtotal( false ), 262*cdf0e10cSrcweir mbVarSubtotal( false ), 263*cdf0e10cSrcweir mbVarPSubtotal( false ), 264*cdf0e10cSrcweir mbShowAll( true ), 265*cdf0e10cSrcweir mbOutline( true ), 266*cdf0e10cSrcweir mbSubtotalTop( true ), 267*cdf0e10cSrcweir mbInsertBlankRow( false ), 268*cdf0e10cSrcweir mbInsertPageBreak( false ), 269*cdf0e10cSrcweir mbAutoShow( false ), 270*cdf0e10cSrcweir mbTopAutoShow( true ), 271*cdf0e10cSrcweir mbMultiPageItems( false ) 272*cdf0e10cSrcweir { 273*cdf0e10cSrcweir } 274*cdf0e10cSrcweir 275*cdf0e10cSrcweir void PTFieldModel::setBiffAxis( sal_uInt8 nAxis ) 276*cdf0e10cSrcweir { 277*cdf0e10cSrcweir /* Weird. The axis field is organized as bit field, but only one of the 278*cdf0e10cSrcweir row/col/page flags are allowed at the same time and refer to the values 279*cdf0e10cSrcweir 'axisRow', 'axisCol', and 'axisPage' of the XML attribute 280*cdf0e10cSrcweir 'pivotField@axis'. Additionally, the fourth bit determines if the field 281*cdf0e10cSrcweir is a data field, which may appear combined with the row/col/page flags. 282*cdf0e10cSrcweir Therefore, this bit is unrelated to the 'axisValues' value of the 283*cdf0e10cSrcweir 'pivotField@axis' attribute, but refers to the 'pivotField@dataField' 284*cdf0e10cSrcweir boolean attribute. */ 285*cdf0e10cSrcweir static const sal_Int32 spnAxisIds[] = { XML_TOKEN_INVALID, XML_axisRow, XML_axisCol, XML_TOKEN_INVALID, XML_axisPage }; 286*cdf0e10cSrcweir mnAxis = STATIC_ARRAY_SELECT( spnAxisIds, nAxis, XML_TOKEN_INVALID ); 287*cdf0e10cSrcweir } 288*cdf0e10cSrcweir 289*cdf0e10cSrcweir // ---------------------------------------------------------------------------- 290*cdf0e10cSrcweir 291*cdf0e10cSrcweir PTPageFieldModel::PTPageFieldModel() : 292*cdf0e10cSrcweir mnField( -1 ), 293*cdf0e10cSrcweir mnItem( BIFF12_PTPAGEFIELD_MULTIITEMS ) 294*cdf0e10cSrcweir { 295*cdf0e10cSrcweir } 296*cdf0e10cSrcweir 297*cdf0e10cSrcweir // ---------------------------------------------------------------------------- 298*cdf0e10cSrcweir 299*cdf0e10cSrcweir PTDataFieldModel::PTDataFieldModel() : 300*cdf0e10cSrcweir mnField( -1 ), 301*cdf0e10cSrcweir mnSubtotal( XML_sum ), 302*cdf0e10cSrcweir mnShowDataAs( XML_normal ), 303*cdf0e10cSrcweir mnBaseField( -1 ), 304*cdf0e10cSrcweir mnBaseItem( -1 ), 305*cdf0e10cSrcweir mnNumFmtId( 0 ) 306*cdf0e10cSrcweir { 307*cdf0e10cSrcweir } 308*cdf0e10cSrcweir 309*cdf0e10cSrcweir void PTDataFieldModel::setBiffSubtotal( sal_Int32 nSubtotal ) 310*cdf0e10cSrcweir { 311*cdf0e10cSrcweir static sal_Int32 spnSubtotals[] = { XML_sum, XML_count, XML_average, XML_max, XML_min, XML_product, XML_countNums, XML_stdDev, XML_stdDevp, XML_var, XML_varp }; 312*cdf0e10cSrcweir mnSubtotal = STATIC_ARRAY_SELECT( spnSubtotals, nSubtotal, XML_TOKEN_INVALID ); 313*cdf0e10cSrcweir } 314*cdf0e10cSrcweir 315*cdf0e10cSrcweir void PTDataFieldModel::setBiffShowDataAs( sal_Int32 nShowDataAs ) 316*cdf0e10cSrcweir { 317*cdf0e10cSrcweir static sal_Int32 spnShowDataAs[] = { XML_normal, XML_difference, XML_percent, XML_percentDiff, XML_runTotal, XML_percentOfRow, XML_percentOfCol, XML_percentOfTotal, XML_index }; 318*cdf0e10cSrcweir mnShowDataAs = STATIC_ARRAY_SELECT( spnShowDataAs, nShowDataAs, XML_TOKEN_INVALID ); 319*cdf0e10cSrcweir } 320*cdf0e10cSrcweir 321*cdf0e10cSrcweir // ---------------------------------------------------------------------------- 322*cdf0e10cSrcweir 323*cdf0e10cSrcweir PivotTableField::PivotTableField( PivotTable& rPivotTable, sal_Int32 nFieldIndex ) : 324*cdf0e10cSrcweir WorkbookHelper( rPivotTable ), 325*cdf0e10cSrcweir mrPivotTable( rPivotTable ), 326*cdf0e10cSrcweir mnFieldIndex( nFieldIndex ) 327*cdf0e10cSrcweir { 328*cdf0e10cSrcweir } 329*cdf0e10cSrcweir 330*cdf0e10cSrcweir void PivotTableField::importPivotField( const AttributeList& rAttribs ) 331*cdf0e10cSrcweir { 332*cdf0e10cSrcweir /* The documentation mentions a value 'axisValues' for the attribute 333*cdf0e10cSrcweir 'pivotField@axis'. But this value is not used to mark a data field, as 334*cdf0e10cSrcweir data fields may be inserted in one of the row/column/page dimensions at 335*cdf0e10cSrcweir the same time. Therefore, the boolean attribute 'pivotField@dataField' 336*cdf0e10cSrcweir is really used to mark data fields. */ 337*cdf0e10cSrcweir maModel.mnAxis = rAttribs.getToken( XML_axis, XML_TOKEN_INVALID ); 338*cdf0e10cSrcweir maModel.mnNumFmtId = rAttribs.getInteger( XML_numFmtId, 0 ); 339*cdf0e10cSrcweir maModel.mnAutoShowItems = rAttribs.getInteger( XML_itemPageCount, 10 ); 340*cdf0e10cSrcweir maModel.mnAutoShowRankBy = rAttribs.getInteger( XML_rankBy, -1 ); 341*cdf0e10cSrcweir maModel.mnSortType = rAttribs.getToken( XML_sortType, XML_manual ); 342*cdf0e10cSrcweir maModel.mbDataField = rAttribs.getBool( XML_dataField, false ); 343*cdf0e10cSrcweir maModel.mbDefaultSubtotal = rAttribs.getBool( XML_defaultSubtotal, true ); 344*cdf0e10cSrcweir maModel.mbSumSubtotal = rAttribs.getBool( XML_sumSubtotal, false ); 345*cdf0e10cSrcweir maModel.mbCountASubtotal = rAttribs.getBool( XML_countASubtotal, false ); 346*cdf0e10cSrcweir maModel.mbAverageSubtotal = rAttribs.getBool( XML_avgSubtotal, false ); 347*cdf0e10cSrcweir maModel.mbMaxSubtotal = rAttribs.getBool( XML_maxSubtotal, false ); 348*cdf0e10cSrcweir maModel.mbMinSubtotal = rAttribs.getBool( XML_minSubtotal, false ); 349*cdf0e10cSrcweir maModel.mbProductSubtotal = rAttribs.getBool( XML_productSubtotal, false ); 350*cdf0e10cSrcweir maModel.mbCountSubtotal = rAttribs.getBool( XML_countSubtotal, false ); 351*cdf0e10cSrcweir maModel.mbStdDevSubtotal = rAttribs.getBool( XML_stdDevSubtotal, false ); 352*cdf0e10cSrcweir maModel.mbStdDevPSubtotal = rAttribs.getBool( XML_stdDevPSubtotal, false ); 353*cdf0e10cSrcweir maModel.mbVarSubtotal = rAttribs.getBool( XML_varSubtotal, false ); 354*cdf0e10cSrcweir maModel.mbVarPSubtotal = rAttribs.getBool( XML_varPSubtotal, false ); 355*cdf0e10cSrcweir maModel.mbShowAll = rAttribs.getBool( XML_showAll, true ); 356*cdf0e10cSrcweir maModel.mbOutline = rAttribs.getBool( XML_outline, true ); 357*cdf0e10cSrcweir maModel.mbSubtotalTop = rAttribs.getBool( XML_subtotalTop, true ); 358*cdf0e10cSrcweir maModel.mbInsertBlankRow = rAttribs.getBool( XML_insertBlankRow, false ); 359*cdf0e10cSrcweir maModel.mbInsertPageBreak = rAttribs.getBool( XML_insertPageBreak, false ); 360*cdf0e10cSrcweir maModel.mbAutoShow = rAttribs.getBool( XML_autoShow, false ); 361*cdf0e10cSrcweir maModel.mbTopAutoShow = rAttribs.getBool( XML_topAutoShow, true ); 362*cdf0e10cSrcweir maModel.mbMultiPageItems = rAttribs.getBool( XML_multipleItemSelectionAllowed, false ); 363*cdf0e10cSrcweir } 364*cdf0e10cSrcweir 365*cdf0e10cSrcweir void PivotTableField::importItem( const AttributeList& rAttribs ) 366*cdf0e10cSrcweir { 367*cdf0e10cSrcweir PTFieldItemModel aModel; 368*cdf0e10cSrcweir aModel.mnCacheItem = rAttribs.getInteger( XML_x, -1 ); 369*cdf0e10cSrcweir aModel.mnType = rAttribs.getToken( XML_t, XML_data ); 370*cdf0e10cSrcweir aModel.mbShowDetails = rAttribs.getBool( XML_sd, true ); 371*cdf0e10cSrcweir aModel.mbHidden = rAttribs.getBool( XML_h, false ); 372*cdf0e10cSrcweir maItems.push_back( aModel ); 373*cdf0e10cSrcweir } 374*cdf0e10cSrcweir 375*cdf0e10cSrcweir void PivotTableField::importReference( const AttributeList& rAttribs ) 376*cdf0e10cSrcweir { 377*cdf0e10cSrcweir // field index is stored as unsigned integer 378*cdf0e10cSrcweir maModel.mnSortRefField = static_cast< sal_Int32 >( rAttribs.getUnsigned( XML_field, SAL_MAX_UINT32 ) ); 379*cdf0e10cSrcweir } 380*cdf0e10cSrcweir 381*cdf0e10cSrcweir void PivotTableField::importReferenceItem( const AttributeList& rAttribs ) 382*cdf0e10cSrcweir { 383*cdf0e10cSrcweir maModel.mnSortRefItem = rAttribs.getInteger( XML_v, -1 ); 384*cdf0e10cSrcweir } 385*cdf0e10cSrcweir 386*cdf0e10cSrcweir void PivotTableField::importPTField( SequenceInputStream& rStrm ) 387*cdf0e10cSrcweir { 388*cdf0e10cSrcweir sal_uInt32 nFlags1, nFlags2; 389*cdf0e10cSrcweir rStrm >> nFlags1 >> maModel.mnNumFmtId >> nFlags2 >> maModel.mnAutoShowItems >> maModel.mnAutoShowRankBy; 390*cdf0e10cSrcweir 391*cdf0e10cSrcweir maModel.setBiffAxis( extractValue< sal_uInt8 >( nFlags1, 0, 3 ) ); 392*cdf0e10cSrcweir maModel.mbDataField = getFlag( nFlags1, BIFF12_PTFIELD_DATAFIELD ); 393*cdf0e10cSrcweir maModel.mbDefaultSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_DEFAULT ); 394*cdf0e10cSrcweir maModel.mbSumSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_SUM ); 395*cdf0e10cSrcweir maModel.mbCountASubtotal = getFlag( nFlags1, BIFF12_PTFIELD_COUNTA ); 396*cdf0e10cSrcweir maModel.mbAverageSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_AVERAGE ); 397*cdf0e10cSrcweir maModel.mbMaxSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_MAX ); 398*cdf0e10cSrcweir maModel.mbMinSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_MIN ); 399*cdf0e10cSrcweir maModel.mbProductSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_PRODUCT ); 400*cdf0e10cSrcweir maModel.mbCountSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_COUNT ); 401*cdf0e10cSrcweir maModel.mbStdDevSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_STDDEV ); 402*cdf0e10cSrcweir maModel.mbStdDevPSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_STDDEVP ); 403*cdf0e10cSrcweir maModel.mbVarSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_VAR ); 404*cdf0e10cSrcweir maModel.mbVarPSubtotal = getFlag( nFlags1, BIFF12_PTFIELD_VARP ); 405*cdf0e10cSrcweir 406*cdf0e10cSrcweir maModel.mbShowAll = getFlag( nFlags2, BIFF12_PTFIELD_SHOWALL ); 407*cdf0e10cSrcweir maModel.mbOutline = getFlag( nFlags2, BIFF12_PTFIELD_OUTLINE ); 408*cdf0e10cSrcweir maModel.mbSubtotalTop = getFlag( nFlags2, BIFF12_PTFIELD_SUBTOTALTOP ); 409*cdf0e10cSrcweir maModel.mbInsertBlankRow = getFlag( nFlags2, BIFF12_PTFIELD_INSERTBLANKROW ); 410*cdf0e10cSrcweir maModel.mbInsertPageBreak = getFlag( nFlags2, BIFF12_PTFIELD_INSERTPAGEBREAK ); 411*cdf0e10cSrcweir maModel.mbAutoShow = getFlag( nFlags2, BIFF12_PTFIELD_AUTOSHOW ); 412*cdf0e10cSrcweir maModel.mbTopAutoShow = getFlag( nFlags2, BIFF12_PTFIELD_AUTOSHOWTOP ); 413*cdf0e10cSrcweir maModel.mbMultiPageItems = getFlag( nFlags2, BIFF12_PTFIELD_MULTIPAGEITEMS ); 414*cdf0e10cSrcweir 415*cdf0e10cSrcweir bool bAutoSort = getFlag( nFlags2, BIFF12_PTFIELD_AUTOSORT ); 416*cdf0e10cSrcweir bool bAscending = getFlag( nFlags2, BIFF12_PTFIELD_SORTASCENDING ); 417*cdf0e10cSrcweir maModel.mnSortType = bAutoSort ? (bAscending ? XML_ascending : XML_descending) : XML_manual; 418*cdf0e10cSrcweir } 419*cdf0e10cSrcweir 420*cdf0e10cSrcweir void PivotTableField::importPTFItem( SequenceInputStream& rStrm ) 421*cdf0e10cSrcweir { 422*cdf0e10cSrcweir PTFieldItemModel aModel; 423*cdf0e10cSrcweir sal_uInt8 nType; 424*cdf0e10cSrcweir sal_uInt16 nFlags; 425*cdf0e10cSrcweir rStrm >> nType >> nFlags >> aModel.mnCacheItem; 426*cdf0e10cSrcweir 427*cdf0e10cSrcweir aModel.setBiffType( nType ); 428*cdf0e10cSrcweir aModel.mbShowDetails = !getFlag( nFlags, BIFF12_PTFITEM_HIDEDETAILS ); 429*cdf0e10cSrcweir aModel.mbHidden = getFlag( nFlags, BIFF12_PTFITEM_HIDDEN ); 430*cdf0e10cSrcweir 431*cdf0e10cSrcweir maItems.push_back( aModel ); 432*cdf0e10cSrcweir } 433*cdf0e10cSrcweir 434*cdf0e10cSrcweir void PivotTableField::importPTReference( SequenceInputStream& rStrm ) 435*cdf0e10cSrcweir { 436*cdf0e10cSrcweir rStrm >> maModel.mnSortRefField; 437*cdf0e10cSrcweir } 438*cdf0e10cSrcweir 439*cdf0e10cSrcweir void PivotTableField::importPTReferenceItem( SequenceInputStream& rStrm ) 440*cdf0e10cSrcweir { 441*cdf0e10cSrcweir rStrm >> maModel.mnSortRefItem; 442*cdf0e10cSrcweir } 443*cdf0e10cSrcweir 444*cdf0e10cSrcweir void PivotTableField::importPTField( BiffInputStream& rStrm ) 445*cdf0e10cSrcweir { 446*cdf0e10cSrcweir sal_uInt16 nAxis, nSubtCount, nSubtotals; 447*cdf0e10cSrcweir rStrm >> nAxis >> nSubtCount >> nSubtotals; 448*cdf0e10cSrcweir rStrm.skip( 2 ); // item count 449*cdf0e10cSrcweir 450*cdf0e10cSrcweir maModel.setBiffAxis( extractValue< sal_uInt8 >( nAxis, 0, 3 ) ); 451*cdf0e10cSrcweir maModel.mbDataField = getFlag( nAxis, BIFF_PTFIELD_DATAFIELD ); 452*cdf0e10cSrcweir 453*cdf0e10cSrcweir maModel.mbDefaultSubtotal = getFlag( nSubtotals, BIFF_PTFIELD_DEFAULT ); 454*cdf0e10cSrcweir maModel.mbSumSubtotal = getFlag( nSubtotals, BIFF_PTFIELD_SUM ); 455*cdf0e10cSrcweir maModel.mbCountASubtotal = getFlag( nSubtotals, BIFF_PTFIELD_COUNTA ); 456*cdf0e10cSrcweir maModel.mbAverageSubtotal = getFlag( nSubtotals, BIFF_PTFIELD_AVERAGE ); 457*cdf0e10cSrcweir maModel.mbMaxSubtotal = getFlag( nSubtotals, BIFF_PTFIELD_MAX ); 458*cdf0e10cSrcweir maModel.mbMinSubtotal = getFlag( nSubtotals, BIFF_PTFIELD_MIN ); 459*cdf0e10cSrcweir maModel.mbProductSubtotal = getFlag( nSubtotals, BIFF_PTFIELD_PRODUCT ); 460*cdf0e10cSrcweir maModel.mbCountSubtotal = getFlag( nSubtotals, BIFF_PTFIELD_COUNT ); 461*cdf0e10cSrcweir maModel.mbStdDevSubtotal = getFlag( nSubtotals, BIFF_PTFIELD_STDDEV ); 462*cdf0e10cSrcweir maModel.mbStdDevPSubtotal = getFlag( nSubtotals, BIFF_PTFIELD_STDDEVP ); 463*cdf0e10cSrcweir maModel.mbVarSubtotal = getFlag( nSubtotals, BIFF_PTFIELD_VAR ); 464*cdf0e10cSrcweir maModel.mbVarPSubtotal = getFlag( nSubtotals, BIFF_PTFIELD_VARP ); 465*cdf0e10cSrcweir 466*cdf0e10cSrcweir // set different defaults for BIFF 467*cdf0e10cSrcweir maModel.mbShowAll = maModel.mbOutline = maModel.mbSubtotalTop = false; 468*cdf0e10cSrcweir 469*cdf0e10cSrcweir // read following items 470*cdf0e10cSrcweir while( (rStrm.getNextRecId() == BIFF_ID_PTFITEM) && rStrm.startNextRecord() ) 471*cdf0e10cSrcweir importPTFItem( rStrm ); 472*cdf0e10cSrcweir 473*cdf0e10cSrcweir // read following PTFIELD2 record with additional field settings 474*cdf0e10cSrcweir if( (getBiff() == BIFF8) && (rStrm.getNextRecId() == BIFF_ID_PTFIELD2) && rStrm.startNextRecord() ) 475*cdf0e10cSrcweir importPTField2( rStrm ); 476*cdf0e10cSrcweir } 477*cdf0e10cSrcweir 478*cdf0e10cSrcweir void PivotTableField::importPTField2( BiffInputStream& rStrm ) 479*cdf0e10cSrcweir { 480*cdf0e10cSrcweir sal_uInt32 nFlags; 481*cdf0e10cSrcweir rStrm >> nFlags; 482*cdf0e10cSrcweir maModel.mnSortRefItem = rStrm.readInt16(); 483*cdf0e10cSrcweir maModel.mnAutoShowRankBy = rStrm.readInt16(); 484*cdf0e10cSrcweir maModel.mnNumFmtId = rStrm.readuInt16(); 485*cdf0e10cSrcweir 486*cdf0e10cSrcweir maModel.mnAutoShowItems = extractValue< sal_Int32 >( nFlags, 24, 8 ); 487*cdf0e10cSrcweir maModel.mbShowAll = getFlag( nFlags, BIFF_PTFIELD2_SHOWALL ); 488*cdf0e10cSrcweir maModel.mbOutline = getFlag( nFlags, BIFF_PTFIELD2_OUTLINE ); 489*cdf0e10cSrcweir maModel.mbSubtotalTop = getFlag( nFlags, BIFF_PTFIELD2_SUBTOTALTOP ); 490*cdf0e10cSrcweir maModel.mbInsertBlankRow = getFlag( nFlags, BIFF_PTFIELD2_INSERTBLANKROW ); 491*cdf0e10cSrcweir maModel.mbAutoShow = getFlag( nFlags, BIFF_PTFIELD2_AUTOSHOW ); 492*cdf0e10cSrcweir maModel.mbTopAutoShow = getFlag( nFlags, BIFF_PTFIELD2_AUTOSHOWTOP ); 493*cdf0e10cSrcweir 494*cdf0e10cSrcweir bool bAutoSort = getFlag( nFlags, BIFF_PTFIELD2_AUTOSORT ); 495*cdf0e10cSrcweir bool bAscending = getFlag( nFlags, BIFF_PTFIELD2_SORTASCENDING ); 496*cdf0e10cSrcweir maModel.mnSortType = bAutoSort ? (bAscending ? XML_ascending : XML_descending) : XML_manual; 497*cdf0e10cSrcweir // mnSortRefField == OOX_PT_DATALAYOUTFIELD will indicate sorting by data field 498*cdf0e10cSrcweir if( maModel.mnSortRefItem >= 0 ) 499*cdf0e10cSrcweir maModel.mnSortRefField = OOX_PT_DATALAYOUTFIELD; 500*cdf0e10cSrcweir } 501*cdf0e10cSrcweir 502*cdf0e10cSrcweir void PivotTableField::importPTFItem( BiffInputStream& rStrm ) 503*cdf0e10cSrcweir { 504*cdf0e10cSrcweir PTFieldItemModel aModel; 505*cdf0e10cSrcweir sal_uInt16 nType, nFlags; 506*cdf0e10cSrcweir sal_Int16 nCacheItem; 507*cdf0e10cSrcweir rStrm >> nType >> nFlags >> nCacheItem; 508*cdf0e10cSrcweir 509*cdf0e10cSrcweir aModel.setBiffType( nType ); 510*cdf0e10cSrcweir aModel.mnCacheItem = nCacheItem; 511*cdf0e10cSrcweir aModel.mbShowDetails = !getFlag( nFlags, BIFF_PTFITEM_HIDEDETAILS ); 512*cdf0e10cSrcweir aModel.mbHidden = getFlag( nFlags, BIFF_PTFITEM_HIDDEN ); 513*cdf0e10cSrcweir 514*cdf0e10cSrcweir maItems.push_back( aModel ); 515*cdf0e10cSrcweir } 516*cdf0e10cSrcweir 517*cdf0e10cSrcweir void PivotTableField::finalizeImport( const Reference< XDataPilotDescriptor >& rxDPDesc ) 518*cdf0e10cSrcweir { 519*cdf0e10cSrcweir /* Process all fields based on source data, other fields (e.g. group 520*cdf0e10cSrcweir fields) are processed from here. PivotCacahe::getDatabaseIndex() 521*cdf0e10cSrcweir returns -1 for all fields not based on source data. */ 522*cdf0e10cSrcweir Reference< XDataPilotField > xDPField; 523*cdf0e10cSrcweir sal_Int32 nDatabaseIdx = mrPivotTable.getCacheDatabaseIndex( mnFieldIndex ); 524*cdf0e10cSrcweir if( (nDatabaseIdx >= 0) && rxDPDesc.is() ) try 525*cdf0e10cSrcweir { 526*cdf0e10cSrcweir // try to get the source field and its name from passed DataPilot descriptor 527*cdf0e10cSrcweir Reference< XIndexAccess > xDPFieldsIA( rxDPDesc->getDataPilotFields(), UNO_SET_THROW ); 528*cdf0e10cSrcweir xDPField.set( xDPFieldsIA->getByIndex( nDatabaseIdx ), UNO_QUERY_THROW ); 529*cdf0e10cSrcweir Reference< XNamed > xDPFieldName( xDPField, UNO_QUERY_THROW ); 530*cdf0e10cSrcweir maDPFieldName = xDPFieldName->getName(); 531*cdf0e10cSrcweir OSL_ENSURE( maDPFieldName.getLength() > 0, "PivotTableField::finalizeImport - no field name in source data found" ); 532*cdf0e10cSrcweir 533*cdf0e10cSrcweir // try to convert grouping settings 534*cdf0e10cSrcweir if( const PivotCacheField* pCacheField = mrPivotTable.getCacheField( mnFieldIndex ) ) 535*cdf0e10cSrcweir { 536*cdf0e10cSrcweir // numeric grouping is done inplace, no nested group fields will appear 537*cdf0e10cSrcweir if( pCacheField->hasNumericGrouping() ) 538*cdf0e10cSrcweir { 539*cdf0e10cSrcweir pCacheField->convertNumericGrouping( xDPField ); 540*cdf0e10cSrcweir } 541*cdf0e10cSrcweir else if( pCacheField->hasDateGrouping() ) 542*cdf0e10cSrcweir { 543*cdf0e10cSrcweir // first date group settings are inplace 544*cdf0e10cSrcweir pCacheField->createDateGroupField( xDPField ); 545*cdf0e10cSrcweir // create all nested group fields (if any) 546*cdf0e10cSrcweir mrPivotTable.finalizeDateGroupingImport( xDPField, mnFieldIndex ); 547*cdf0e10cSrcweir } 548*cdf0e10cSrcweir else if( pCacheField->hasParentGrouping() ) 549*cdf0e10cSrcweir { 550*cdf0e10cSrcweir // create a list of all item names, needed to map between original and group items 551*cdf0e10cSrcweir ::std::vector< OUString > aItems; 552*cdf0e10cSrcweir pCacheField->getCacheItemNames( aItems ); 553*cdf0e10cSrcweir PivotCacheGroupItemVector aItemNames; 554*cdf0e10cSrcweir for( ::std::vector< OUString >::iterator aIt = aItems.begin(), aEnd = aItems.end(); aIt != aEnd; ++aIt ) 555*cdf0e10cSrcweir aItemNames.push_back( PivotCacheGroupItem( *aIt ) ); 556*cdf0e10cSrcweir // create all nested group fields (if any) 557*cdf0e10cSrcweir mrPivotTable.finalizeParentGroupingImport( xDPField, *pCacheField, aItemNames ); 558*cdf0e10cSrcweir } 559*cdf0e10cSrcweir } 560*cdf0e10cSrcweir } 561*cdf0e10cSrcweir catch( Exception& ) 562*cdf0e10cSrcweir { 563*cdf0e10cSrcweir } 564*cdf0e10cSrcweir } 565*cdf0e10cSrcweir 566*cdf0e10cSrcweir void PivotTableField::finalizeDateGroupingImport( const Reference< XDataPilotField >& rxBaseDPField, sal_Int32 nBaseFieldIdx ) 567*cdf0e10cSrcweir { 568*cdf0e10cSrcweir if( maDPFieldName.getLength() == 0 ) // prevent endless loops if file format is broken 569*cdf0e10cSrcweir { 570*cdf0e10cSrcweir if( const PivotCacheField* pCacheField = mrPivotTable.getCacheField( mnFieldIndex ) ) 571*cdf0e10cSrcweir { 572*cdf0e10cSrcweir if( !pCacheField->isDatabaseField() && pCacheField->hasDateGrouping() && (pCacheField->getGroupBaseField() == nBaseFieldIdx) ) 573*cdf0e10cSrcweir { 574*cdf0e10cSrcweir maDPFieldName = pCacheField->createDateGroupField( rxBaseDPField ); 575*cdf0e10cSrcweir OSL_ENSURE( maDPFieldName.getLength() > 0, "PivotTableField::finalizeDateGroupingImport - cannot create date group field" ); 576*cdf0e10cSrcweir } 577*cdf0e10cSrcweir } 578*cdf0e10cSrcweir } 579*cdf0e10cSrcweir } 580*cdf0e10cSrcweir 581*cdf0e10cSrcweir void PivotTableField::finalizeParentGroupingImport( const Reference< XDataPilotField >& rxBaseDPField, PivotCacheGroupItemVector& orItemNames ) 582*cdf0e10cSrcweir { 583*cdf0e10cSrcweir if( maDPFieldName.getLength() == 0 ) // prevent endless loops if file format is broken 584*cdf0e10cSrcweir { 585*cdf0e10cSrcweir if( const PivotCacheField* pCacheField = mrPivotTable.getCacheField( mnFieldIndex ) ) 586*cdf0e10cSrcweir { 587*cdf0e10cSrcweir maDPFieldName = pCacheField->createParentGroupField( rxBaseDPField, orItemNames ); 588*cdf0e10cSrcweir // on success, try to create nested group fields 589*cdf0e10cSrcweir Reference< XDataPilotField > xDPField = mrPivotTable.getDataPilotField( maDPFieldName ); 590*cdf0e10cSrcweir if( xDPField.is() ) 591*cdf0e10cSrcweir mrPivotTable.finalizeParentGroupingImport( xDPField, *pCacheField, orItemNames ); 592*cdf0e10cSrcweir } 593*cdf0e10cSrcweir } 594*cdf0e10cSrcweir } 595*cdf0e10cSrcweir 596*cdf0e10cSrcweir void PivotTableField::convertRowField() 597*cdf0e10cSrcweir { 598*cdf0e10cSrcweir convertRowColPageField( XML_axisRow ); 599*cdf0e10cSrcweir } 600*cdf0e10cSrcweir 601*cdf0e10cSrcweir void PivotTableField::convertColField() 602*cdf0e10cSrcweir { 603*cdf0e10cSrcweir convertRowColPageField( XML_axisCol ); 604*cdf0e10cSrcweir } 605*cdf0e10cSrcweir 606*cdf0e10cSrcweir void PivotTableField::convertHiddenField() 607*cdf0e10cSrcweir { 608*cdf0e10cSrcweir convertRowColPageField( XML_TOKEN_INVALID ); 609*cdf0e10cSrcweir } 610*cdf0e10cSrcweir 611*cdf0e10cSrcweir void PivotTableField::convertPageField( const PTPageFieldModel& rPageField ) 612*cdf0e10cSrcweir { 613*cdf0e10cSrcweir OSL_ENSURE( rPageField.mnField == mnFieldIndex, "PivotTableField::convertPageField - wrong field index" ); 614*cdf0e10cSrcweir // convert all settings common for row/column/page fields 615*cdf0e10cSrcweir Reference< XDataPilotField > xDPField = convertRowColPageField( XML_axisPage ); 616*cdf0e10cSrcweir 617*cdf0e10cSrcweir if( xDPField.is() ) 618*cdf0e10cSrcweir { 619*cdf0e10cSrcweir PropertySet aPropSet( xDPField ); 620*cdf0e10cSrcweir using namespace ::com::sun::star::sheet; 621*cdf0e10cSrcweir 622*cdf0e10cSrcweir // find cache item used as 'selected page' 623*cdf0e10cSrcweir sal_Int32 nCacheItem = -1; 624*cdf0e10cSrcweir if( maModel.mbMultiPageItems ) 625*cdf0e10cSrcweir { 626*cdf0e10cSrcweir // multiple items may be selected 627*cdf0e10cSrcweir OSL_ENSURE( rPageField.mnItem == BIFF12_PTPAGEFIELD_MULTIITEMS, "PivotTableField::convertPageField - unexpected cache item index" ); 628*cdf0e10cSrcweir // try to find a single visible item 629*cdf0e10cSrcweir bool bHasMultiItems = false; 630*cdf0e10cSrcweir for( ItemModelVector::iterator aIt = maItems.begin(), aEnd = maItems.end(); (aIt != aEnd) && !bHasMultiItems; ++aIt ) 631*cdf0e10cSrcweir { 632*cdf0e10cSrcweir if( (aIt->mnType == XML_data) && !aIt->mbHidden ) 633*cdf0e10cSrcweir { 634*cdf0e10cSrcweir bHasMultiItems = nCacheItem >= 0; 635*cdf0e10cSrcweir nCacheItem = bHasMultiItems ? -1 : aIt->mnCacheItem; 636*cdf0e10cSrcweir } 637*cdf0e10cSrcweir } 638*cdf0e10cSrcweir } 639*cdf0e10cSrcweir else 640*cdf0e10cSrcweir { 641*cdf0e10cSrcweir // single item may be selected 642*cdf0e10cSrcweir if( (0 <= rPageField.mnItem) && (rPageField.mnItem < static_cast< sal_Int32 >( maItems.size() )) ) 643*cdf0e10cSrcweir nCacheItem = maItems[ rPageField.mnItem ].mnCacheItem; 644*cdf0e10cSrcweir } 645*cdf0e10cSrcweir 646*cdf0e10cSrcweir if( nCacheItem >= 0 ) 647*cdf0e10cSrcweir { 648*cdf0e10cSrcweir if( const PivotCacheField* pCacheField = mrPivotTable.getCacheField( mnFieldIndex ) ) 649*cdf0e10cSrcweir { 650*cdf0e10cSrcweir if( const PivotCacheItem* pSharedItem = pCacheField->getCacheItem( nCacheItem ) ) 651*cdf0e10cSrcweir { 652*cdf0e10cSrcweir OUString aSelectedPage = pSharedItem->getName(); 653*cdf0e10cSrcweir if( aSelectedPage.getLength() > 0 ) 654*cdf0e10cSrcweir aPropSet.setProperty( PROP_SelectedPage, aSelectedPage ); 655*cdf0e10cSrcweir } 656*cdf0e10cSrcweir } 657*cdf0e10cSrcweir } 658*cdf0e10cSrcweir } 659*cdf0e10cSrcweir } 660*cdf0e10cSrcweir 661*cdf0e10cSrcweir void PivotTableField::convertDataField( const PTDataFieldModel& rDataField ) 662*cdf0e10cSrcweir { 663*cdf0e10cSrcweir OSL_ENSURE( rDataField.mnField == mnFieldIndex, "PivotTableField::convertDataField - wrong field index" ); 664*cdf0e10cSrcweir OSL_ENSURE( maModel.mbDataField, "PivotTableField::convertDataField - not a data field" ); 665*cdf0e10cSrcweir Reference< XDataPilotField > xDPField = mrPivotTable.getDataPilotField( maDPFieldName ); 666*cdf0e10cSrcweir if( xDPField.is() ) 667*cdf0e10cSrcweir { 668*cdf0e10cSrcweir PropertySet aPropSet( xDPField ); 669*cdf0e10cSrcweir using namespace ::com::sun::star::sheet; 670*cdf0e10cSrcweir 671*cdf0e10cSrcweir // field orientation 672*cdf0e10cSrcweir aPropSet.setProperty( PROP_Orientation, DataPilotFieldOrientation_DATA ); 673*cdf0e10cSrcweir 674*cdf0e10cSrcweir /* Field aggregation function. Documentation is a little bit confused 675*cdf0e10cSrcweir about which names to use for the count functions. The name 'count' 676*cdf0e10cSrcweir means 'count all', and 'countNum' means 'count numbers'. On the 677*cdf0e10cSrcweir other hand, for subtotals, 'countA' means 'count all', and 'count' 678*cdf0e10cSrcweir means 'count numbers' (see above). */ 679*cdf0e10cSrcweir GeneralFunction eAggFunc = GeneralFunction_SUM; 680*cdf0e10cSrcweir switch( rDataField.mnSubtotal ) 681*cdf0e10cSrcweir { 682*cdf0e10cSrcweir case XML_sum: eAggFunc = GeneralFunction_SUM; break; 683*cdf0e10cSrcweir case XML_count: eAggFunc = GeneralFunction_COUNT; break; 684*cdf0e10cSrcweir case XML_average: eAggFunc = GeneralFunction_AVERAGE; break; 685*cdf0e10cSrcweir case XML_max: eAggFunc = GeneralFunction_MAX; break; 686*cdf0e10cSrcweir case XML_min: eAggFunc = GeneralFunction_MIN; break; 687*cdf0e10cSrcweir case XML_product: eAggFunc = GeneralFunction_PRODUCT; break; 688*cdf0e10cSrcweir case XML_countNums: eAggFunc = GeneralFunction_COUNTNUMS; break; 689*cdf0e10cSrcweir case XML_stdDev: eAggFunc = GeneralFunction_STDEV; break; 690*cdf0e10cSrcweir case XML_stdDevp: eAggFunc = GeneralFunction_STDEVP; break; 691*cdf0e10cSrcweir case XML_var: eAggFunc = GeneralFunction_VAR; break; 692*cdf0e10cSrcweir case XML_varp: eAggFunc = GeneralFunction_VARP; break; 693*cdf0e10cSrcweir default: OSL_ENSURE( false, "PivotTableField::convertDataField - unknown aggregation function" ); 694*cdf0e10cSrcweir } 695*cdf0e10cSrcweir aPropSet.setProperty( PROP_Function, eAggFunc ); 696*cdf0e10cSrcweir 697*cdf0e10cSrcweir // field reference ('show data as') 698*cdf0e10cSrcweir DataPilotFieldReference aReference; 699*cdf0e10cSrcweir aReference.ReferenceType = DataPilotFieldReferenceType::NONE; 700*cdf0e10cSrcweir switch( rDataField.mnShowDataAs ) 701*cdf0e10cSrcweir { 702*cdf0e10cSrcweir case XML_difference: aReference.ReferenceType = DataPilotFieldReferenceType::ITEM_DIFFERENCE; break; 703*cdf0e10cSrcweir case XML_percent: aReference.ReferenceType = DataPilotFieldReferenceType::ITEM_PERCENTAGE; break; 704*cdf0e10cSrcweir case XML_percentDiff: aReference.ReferenceType = DataPilotFieldReferenceType::ITEM_PERCENTAGE_DIFFERENCE; break; 705*cdf0e10cSrcweir case XML_runTotal: aReference.ReferenceType = DataPilotFieldReferenceType::RUNNING_TOTAL; break; 706*cdf0e10cSrcweir case XML_percentOfRow: aReference.ReferenceType = DataPilotFieldReferenceType::ROW_PERCENTAGE; break; 707*cdf0e10cSrcweir case XML_percentOfCol: aReference.ReferenceType = DataPilotFieldReferenceType::COLUMN_PERCENTAGE; break; 708*cdf0e10cSrcweir case XML_percentOfTotal: aReference.ReferenceType = DataPilotFieldReferenceType::TOTAL_PERCENTAGE; break; 709*cdf0e10cSrcweir case XML_index: aReference.ReferenceType = DataPilotFieldReferenceType::INDEX; break; 710*cdf0e10cSrcweir } 711*cdf0e10cSrcweir if( aReference.ReferenceType != DataPilotFieldReferenceType::NONE ) 712*cdf0e10cSrcweir { 713*cdf0e10cSrcweir if( const PivotCacheField* pCacheField = mrPivotTable.getCacheField( rDataField.mnBaseField ) ) 714*cdf0e10cSrcweir { 715*cdf0e10cSrcweir aReference.ReferenceField = pCacheField->getName(); 716*cdf0e10cSrcweir switch( rDataField.mnBaseItem ) 717*cdf0e10cSrcweir { 718*cdf0e10cSrcweir case OOX_PT_PREVIOUS_ITEM: 719*cdf0e10cSrcweir aReference.ReferenceItemType = DataPilotFieldReferenceItemType::PREVIOUS; 720*cdf0e10cSrcweir break; 721*cdf0e10cSrcweir case OOX_PT_NEXT_ITEM: 722*cdf0e10cSrcweir aReference.ReferenceItemType = DataPilotFieldReferenceItemType::NEXT; 723*cdf0e10cSrcweir break; 724*cdf0e10cSrcweir default: 725*cdf0e10cSrcweir aReference.ReferenceItemType = DataPilotFieldReferenceItemType::NAMED; 726*cdf0e10cSrcweir if( const PivotCacheItem* pCacheItem = pCacheField->getCacheItem( rDataField.mnBaseItem ) ) 727*cdf0e10cSrcweir aReference.ReferenceItemName = pCacheItem->getName(); 728*cdf0e10cSrcweir } 729*cdf0e10cSrcweir aPropSet.setProperty( PROP_Reference, aReference ); 730*cdf0e10cSrcweir } 731*cdf0e10cSrcweir } 732*cdf0e10cSrcweir } 733*cdf0e10cSrcweir } 734*cdf0e10cSrcweir 735*cdf0e10cSrcweir // private -------------------------------------------------------------------- 736*cdf0e10cSrcweir 737*cdf0e10cSrcweir Reference< XDataPilotField > PivotTableField::convertRowColPageField( sal_Int32 nAxis ) 738*cdf0e10cSrcweir { 739*cdf0e10cSrcweir bool bDataLayout = mnFieldIndex == OOX_PT_DATALAYOUTFIELD; 740*cdf0e10cSrcweir Reference< XDataPilotField > xDPField = bDataLayout ? mrPivotTable.getDataLayoutField() : mrPivotTable.getDataPilotField( maDPFieldName ); 741*cdf0e10cSrcweir OSL_ENSURE( bDataLayout || (nAxis == maModel.mnAxis), "PivotTableField::convertRowColPageField - field axis mismatch" ); 742*cdf0e10cSrcweir 743*cdf0e10cSrcweir if( xDPField.is() ) 744*cdf0e10cSrcweir { 745*cdf0e10cSrcweir PropertySet aPropSet( xDPField ); 746*cdf0e10cSrcweir using namespace ::com::sun::star::sheet; 747*cdf0e10cSrcweir 748*cdf0e10cSrcweir // field orientation 749*cdf0e10cSrcweir DataPilotFieldOrientation eFieldOrient = DataPilotFieldOrientation_HIDDEN; 750*cdf0e10cSrcweir switch( nAxis ) 751*cdf0e10cSrcweir { 752*cdf0e10cSrcweir case XML_axisRow: eFieldOrient = DataPilotFieldOrientation_ROW; break; 753*cdf0e10cSrcweir case XML_axisCol: eFieldOrient = DataPilotFieldOrientation_COLUMN; break; 754*cdf0e10cSrcweir case XML_axisPage: eFieldOrient = DataPilotFieldOrientation_PAGE; break; 755*cdf0e10cSrcweir } 756*cdf0e10cSrcweir if( eFieldOrient != DataPilotFieldOrientation_HIDDEN ) 757*cdf0e10cSrcweir aPropSet.setProperty( PROP_Orientation, eFieldOrient ); 758*cdf0e10cSrcweir 759*cdf0e10cSrcweir // all other settings not for the data layout field 760*cdf0e10cSrcweir if( !bDataLayout ) 761*cdf0e10cSrcweir { 762*cdf0e10cSrcweir /* Field subtotal functions. Ignore the 'defaultSubtotal' flag, if 763*cdf0e10cSrcweir explicit functions are set. This is different behaviour between 764*cdf0e10cSrcweir XML (where 'defaultSubtotal' is set regardless of other 765*cdf0e10cSrcweir functions) and binary formats (where 'defaultSubtotal' is not 766*cdf0e10cSrcweir set if other functions are set). */ 767*cdf0e10cSrcweir ::std::vector< GeneralFunction > aSubtotals; 768*cdf0e10cSrcweir /* Order of subtotals is fixed in Excel. Documentation is a little 769*cdf0e10cSrcweir bit confused about which names to use for the count functions. 770*cdf0e10cSrcweir For subtotals, 'countA' means 'count all', and 'count' means 771*cdf0e10cSrcweir 'count numbers'. On the other hand, for the data field 772*cdf0e10cSrcweir aggregation function, 'count' means 'count all', and 'countNum' 773*cdf0e10cSrcweir means 'count numbers' (see below). */ 774*cdf0e10cSrcweir if( maModel.mbSumSubtotal ) aSubtotals.push_back( GeneralFunction_SUM ); 775*cdf0e10cSrcweir if( maModel.mbCountASubtotal ) aSubtotals.push_back( GeneralFunction_COUNT ); 776*cdf0e10cSrcweir if( maModel.mbAverageSubtotal ) aSubtotals.push_back( GeneralFunction_AVERAGE ); 777*cdf0e10cSrcweir if( maModel.mbMaxSubtotal ) aSubtotals.push_back( GeneralFunction_MAX ); 778*cdf0e10cSrcweir if( maModel.mbMinSubtotal ) aSubtotals.push_back( GeneralFunction_MIN ); 779*cdf0e10cSrcweir if( maModel.mbProductSubtotal ) aSubtotals.push_back( GeneralFunction_PRODUCT ); 780*cdf0e10cSrcweir if( maModel.mbCountSubtotal ) aSubtotals.push_back( GeneralFunction_COUNTNUMS ); 781*cdf0e10cSrcweir if( maModel.mbStdDevSubtotal ) aSubtotals.push_back( GeneralFunction_STDEV ); 782*cdf0e10cSrcweir if( maModel.mbStdDevPSubtotal ) aSubtotals.push_back( GeneralFunction_STDEVP ); 783*cdf0e10cSrcweir if( maModel.mbVarSubtotal ) aSubtotals.push_back( GeneralFunction_VAR ); 784*cdf0e10cSrcweir if( maModel.mbVarPSubtotal ) aSubtotals.push_back( GeneralFunction_VARP ); 785*cdf0e10cSrcweir // if no function is set manually, check the 'defaultSubtotal' flag 786*cdf0e10cSrcweir if( aSubtotals.empty() && maModel.mbDefaultSubtotal ) 787*cdf0e10cSrcweir aSubtotals.push_back( GeneralFunction_AUTO ); 788*cdf0e10cSrcweir aPropSet.setProperty( PROP_Subtotals, ContainerHelper::vectorToSequence( aSubtotals ) ); 789*cdf0e10cSrcweir 790*cdf0e10cSrcweir // layout settings 791*cdf0e10cSrcweir DataPilotFieldLayoutInfo aLayoutInfo; 792*cdf0e10cSrcweir aLayoutInfo.LayoutMode = maModel.mbOutline ? 793*cdf0e10cSrcweir (maModel.mbSubtotalTop ? DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_TOP : DataPilotFieldLayoutMode::OUTLINE_SUBTOTALS_BOTTOM) : 794*cdf0e10cSrcweir DataPilotFieldLayoutMode::TABULAR_LAYOUT; 795*cdf0e10cSrcweir aLayoutInfo.AddEmptyLines = maModel.mbInsertBlankRow; 796*cdf0e10cSrcweir aPropSet.setProperty( PROP_LayoutInfo, aLayoutInfo ); 797*cdf0e10cSrcweir aPropSet.setProperty( PROP_ShowEmpty, maModel.mbShowAll ); 798*cdf0e10cSrcweir 799*cdf0e10cSrcweir // auto show (OOXML/BIFF12 only) 800*cdf0e10cSrcweir if( maModel.mbAutoShow ) 801*cdf0e10cSrcweir { 802*cdf0e10cSrcweir DataPilotFieldAutoShowInfo aAutoShowInfo; 803*cdf0e10cSrcweir aAutoShowInfo.IsEnabled = sal_True; 804*cdf0e10cSrcweir aAutoShowInfo.ShowItemsMode = maModel.mbTopAutoShow ? DataPilotFieldShowItemsMode::FROM_TOP : DataPilotFieldShowItemsMode::FROM_BOTTOM; 805*cdf0e10cSrcweir aAutoShowInfo.ItemCount = maModel.mnAutoShowItems; 806*cdf0e10cSrcweir if( const PivotCacheField* pCacheField = mrPivotTable.getCacheFieldOfDataField( maModel.mnAutoShowRankBy ) ) 807*cdf0e10cSrcweir aAutoShowInfo.DataField = pCacheField->getName(); 808*cdf0e10cSrcweir aPropSet.setProperty( PROP_AutoShowInfo, aAutoShowInfo ); 809*cdf0e10cSrcweir } 810*cdf0e10cSrcweir 811*cdf0e10cSrcweir // auto sort 812*cdf0e10cSrcweir DataPilotFieldSortInfo aSortInfo; 813*cdf0e10cSrcweir aSortInfo.IsAscending = maModel.mnSortType == XML_ascending; 814*cdf0e10cSrcweir if( (maModel.mnSortType != XML_ascending) && (maModel.mnSortType != XML_descending) ) 815*cdf0e10cSrcweir { 816*cdf0e10cSrcweir aSortInfo.Mode = DataPilotFieldSortMode::MANUAL; 817*cdf0e10cSrcweir } 818*cdf0e10cSrcweir else 819*cdf0e10cSrcweir { 820*cdf0e10cSrcweir const PivotCacheField* pCacheField = (maModel.mnSortRefField == OOX_PT_DATALAYOUTFIELD) ? 821*cdf0e10cSrcweir mrPivotTable.getCacheFieldOfDataField( maModel.mnSortRefItem ) : 0; 822*cdf0e10cSrcweir if( pCacheField ) 823*cdf0e10cSrcweir { 824*cdf0e10cSrcweir aSortInfo.Mode = DataPilotFieldSortMode::DATA; 825*cdf0e10cSrcweir aSortInfo.Field = pCacheField->getName(); 826*cdf0e10cSrcweir } 827*cdf0e10cSrcweir else 828*cdf0e10cSrcweir { 829*cdf0e10cSrcweir aSortInfo.Mode = DataPilotFieldSortMode::NAME; 830*cdf0e10cSrcweir } 831*cdf0e10cSrcweir } 832*cdf0e10cSrcweir aPropSet.setProperty( PROP_SortInfo, aSortInfo ); 833*cdf0e10cSrcweir 834*cdf0e10cSrcweir // item settings 835*cdf0e10cSrcweir if( const PivotCacheField* pCacheField = mrPivotTable.getCacheField( mnFieldIndex ) ) try 836*cdf0e10cSrcweir { 837*cdf0e10cSrcweir Reference< XNameAccess > xDPItemsNA( xDPField->getItems(), UNO_QUERY_THROW ); 838*cdf0e10cSrcweir for( ItemModelVector::iterator aIt = maItems.begin(), aEnd = maItems.end(); aIt != aEnd; ++aIt ) 839*cdf0e10cSrcweir { 840*cdf0e10cSrcweir if( aIt->mnType == XML_data ) 841*cdf0e10cSrcweir { 842*cdf0e10cSrcweir if( const PivotCacheItem* pSharedItem = pCacheField->getCacheItem( aIt->mnCacheItem ) ) try 843*cdf0e10cSrcweir { 844*cdf0e10cSrcweir PropertySet aItemProp( xDPItemsNA->getByName( pSharedItem->getName() ) ); 845*cdf0e10cSrcweir aItemProp.setProperty( PROP_ShowDetail, aIt->mbShowDetails ); 846*cdf0e10cSrcweir aItemProp.setProperty( PROP_IsHidden, aIt->mbHidden ); 847*cdf0e10cSrcweir } 848*cdf0e10cSrcweir catch( Exception& ) 849*cdf0e10cSrcweir { 850*cdf0e10cSrcweir // catch every failed container access to be able to process following items 851*cdf0e10cSrcweir } 852*cdf0e10cSrcweir } 853*cdf0e10cSrcweir } 854*cdf0e10cSrcweir } 855*cdf0e10cSrcweir catch( Exception& ) 856*cdf0e10cSrcweir { 857*cdf0e10cSrcweir } 858*cdf0e10cSrcweir } 859*cdf0e10cSrcweir } 860*cdf0e10cSrcweir return xDPField; 861*cdf0e10cSrcweir } 862*cdf0e10cSrcweir 863*cdf0e10cSrcweir // ============================================================================ 864*cdf0e10cSrcweir 865*cdf0e10cSrcweir PTFilterModel::PTFilterModel() : 866*cdf0e10cSrcweir mfValue( 0.0 ), 867*cdf0e10cSrcweir mnField( -1 ), 868*cdf0e10cSrcweir mnMemPropField( -1 ), 869*cdf0e10cSrcweir mnType( XML_TOKEN_INVALID ), 870*cdf0e10cSrcweir mnEvalOrder( 0 ), 871*cdf0e10cSrcweir mnId( -1 ), 872*cdf0e10cSrcweir mnMeasureField( -1 ), 873*cdf0e10cSrcweir mnMeasureHier( -1 ), 874*cdf0e10cSrcweir mbTopFilter( true ) 875*cdf0e10cSrcweir { 876*cdf0e10cSrcweir } 877*cdf0e10cSrcweir 878*cdf0e10cSrcweir // ---------------------------------------------------------------------------- 879*cdf0e10cSrcweir 880*cdf0e10cSrcweir PivotTableFilter::PivotTableFilter( const PivotTable& rPivotTable ) : 881*cdf0e10cSrcweir WorkbookHelper( rPivotTable ), 882*cdf0e10cSrcweir mrPivotTable( rPivotTable ) 883*cdf0e10cSrcweir { 884*cdf0e10cSrcweir } 885*cdf0e10cSrcweir 886*cdf0e10cSrcweir void PivotTableFilter::importFilter( const AttributeList& rAttribs ) 887*cdf0e10cSrcweir { 888*cdf0e10cSrcweir maModel.maName = rAttribs.getXString( XML_name, OUString() ); 889*cdf0e10cSrcweir maModel.maDescription = rAttribs.getXString( XML_description, OUString() ); 890*cdf0e10cSrcweir maModel.maStrValue1 = rAttribs.getXString( XML_stringValue1, OUString() ); 891*cdf0e10cSrcweir maModel.maStrValue2 = rAttribs.getXString( XML_stringValue2, OUString() ); 892*cdf0e10cSrcweir maModel.mnField = rAttribs.getInteger( XML_fld, -1 ); 893*cdf0e10cSrcweir maModel.mnMemPropField = rAttribs.getInteger( XML_mpFld, -1 ); 894*cdf0e10cSrcweir maModel.mnType = rAttribs.getToken( XML_type, XML_TOKEN_INVALID ); 895*cdf0e10cSrcweir maModel.mnEvalOrder = rAttribs.getInteger( XML_evalOrder, 0 ); 896*cdf0e10cSrcweir maModel.mnId = rAttribs.getInteger( XML_id, -1 ); 897*cdf0e10cSrcweir maModel.mnMeasureField = rAttribs.getInteger( XML_iMeasureFld, -1 ); 898*cdf0e10cSrcweir maModel.mnMeasureHier = rAttribs.getInteger( XML_iMeasureHier, -1 ); 899*cdf0e10cSrcweir } 900*cdf0e10cSrcweir 901*cdf0e10cSrcweir void PivotTableFilter::importTop10( const AttributeList& rAttribs ) 902*cdf0e10cSrcweir { 903*cdf0e10cSrcweir OSL_ENSURE( rAttribs.getBool( XML_percent, false ) == (maModel.mnType == XML_percent), 904*cdf0e10cSrcweir "PivotTableFilter::importTop10 - unexpected value of percent attribute" ); 905*cdf0e10cSrcweir maModel.mfValue = rAttribs.getDouble( XML_val, 0.0 ); 906*cdf0e10cSrcweir maModel.mbTopFilter = rAttribs.getBool( XML_top, true ); 907*cdf0e10cSrcweir } 908*cdf0e10cSrcweir 909*cdf0e10cSrcweir void PivotTableFilter::importPTFilter( SequenceInputStream& rStrm ) 910*cdf0e10cSrcweir { 911*cdf0e10cSrcweir sal_Int32 nType; 912*cdf0e10cSrcweir sal_uInt16 nFlags; 913*cdf0e10cSrcweir rStrm >> maModel.mnField >> maModel.mnMemPropField >> nType; 914*cdf0e10cSrcweir rStrm.skip( 4 ); // unused 915*cdf0e10cSrcweir rStrm >> maModel.mnId >> maModel.mnMeasureField >> maModel.mnMeasureHier >> nFlags; 916*cdf0e10cSrcweir if( getFlag( nFlags, BIFF12_PTFILTER_HASNAME ) ) 917*cdf0e10cSrcweir rStrm >> maModel.maName; 918*cdf0e10cSrcweir if( getFlag( nFlags, BIFF12_PTFILTER_HASDESCRIPTION ) ) 919*cdf0e10cSrcweir rStrm >> maModel.maDescription; 920*cdf0e10cSrcweir if( getFlag( nFlags, BIFF12_PTFILTER_HASSTRVALUE1 ) ) 921*cdf0e10cSrcweir rStrm >> maModel.maStrValue1; 922*cdf0e10cSrcweir if( getFlag( nFlags, BIFF12_PTFILTER_HASSTRVALUE2 ) ) 923*cdf0e10cSrcweir rStrm >> maModel.maStrValue2; 924*cdf0e10cSrcweir 925*cdf0e10cSrcweir static sal_Int32 spnTypes[] = 926*cdf0e10cSrcweir { 927*cdf0e10cSrcweir XML_unknown, 928*cdf0e10cSrcweir // data field top10 filter (1-3) 929*cdf0e10cSrcweir XML_count, XML_percent, XML_sum, 930*cdf0e10cSrcweir // caption filter (4-17) 931*cdf0e10cSrcweir XML_captionEqual, XML_captionNotEqual, 932*cdf0e10cSrcweir XML_captionBeginsWith, XML_captionNotBeginsWith, XML_captionEndsWith, XML_captionNotEndsWith, 933*cdf0e10cSrcweir XML_captionContains, XML_captionNotContains, XML_captionGreaterThan, XML_captionGreaterThanOrEqual, 934*cdf0e10cSrcweir XML_captionLessThan, XML_captionLessThanOrEqual, XML_captionBetween, XML_captionNotBetween, 935*cdf0e10cSrcweir // value filter (18-25) 936*cdf0e10cSrcweir XML_valueEqual, XML_valueNotEqual, XML_valueGreaterThan, XML_valueGreaterThanOrEqual, 937*cdf0e10cSrcweir XML_valueLessThan, XML_valueLessThanOrEqual, XML_valueBetween, XML_valueNotBetween, 938*cdf0e10cSrcweir // date filter (26-65) 939*cdf0e10cSrcweir XML_dateEqual, XML_dateOlderThan, XML_dateNewerThan, XML_dateBetween, 940*cdf0e10cSrcweir XML_tomorrow, XML_today, XML_yesterday, XML_nextWeek, XML_thisWeek, XML_lastWeek, 941*cdf0e10cSrcweir XML_nextMonth, XML_thisMonth, XML_lastMonth, XML_nextQuarter, XML_thisQuarter, XML_lastQuarter, 942*cdf0e10cSrcweir XML_nextYear, XML_thisYear, XML_lastYear, XML_yearToDate, XML_Q1, XML_Q2, XML_Q3, XML_Q4, 943*cdf0e10cSrcweir XML_M1, XML_M2, XML_M3, XML_M4, XML_M5, XML_M6, XML_M7, XML_M8, XML_M9, XML_M10, XML_M11, XML_M12, 944*cdf0e10cSrcweir XML_dateNotEqual, XML_dateOlderThanOrEqual, XML_dateNewerThanOrEqual, XML_dateNotBetween 945*cdf0e10cSrcweir }; 946*cdf0e10cSrcweir maModel.mnType = STATIC_ARRAY_SELECT( spnTypes, nType, XML_TOKEN_INVALID ); 947*cdf0e10cSrcweir } 948*cdf0e10cSrcweir 949*cdf0e10cSrcweir void PivotTableFilter::importTop10Filter( SequenceInputStream& rStrm ) 950*cdf0e10cSrcweir { 951*cdf0e10cSrcweir sal_uInt8 nFlags; 952*cdf0e10cSrcweir rStrm >> nFlags >> maModel.mfValue; 953*cdf0e10cSrcweir 954*cdf0e10cSrcweir OSL_ENSURE( getFlag( nFlags, BIFF12_TOP10FILTER_PERCENT ) == (maModel.mnType == XML_percent), 955*cdf0e10cSrcweir "PivotTableFilter::importTop10 - unexpected value of percent attribute" ); 956*cdf0e10cSrcweir maModel.mbTopFilter = getFlag( nFlags, BIFF12_TOP10FILTER_TOP ); 957*cdf0e10cSrcweir } 958*cdf0e10cSrcweir 959*cdf0e10cSrcweir void PivotTableFilter::finalizeImport() 960*cdf0e10cSrcweir { 961*cdf0e10cSrcweir // only simple top10 filter supported 962*cdf0e10cSrcweir if( maModel.mnType == XML_count ) 963*cdf0e10cSrcweir { 964*cdf0e10cSrcweir PropertySet aPropSet( mrPivotTable.getDataPilotField( maModel.mnField ) ); 965*cdf0e10cSrcweir if( aPropSet.is() ) 966*cdf0e10cSrcweir { 967*cdf0e10cSrcweir using namespace ::com::sun::star::sheet; 968*cdf0e10cSrcweir DataPilotFieldAutoShowInfo aAutoShowInfo; 969*cdf0e10cSrcweir aAutoShowInfo.IsEnabled = sal_True; 970*cdf0e10cSrcweir aAutoShowInfo.ShowItemsMode = maModel.mbTopFilter ? DataPilotFieldShowItemsMode::FROM_TOP : DataPilotFieldShowItemsMode::FROM_BOTTOM; 971*cdf0e10cSrcweir aAutoShowInfo.ItemCount = getLimitedValue< sal_Int32, double >( maModel.mfValue, 0, SAL_MAX_INT32 ); 972*cdf0e10cSrcweir if( const PivotCacheField* pCacheField = mrPivotTable.getCacheFieldOfDataField( maModel.mnMeasureField ) ) 973*cdf0e10cSrcweir aAutoShowInfo.DataField = pCacheField->getName(); 974*cdf0e10cSrcweir aPropSet.setProperty( PROP_AutoShowInfo, aAutoShowInfo ); 975*cdf0e10cSrcweir } 976*cdf0e10cSrcweir } 977*cdf0e10cSrcweir } 978*cdf0e10cSrcweir 979*cdf0e10cSrcweir // ============================================================================ 980*cdf0e10cSrcweir 981*cdf0e10cSrcweir PTDefinitionModel::PTDefinitionModel() : 982*cdf0e10cSrcweir mnCacheId( -1 ), 983*cdf0e10cSrcweir mnDataPosition( 0 ), 984*cdf0e10cSrcweir mnPageWrap( 0 ), 985*cdf0e10cSrcweir mnIndent( 1 ), 986*cdf0e10cSrcweir mnChartFormat( 0 ), 987*cdf0e10cSrcweir mnRowFields( 0 ), 988*cdf0e10cSrcweir mnColFields( 0 ), 989*cdf0e10cSrcweir mbDataOnRows( false ), 990*cdf0e10cSrcweir mbShowError( false ), 991*cdf0e10cSrcweir mbShowMissing( true ), 992*cdf0e10cSrcweir mbShowItems( true ), 993*cdf0e10cSrcweir mbDisableFieldList( false ), 994*cdf0e10cSrcweir mbShowCalcMembers( true ), 995*cdf0e10cSrcweir mbVisualTotals( true ), 996*cdf0e10cSrcweir mbShowDrill( true ), 997*cdf0e10cSrcweir mbPrintDrill( false ), 998*cdf0e10cSrcweir mbEnableDrill( true ), 999*cdf0e10cSrcweir mbPreserveFormatting( true ), 1000*cdf0e10cSrcweir mbUseAutoFormat( false ), 1001*cdf0e10cSrcweir mbPageOverThenDown( false ), 1002*cdf0e10cSrcweir mbSubtotalHiddenItems( false ), 1003*cdf0e10cSrcweir mbRowGrandTotals( true ), 1004*cdf0e10cSrcweir mbColGrandTotals( true ), 1005*cdf0e10cSrcweir mbFieldPrintTitles( false ), 1006*cdf0e10cSrcweir mbItemPrintTitles( false ), 1007*cdf0e10cSrcweir mbMergeItem( false ), 1008*cdf0e10cSrcweir mbShowEmptyRow( false ), 1009*cdf0e10cSrcweir mbShowEmptyCol( false ), 1010*cdf0e10cSrcweir mbShowHeaders( true ), 1011*cdf0e10cSrcweir mbFieldListSortAsc( false ), 1012*cdf0e10cSrcweir mbCustomListSort( true ) 1013*cdf0e10cSrcweir { 1014*cdf0e10cSrcweir } 1015*cdf0e10cSrcweir 1016*cdf0e10cSrcweir // ---------------------------------------------------------------------------- 1017*cdf0e10cSrcweir 1018*cdf0e10cSrcweir PTLocationModel::PTLocationModel() : 1019*cdf0e10cSrcweir mnFirstHeaderRow( 0 ), 1020*cdf0e10cSrcweir mnFirstDataRow( 0 ), 1021*cdf0e10cSrcweir mnFirstDataCol( 0 ), 1022*cdf0e10cSrcweir mnRowPageCount( 0 ), 1023*cdf0e10cSrcweir mnColPageCount( 0 ) 1024*cdf0e10cSrcweir { 1025*cdf0e10cSrcweir } 1026*cdf0e10cSrcweir 1027*cdf0e10cSrcweir // ---------------------------------------------------------------------------- 1028*cdf0e10cSrcweir 1029*cdf0e10cSrcweir PivotTable::PivotTable( const WorkbookHelper& rHelper ) : 1030*cdf0e10cSrcweir WorkbookHelper( rHelper ), 1031*cdf0e10cSrcweir maDataField( *this, OOX_PT_DATALAYOUTFIELD ), 1032*cdf0e10cSrcweir mpPivotCache( 0 ) 1033*cdf0e10cSrcweir { 1034*cdf0e10cSrcweir } 1035*cdf0e10cSrcweir 1036*cdf0e10cSrcweir void PivotTable::importPivotTableDefinition( const AttributeList& rAttribs ) 1037*cdf0e10cSrcweir { 1038*cdf0e10cSrcweir maDefModel.maName = rAttribs.getXString( XML_name, OUString() ); 1039*cdf0e10cSrcweir maDefModel.maDataCaption = rAttribs.getXString( XML_dataCaption , OUString() ); 1040*cdf0e10cSrcweir maDefModel.maGrandTotalCaption = rAttribs.getXString( XML_grandTotalCaption, OUString() ); 1041*cdf0e10cSrcweir maDefModel.maRowHeaderCaption = rAttribs.getXString( XML_rowHeaderCaption, OUString() ); 1042*cdf0e10cSrcweir maDefModel.maColHeaderCaption = rAttribs.getXString( XML_colHeaderCaption, OUString() ); 1043*cdf0e10cSrcweir maDefModel.maErrorCaption = rAttribs.getXString( XML_errorCaption, OUString() ); 1044*cdf0e10cSrcweir maDefModel.maMissingCaption = rAttribs.getXString( XML_missingCaption, OUString() ); 1045*cdf0e10cSrcweir maDefModel.maPageStyle = rAttribs.getXString( XML_pageStyle, OUString() ); 1046*cdf0e10cSrcweir maDefModel.maPivotTableStyle = rAttribs.getXString( XML_pivotTableStyle, OUString() ); 1047*cdf0e10cSrcweir maDefModel.maVacatedStyle = rAttribs.getXString( XML_vacatedStyle, OUString() ); 1048*cdf0e10cSrcweir maDefModel.maTag = rAttribs.getXString( XML_tag, OUString() ); 1049*cdf0e10cSrcweir maDefModel.mnCacheId = rAttribs.getInteger( XML_cacheId, -1 ); 1050*cdf0e10cSrcweir maDefModel.mnDataPosition = rAttribs.getInteger( XML_dataPosition, 0 ); 1051*cdf0e10cSrcweir maDefModel.mnPageWrap = rAttribs.getInteger( XML_pageWrap, 0 ); 1052*cdf0e10cSrcweir maDefModel.mnIndent = rAttribs.getInteger( XML_indent, 1 ); 1053*cdf0e10cSrcweir maDefModel.mnChartFormat = rAttribs.getInteger( XML_chartFormat, 0 ); 1054*cdf0e10cSrcweir maDefModel.mnAutoFormatId = rAttribs.getInteger( XML_autoFormatId, 0 ); 1055*cdf0e10cSrcweir maDefModel.mbDataOnRows = rAttribs.getBool( XML_dataOnRows, false ); 1056*cdf0e10cSrcweir maDefModel.mbShowError = rAttribs.getBool( XML_showError, false ); 1057*cdf0e10cSrcweir maDefModel.mbShowMissing = rAttribs.getBool( XML_showMissing, true ); 1058*cdf0e10cSrcweir maDefModel.mbShowItems = rAttribs.getBool( XML_showItems, true ); 1059*cdf0e10cSrcweir maDefModel.mbDisableFieldList = rAttribs.getBool( XML_disableFieldList, false ); 1060*cdf0e10cSrcweir maDefModel.mbShowCalcMembers = rAttribs.getBool( XML_showCalcMbrs, true ); 1061*cdf0e10cSrcweir maDefModel.mbVisualTotals = rAttribs.getBool( XML_visualTotals, true ); 1062*cdf0e10cSrcweir maDefModel.mbShowDrill = rAttribs.getBool( XML_showDrill, true ); 1063*cdf0e10cSrcweir maDefModel.mbPrintDrill = rAttribs.getBool( XML_printDrill, false ); 1064*cdf0e10cSrcweir maDefModel.mbEnableDrill = rAttribs.getBool( XML_enableDrill, true ); 1065*cdf0e10cSrcweir maDefModel.mbPreserveFormatting = rAttribs.getBool( XML_preserveFormatting, true ); 1066*cdf0e10cSrcweir maDefModel.mbUseAutoFormat = rAttribs.getBool( XML_useAutoFormatting, false ); 1067*cdf0e10cSrcweir maDefModel.mbPageOverThenDown = rAttribs.getBool( XML_pageOverThenDown, false ); 1068*cdf0e10cSrcweir maDefModel.mbSubtotalHiddenItems = rAttribs.getBool( XML_subtotalHiddenItems, false ); 1069*cdf0e10cSrcweir maDefModel.mbRowGrandTotals = rAttribs.getBool( XML_rowGrandTotals, true ); 1070*cdf0e10cSrcweir maDefModel.mbColGrandTotals = rAttribs.getBool( XML_colGrandTotals, true ); 1071*cdf0e10cSrcweir maDefModel.mbFieldPrintTitles = rAttribs.getBool( XML_fieldPrintTitles, false ); 1072*cdf0e10cSrcweir maDefModel.mbItemPrintTitles = rAttribs.getBool( XML_itemPrintTitles, false ); 1073*cdf0e10cSrcweir maDefModel.mbMergeItem = rAttribs.getBool( XML_mergeItem, false ); 1074*cdf0e10cSrcweir maDefModel.mbShowEmptyRow = rAttribs.getBool( XML_showEmptyRow, false ); 1075*cdf0e10cSrcweir maDefModel.mbShowEmptyCol = rAttribs.getBool( XML_showEmptyCol, false ); 1076*cdf0e10cSrcweir maDefModel.mbShowHeaders = rAttribs.getBool( XML_showHeaders, true ); 1077*cdf0e10cSrcweir maDefModel.mbFieldListSortAsc = rAttribs.getBool( XML_fieldListSortAscending, false ); 1078*cdf0e10cSrcweir maDefModel.mbCustomListSort = rAttribs.getBool( XML_customListSort, true ); 1079*cdf0e10cSrcweir maDefModel.mbApplyNumFmt = rAttribs.getBool( XML_applyNumberFormats, false ); 1080*cdf0e10cSrcweir maDefModel.mbApplyFont = rAttribs.getBool( XML_applyFontFormats, false ); 1081*cdf0e10cSrcweir maDefModel.mbApplyAlignment = rAttribs.getBool( XML_applyAlignmentFormats, false ); 1082*cdf0e10cSrcweir maDefModel.mbApplyBorder = rAttribs.getBool( XML_applyBorderFormats, false ); 1083*cdf0e10cSrcweir maDefModel.mbApplyFill = rAttribs.getBool( XML_applyPatternFormats, false ); 1084*cdf0e10cSrcweir // OOXML and BIFF12 documentation differ: OOXML mentions width/height, BIFF12 mentions protection 1085*cdf0e10cSrcweir maDefModel.mbApplyProtection = rAttribs.getBool( XML_applyWidthHeightFormats, false ); 1086*cdf0e10cSrcweir } 1087*cdf0e10cSrcweir 1088*cdf0e10cSrcweir void PivotTable::importLocation( const AttributeList& rAttribs, sal_Int16 nSheet ) 1089*cdf0e10cSrcweir { 1090*cdf0e10cSrcweir getAddressConverter().convertToCellRangeUnchecked( maLocationModel.maRange, rAttribs.getString( XML_ref, OUString() ), nSheet ); 1091*cdf0e10cSrcweir maLocationModel.mnFirstHeaderRow = rAttribs.getInteger( XML_firstHeaderRow, 0 ); 1092*cdf0e10cSrcweir maLocationModel.mnFirstDataRow = rAttribs.getInteger( XML_firstDataRow, 0 ); 1093*cdf0e10cSrcweir maLocationModel.mnFirstDataCol = rAttribs.getInteger( XML_firstDataCol, 0 ); 1094*cdf0e10cSrcweir maLocationModel.mnRowPageCount = rAttribs.getInteger( XML_rowPageCount, 0 ); 1095*cdf0e10cSrcweir maLocationModel.mnColPageCount = rAttribs.getInteger( XML_colPageCount, 0 ); 1096*cdf0e10cSrcweir } 1097*cdf0e10cSrcweir 1098*cdf0e10cSrcweir void PivotTable::importRowField( const AttributeList& rAttribs ) 1099*cdf0e10cSrcweir { 1100*cdf0e10cSrcweir importField( maRowFields, rAttribs ); 1101*cdf0e10cSrcweir } 1102*cdf0e10cSrcweir 1103*cdf0e10cSrcweir void PivotTable::importColField( const AttributeList& rAttribs ) 1104*cdf0e10cSrcweir { 1105*cdf0e10cSrcweir importField( maColFields, rAttribs ); 1106*cdf0e10cSrcweir } 1107*cdf0e10cSrcweir 1108*cdf0e10cSrcweir void PivotTable::importPageField( const AttributeList& rAttribs ) 1109*cdf0e10cSrcweir { 1110*cdf0e10cSrcweir PTPageFieldModel aModel; 1111*cdf0e10cSrcweir aModel.maName = rAttribs.getXString( XML_name, OUString() ); 1112*cdf0e10cSrcweir aModel.mnField = rAttribs.getInteger( XML_fld, -1 ); 1113*cdf0e10cSrcweir // specification is wrong, XML_item is not the cache item, but the field item 1114*cdf0e10cSrcweir aModel.mnItem = rAttribs.getInteger( XML_item, BIFF12_PTPAGEFIELD_MULTIITEMS ); 1115*cdf0e10cSrcweir maPageFields.push_back( aModel ); 1116*cdf0e10cSrcweir } 1117*cdf0e10cSrcweir 1118*cdf0e10cSrcweir void PivotTable::importDataField( const AttributeList& rAttribs ) 1119*cdf0e10cSrcweir { 1120*cdf0e10cSrcweir PTDataFieldModel aModel; 1121*cdf0e10cSrcweir aModel.maName = rAttribs.getXString( XML_name, OUString() ); 1122*cdf0e10cSrcweir aModel.mnField = rAttribs.getInteger( XML_fld, -1 ); 1123*cdf0e10cSrcweir aModel.mnSubtotal = rAttribs.getToken( XML_subtotal, XML_sum ); 1124*cdf0e10cSrcweir aModel.mnShowDataAs = rAttribs.getToken( XML_showDataAs, XML_normal ); 1125*cdf0e10cSrcweir aModel.mnBaseField = rAttribs.getInteger( XML_baseField, -1 ); 1126*cdf0e10cSrcweir aModel.mnBaseItem = rAttribs.getInteger( XML_baseItem, -1 ); 1127*cdf0e10cSrcweir aModel.mnNumFmtId = rAttribs.getInteger( XML_numFmtId, 0 ); 1128*cdf0e10cSrcweir maDataFields.push_back( aModel ); 1129*cdf0e10cSrcweir } 1130*cdf0e10cSrcweir 1131*cdf0e10cSrcweir void PivotTable::importPTDefinition( SequenceInputStream& rStrm ) 1132*cdf0e10cSrcweir { 1133*cdf0e10cSrcweir sal_uInt32 nFlags1, nFlags2, nFlags3; 1134*cdf0e10cSrcweir sal_uInt8 nDataAxis; 1135*cdf0e10cSrcweir rStrm >> nFlags1 >> nFlags2 >> nFlags3 >> nDataAxis; 1136*cdf0e10cSrcweir maDefModel.mnPageWrap = rStrm.readuInt8(); 1137*cdf0e10cSrcweir rStrm.skip( 2 ); // refresh versions 1138*cdf0e10cSrcweir rStrm >> maDefModel.mnDataPosition; 1139*cdf0e10cSrcweir maDefModel.mnAutoFormatId = rStrm.readuInt16(); 1140*cdf0e10cSrcweir rStrm.skip( 2 ); // unused 1141*cdf0e10cSrcweir rStrm >> maDefModel.mnChartFormat >> maDefModel.mnCacheId >> maDefModel.maName; 1142*cdf0e10cSrcweir if( getFlag( nFlags2, BIFF12_PTDEF_HASDATACAPTION ) ) 1143*cdf0e10cSrcweir rStrm >> maDefModel.maDataCaption; 1144*cdf0e10cSrcweir if( getFlag( nFlags2, BIFF12_PTDEF_HASGRANDTOTALCAPTION ) ) 1145*cdf0e10cSrcweir rStrm >> maDefModel.maGrandTotalCaption; 1146*cdf0e10cSrcweir if( !getFlag( nFlags3, BIFF12_PTDEF_NOERRORCAPTION ) ) // missing flag indicates existing string 1147*cdf0e10cSrcweir rStrm >> maDefModel.maErrorCaption; 1148*cdf0e10cSrcweir if( !getFlag( nFlags3, BIFF12_PTDEF_NOMISSINGCAPTION ) ) // missing flag indicates existing string 1149*cdf0e10cSrcweir rStrm >> maDefModel.maMissingCaption; 1150*cdf0e10cSrcweir if( getFlag( nFlags2, BIFF12_PTDEF_HASPAGESTYLE ) ) 1151*cdf0e10cSrcweir rStrm >> maDefModel.maPageStyle; 1152*cdf0e10cSrcweir if( getFlag( nFlags2, BIFF12_PTDEF_HASPIVOTTABLESTYLE ) ) 1153*cdf0e10cSrcweir rStrm >> maDefModel.maPivotTableStyle; 1154*cdf0e10cSrcweir if( getFlag( nFlags2, BIFF12_PTDEF_HASVACATEDSTYLE ) ) 1155*cdf0e10cSrcweir rStrm >> maDefModel.maVacatedStyle; 1156*cdf0e10cSrcweir if( getFlag( nFlags2, BIFF12_PTDEF_HASTAG ) ) 1157*cdf0e10cSrcweir rStrm >> maDefModel.maTag; 1158*cdf0e10cSrcweir if( getFlag( nFlags3, BIFF12_PTDEF_HASCOLHEADERCAPTION ) ) // TODO: right order (col/row)? spec is unclear 1159*cdf0e10cSrcweir rStrm >> maDefModel.maColHeaderCaption; 1160*cdf0e10cSrcweir if( getFlag( nFlags3, BIFF12_PTDEF_HASROWHEADERCAPTION ) ) 1161*cdf0e10cSrcweir rStrm >> maDefModel.maRowHeaderCaption; 1162*cdf0e10cSrcweir 1163*cdf0e10cSrcweir OSL_ENSURE( (nDataAxis == BIFF12_PTDEF_ROWAXIS) || (nDataAxis == BIFF12_PTDEF_COLAXIS), 1164*cdf0e10cSrcweir "PivotTable::importPTDefinition - unexpected axis position for data field" ); 1165*cdf0e10cSrcweir 1166*cdf0e10cSrcweir maDefModel.mnIndent = extractValue< sal_uInt8 >( nFlags1, 24, 7 ); 1167*cdf0e10cSrcweir maDefModel.mbDataOnRows = nDataAxis == BIFF12_PTDEF_ROWAXIS; 1168*cdf0e10cSrcweir maDefModel.mbShowError = getFlag( nFlags2, BIFF12_PTDEF_SHOWERROR ); 1169*cdf0e10cSrcweir maDefModel.mbShowMissing = getFlag( nFlags2, BIFF12_PTDEF_SHOWMISSING ); 1170*cdf0e10cSrcweir maDefModel.mbShowItems = getFlag( nFlags1, BIFF12_PTDEF_SHOWITEMS ); 1171*cdf0e10cSrcweir maDefModel.mbDisableFieldList = getFlag( nFlags1, BIFF12_PTDEF_DISABLEFIELDLIST ); 1172*cdf0e10cSrcweir maDefModel.mbShowCalcMembers = !getFlag( nFlags1, BIFF12_PTDEF_HIDECALCMEMBERS ); 1173*cdf0e10cSrcweir maDefModel.mbVisualTotals = !getFlag( nFlags1, BIFF12_PTDEF_WITHHIDDENTOTALS ); 1174*cdf0e10cSrcweir maDefModel.mbShowDrill = !getFlag( nFlags1, BIFF12_PTDEF_HIDEDRILL ); 1175*cdf0e10cSrcweir maDefModel.mbPrintDrill = getFlag( nFlags1, BIFF12_PTDEF_PRINTDRILL ); 1176*cdf0e10cSrcweir maDefModel.mbEnableDrill = getFlag( nFlags2, BIFF12_PTDEF_ENABLEDRILL ); 1177*cdf0e10cSrcweir maDefModel.mbPreserveFormatting = getFlag( nFlags2, BIFF12_PTDEF_PRESERVEFORMATTING ); 1178*cdf0e10cSrcweir maDefModel.mbUseAutoFormat = getFlag( nFlags2, BIFF12_PTDEF_USEAUTOFORMAT ); 1179*cdf0e10cSrcweir maDefModel.mbPageOverThenDown = getFlag( nFlags2, BIFF12_PTDEF_PAGEOVERTHENDOWN ); 1180*cdf0e10cSrcweir maDefModel.mbSubtotalHiddenItems = getFlag( nFlags2, BIFF12_PTDEF_SUBTOTALHIDDENITEMS ); 1181*cdf0e10cSrcweir maDefModel.mbRowGrandTotals = getFlag( nFlags2, BIFF12_PTDEF_ROWGRANDTOTALS ); 1182*cdf0e10cSrcweir maDefModel.mbColGrandTotals = getFlag( nFlags2, BIFF12_PTDEF_COLGRANDTOTALS ); 1183*cdf0e10cSrcweir maDefModel.mbFieldPrintTitles = getFlag( nFlags2, BIFF12_PTDEF_FIELDPRINTTITLES ); 1184*cdf0e10cSrcweir maDefModel.mbItemPrintTitles = getFlag( nFlags2, BIFF12_PTDEF_ITEMPRINTTITLES ); 1185*cdf0e10cSrcweir maDefModel.mbMergeItem = getFlag( nFlags2, BIFF12_PTDEF_MERGEITEM ); 1186*cdf0e10cSrcweir maDefModel.mbApplyNumFmt = getFlag( nFlags2, BIFF12_PTDEF_APPLYNUMFMT ); 1187*cdf0e10cSrcweir maDefModel.mbApplyFont = getFlag( nFlags2, BIFF12_PTDEF_APPLYFONT ); 1188*cdf0e10cSrcweir maDefModel.mbApplyAlignment = getFlag( nFlags2, BIFF12_PTDEF_APPLYALIGNMENT ); 1189*cdf0e10cSrcweir maDefModel.mbApplyBorder = getFlag( nFlags2, BIFF12_PTDEF_APPLYBORDER ); 1190*cdf0e10cSrcweir maDefModel.mbApplyFill = getFlag( nFlags2, BIFF12_PTDEF_APPLYFILL ); 1191*cdf0e10cSrcweir maDefModel.mbApplyProtection = getFlag( nFlags2, BIFF12_PTDEF_APPLYPROTECTION ); 1192*cdf0e10cSrcweir maDefModel.mbShowEmptyRow = getFlag( nFlags2, BIFF12_PTDEF_SHOWEMPTYROW ); 1193*cdf0e10cSrcweir maDefModel.mbShowEmptyCol = getFlag( nFlags2, BIFF12_PTDEF_SHOWEMPTYCOL ); 1194*cdf0e10cSrcweir maDefModel.mbShowHeaders = !getFlag( nFlags1, BIFF12_PTDEF_HIDEHEADERS ); 1195*cdf0e10cSrcweir maDefModel.mbFieldListSortAsc = getFlag( nFlags3, BIFF12_PTDEF_FIELDLISTSORTASC ); 1196*cdf0e10cSrcweir maDefModel.mbCustomListSort = !getFlag( nFlags3, BIFF12_PTDEF_NOCUSTOMLISTSORT ); 1197*cdf0e10cSrcweir } 1198*cdf0e10cSrcweir 1199*cdf0e10cSrcweir void PivotTable::importPTLocation( SequenceInputStream& rStrm, sal_Int16 nSheet ) 1200*cdf0e10cSrcweir { 1201*cdf0e10cSrcweir BinRange aBinRange; 1202*cdf0e10cSrcweir rStrm >> aBinRange >> maLocationModel.mnFirstHeaderRow 1203*cdf0e10cSrcweir >> maLocationModel.mnFirstDataRow >> maLocationModel.mnFirstDataCol 1204*cdf0e10cSrcweir >> maLocationModel.mnRowPageCount >> maLocationModel.mnColPageCount; 1205*cdf0e10cSrcweir getAddressConverter().convertToCellRangeUnchecked( maLocationModel.maRange, aBinRange, nSheet ); 1206*cdf0e10cSrcweir } 1207*cdf0e10cSrcweir 1208*cdf0e10cSrcweir void PivotTable::importPTRowFields( SequenceInputStream& rStrm ) 1209*cdf0e10cSrcweir { 1210*cdf0e10cSrcweir importFields( maRowFields, rStrm ); 1211*cdf0e10cSrcweir } 1212*cdf0e10cSrcweir 1213*cdf0e10cSrcweir void PivotTable::importPTColFields( SequenceInputStream& rStrm ) 1214*cdf0e10cSrcweir { 1215*cdf0e10cSrcweir importFields( maColFields, rStrm ); 1216*cdf0e10cSrcweir } 1217*cdf0e10cSrcweir 1218*cdf0e10cSrcweir void PivotTable::importPTPageField( SequenceInputStream& rStrm ) 1219*cdf0e10cSrcweir { 1220*cdf0e10cSrcweir PTPageFieldModel aModel; 1221*cdf0e10cSrcweir sal_uInt8 nFlags; 1222*cdf0e10cSrcweir rStrm >> aModel.mnField >> aModel.mnItem; 1223*cdf0e10cSrcweir rStrm.skip( 4 ); // hierarchy 1224*cdf0e10cSrcweir rStrm >> nFlags; 1225*cdf0e10cSrcweir if( getFlag( nFlags, BIFF12_PTPAGEFIELD_HASNAME ) ) 1226*cdf0e10cSrcweir rStrm >> aModel.maName; 1227*cdf0e10cSrcweir maPageFields.push_back( aModel ); 1228*cdf0e10cSrcweir } 1229*cdf0e10cSrcweir 1230*cdf0e10cSrcweir void PivotTable::importPTDataField( SequenceInputStream& rStrm ) 1231*cdf0e10cSrcweir { 1232*cdf0e10cSrcweir PTDataFieldModel aModel; 1233*cdf0e10cSrcweir sal_Int32 nSubtotal, nShowDataAs; 1234*cdf0e10cSrcweir sal_uInt8 nHasName; 1235*cdf0e10cSrcweir rStrm >> aModel.mnField >> nSubtotal >> nShowDataAs >> aModel.mnBaseField >> aModel.mnBaseItem >> aModel.mnNumFmtId >> nHasName; 1236*cdf0e10cSrcweir if( nHasName == 1 ) 1237*cdf0e10cSrcweir rStrm >> aModel.maName; 1238*cdf0e10cSrcweir aModel.setBiffSubtotal( nSubtotal ); 1239*cdf0e10cSrcweir aModel.setBiffShowDataAs( nShowDataAs ); 1240*cdf0e10cSrcweir maDataFields.push_back( aModel ); 1241*cdf0e10cSrcweir } 1242*cdf0e10cSrcweir 1243*cdf0e10cSrcweir void PivotTable::importPTDefinition( BiffInputStream& rStrm, sal_Int16 nSheet ) 1244*cdf0e10cSrcweir { 1245*cdf0e10cSrcweir BinRange aBinRange; 1246*cdf0e10cSrcweir sal_uInt16 nFlags, nTabNameLen, nDataNameLen; 1247*cdf0e10cSrcweir rStrm >> aBinRange; 1248*cdf0e10cSrcweir maLocationModel.mnFirstHeaderRow = rStrm.readuInt16(); 1249*cdf0e10cSrcweir maLocationModel.mnFirstDataRow = rStrm.readuInt16(); 1250*cdf0e10cSrcweir maLocationModel.mnFirstDataCol = rStrm.readuInt16(); 1251*cdf0e10cSrcweir maDefModel.mnCacheId = rStrm.readuInt16(); 1252*cdf0e10cSrcweir rStrm.skip( 2 ); // unused 1253*cdf0e10cSrcweir maDefModel.mbDataOnRows = rStrm.readuInt16() == BIFF_PTDEF_ROWAXIS; 1254*cdf0e10cSrcweir maDefModel.mnDataPosition = rStrm.readInt16(); 1255*cdf0e10cSrcweir rStrm.skip( 2 ); // number of fields 1256*cdf0e10cSrcweir rStrm >> maDefModel.mnRowFields >> maDefModel.mnColFields; 1257*cdf0e10cSrcweir rStrm.skip( 8 ); // number of page fields, data fields, data rows, data columns 1258*cdf0e10cSrcweir rStrm >> nFlags; 1259*cdf0e10cSrcweir maDefModel.mnChartFormat = rStrm.readuInt16(); 1260*cdf0e10cSrcweir rStrm >> nTabNameLen >> nDataNameLen; 1261*cdf0e10cSrcweir maDefModel.maName = lclReadPivotString( *this, rStrm, nTabNameLen ); 1262*cdf0e10cSrcweir maDefModel.maDataCaption = lclReadPivotString( *this, rStrm, nDataNameLen ); 1263*cdf0e10cSrcweir 1264*cdf0e10cSrcweir maDefModel.mbRowGrandTotals = getFlag( nFlags, BIFF_PTDEF_ROWGRANDTOTALS ); 1265*cdf0e10cSrcweir maDefModel.mbColGrandTotals = getFlag( nFlags, BIFF_PTDEF_COLGRANDTOTALS ); 1266*cdf0e10cSrcweir 1267*cdf0e10cSrcweir getAddressConverter().convertToCellRangeUnchecked( maLocationModel.maRange, aBinRange, nSheet ); 1268*cdf0e10cSrcweir } 1269*cdf0e10cSrcweir 1270*cdf0e10cSrcweir void PivotTable::importPTDefinition2( BiffInputStream& rStrm ) 1271*cdf0e10cSrcweir { 1272*cdf0e10cSrcweir if( getBiff() == BIFF8 ) 1273*cdf0e10cSrcweir { 1274*cdf0e10cSrcweir sal_uInt16 nErrCaptLen, nMissCaptLen, nTagLen, nPageStyleLen, nTabStyleLen, nVacStyleLen; 1275*cdf0e10cSrcweir sal_uInt32 nFlags; 1276*cdf0e10cSrcweir rStrm.skip( 2 ); // number of formatting records 1277*cdf0e10cSrcweir rStrm >> nErrCaptLen >> nMissCaptLen >> nTagLen; 1278*cdf0e10cSrcweir rStrm.skip( 6 ); // number of selection records, page rows, page columns 1279*cdf0e10cSrcweir rStrm >> nFlags >> nPageStyleLen >> nTabStyleLen >> nVacStyleLen; 1280*cdf0e10cSrcweir maDefModel.maErrorCaption = lclReadPivotString( *this, rStrm, nErrCaptLen ); 1281*cdf0e10cSrcweir maDefModel.maMissingCaption = lclReadPivotString( *this, rStrm, nMissCaptLen ); 1282*cdf0e10cSrcweir maDefModel.maTag = lclReadPivotString( *this, rStrm, nTagLen ); 1283*cdf0e10cSrcweir maDefModel.maPageStyle = lclReadPivotString( *this, rStrm, nPageStyleLen ); 1284*cdf0e10cSrcweir maDefModel.maPivotTableStyle = lclReadPivotString( *this, rStrm, nTabStyleLen ); 1285*cdf0e10cSrcweir maDefModel.maVacatedStyle = lclReadPivotString( *this, rStrm, nVacStyleLen ); 1286*cdf0e10cSrcweir 1287*cdf0e10cSrcweir maDefModel.mbShowError = getFlag( nFlags, BIFF_PTDEF2_SHOWERROR ); 1288*cdf0e10cSrcweir maDefModel.mbShowMissing = getFlag( nFlags, BIFF_PTDEF2_SHOWMISSING ); 1289*cdf0e10cSrcweir maDefModel.mbEnableDrill = getFlag( nFlags, BIFF_PTDE2F_ENABLEDRILL ); 1290*cdf0e10cSrcweir maDefModel.mbPreserveFormatting = getFlag( nFlags, BIFF_PTDEF2_PRESERVEFORMATTING ); 1291*cdf0e10cSrcweir maDefModel.mbPageOverThenDown = getFlag( nFlags, BIFF_PTDEF2_PAGEOVERTHENDOWN ); 1292*cdf0e10cSrcweir maDefModel.mbSubtotalHiddenItems = getFlag( nFlags, BIFF_PTDEF2_SUBTOTALHIDDENITEMS ); 1293*cdf0e10cSrcweir maDefModel.mbMergeItem = getFlag( nFlags, BIFF_PTDEF2_MERGEITEM ); 1294*cdf0e10cSrcweir } 1295*cdf0e10cSrcweir } 1296*cdf0e10cSrcweir 1297*cdf0e10cSrcweir void PivotTable::importPTRowColFields( BiffInputStream& rStrm ) 1298*cdf0e10cSrcweir { 1299*cdf0e10cSrcweir // first PTROWCOLFIELDS record contains row fields unless there are no row fields 1300*cdf0e10cSrcweir if( (maDefModel.mnRowFields > 0) && maRowFields.empty() ) 1301*cdf0e10cSrcweir importFields( maRowFields, rStrm, maDefModel.mnRowFields ); 1302*cdf0e10cSrcweir else if( (maDefModel.mnColFields > 0) && maColFields.empty() ) 1303*cdf0e10cSrcweir importFields( maColFields, rStrm, maDefModel.mnColFields ); 1304*cdf0e10cSrcweir } 1305*cdf0e10cSrcweir 1306*cdf0e10cSrcweir void PivotTable::importPTPageFields( BiffInputStream& rStrm ) 1307*cdf0e10cSrcweir { 1308*cdf0e10cSrcweir while( rStrm.getRemaining() >= 6 ) 1309*cdf0e10cSrcweir { 1310*cdf0e10cSrcweir PTPageFieldModel aModel; 1311*cdf0e10cSrcweir sal_Int16 nField, nItem; 1312*cdf0e10cSrcweir rStrm >> nField >> nItem; 1313*cdf0e10cSrcweir rStrm.skip( 2 ); // dropdown object ID 1314*cdf0e10cSrcweir aModel.mnField = nField; 1315*cdf0e10cSrcweir aModel.mnItem = (nItem == BIFF_PTPAGEFIELDS_ALLITEMS) ? BIFF12_PTPAGEFIELD_MULTIITEMS : nItem; 1316*cdf0e10cSrcweir maPageFields.push_back( aModel ); 1317*cdf0e10cSrcweir } 1318*cdf0e10cSrcweir } 1319*cdf0e10cSrcweir 1320*cdf0e10cSrcweir void PivotTable::importPTDataField( BiffInputStream& rStrm ) 1321*cdf0e10cSrcweir { 1322*cdf0e10cSrcweir PTDataFieldModel aModel; 1323*cdf0e10cSrcweir sal_Int16 nField, nBaseField, nBaseItem; 1324*cdf0e10cSrcweir sal_uInt16 nSubtotal, nShowDataAs, nNumFmt, nNameLen; 1325*cdf0e10cSrcweir rStrm >> nField >> nSubtotal >> nShowDataAs >> nBaseField >> nBaseItem >> nNumFmt >> nNameLen; 1326*cdf0e10cSrcweir aModel.maName = lclReadPivotString( *this, rStrm, nNameLen ); 1327*cdf0e10cSrcweir 1328*cdf0e10cSrcweir aModel.mnField = nField; 1329*cdf0e10cSrcweir aModel.setBiffSubtotal( nSubtotal ); 1330*cdf0e10cSrcweir aModel.setBiffShowDataAs( nShowDataAs ); 1331*cdf0e10cSrcweir aModel.mnBaseField = nBaseField; 1332*cdf0e10cSrcweir switch( nBaseItem ) 1333*cdf0e10cSrcweir { 1334*cdf0e10cSrcweir case BIFF_PTDATAFIELD_PREVIOUS: aModel.mnBaseItem = OOX_PT_PREVIOUS_ITEM; break; 1335*cdf0e10cSrcweir case BIFF_PTDATAFIELD_NEXT: aModel.mnBaseItem = OOX_PT_NEXT_ITEM; break; 1336*cdf0e10cSrcweir default: aModel.mnBaseItem = nBaseItem; 1337*cdf0e10cSrcweir } 1338*cdf0e10cSrcweir aModel.mnNumFmtId = nNumFmt; 1339*cdf0e10cSrcweir 1340*cdf0e10cSrcweir maDataFields.push_back( aModel ); 1341*cdf0e10cSrcweir } 1342*cdf0e10cSrcweir 1343*cdf0e10cSrcweir PivotTableField& PivotTable::createTableField() 1344*cdf0e10cSrcweir { 1345*cdf0e10cSrcweir sal_Int32 nFieldIndex = static_cast< sal_Int32 >( maFields.size() ); 1346*cdf0e10cSrcweir PivotTableFieldVector::value_type xTableField( new PivotTableField( *this, nFieldIndex ) ); 1347*cdf0e10cSrcweir maFields.push_back( xTableField ); 1348*cdf0e10cSrcweir return *xTableField; 1349*cdf0e10cSrcweir } 1350*cdf0e10cSrcweir 1351*cdf0e10cSrcweir PivotTableFilter& PivotTable::createTableFilter() 1352*cdf0e10cSrcweir { 1353*cdf0e10cSrcweir PivotTableFilterVector::value_type xTableFilter( new PivotTableFilter( *this ) ); 1354*cdf0e10cSrcweir maFilters.push_back( xTableFilter ); 1355*cdf0e10cSrcweir return *xTableFilter; 1356*cdf0e10cSrcweir } 1357*cdf0e10cSrcweir 1358*cdf0e10cSrcweir void PivotTable::finalizeImport() 1359*cdf0e10cSrcweir { 1360*cdf0e10cSrcweir if( getAddressConverter().validateCellRange( maLocationModel.maRange, true, true ) ) 1361*cdf0e10cSrcweir { 1362*cdf0e10cSrcweir mpPivotCache = getPivotCaches().importPivotCacheFragment( maDefModel.mnCacheId ); 1363*cdf0e10cSrcweir if( mpPivotCache && mpPivotCache->isValidDataSource() && (maDefModel.maName.getLength() > 0) ) 1364*cdf0e10cSrcweir { 1365*cdf0e10cSrcweir // clear destination area of the original pivot table 1366*cdf0e10cSrcweir try 1367*cdf0e10cSrcweir { 1368*cdf0e10cSrcweir Reference< XSheetOperation > xSheetOp( getCellRangeFromDoc( maLocationModel.maRange ), UNO_QUERY_THROW ); 1369*cdf0e10cSrcweir using namespace ::com::sun::star::sheet::CellFlags; 1370*cdf0e10cSrcweir xSheetOp->clearContents( VALUE | DATETIME | STRING | FORMULA | HARDATTR | STYLES | EDITATTR | FORMATTED ); 1371*cdf0e10cSrcweir } 1372*cdf0e10cSrcweir catch( Exception& ) 1373*cdf0e10cSrcweir { 1374*cdf0e10cSrcweir } 1375*cdf0e10cSrcweir 1376*cdf0e10cSrcweir try 1377*cdf0e10cSrcweir { 1378*cdf0e10cSrcweir // create a new data pilot descriptor based on the source data 1379*cdf0e10cSrcweir Reference< XDataPilotTablesSupplier > xDPTablesSupp( getSheetFromDoc( maLocationModel.maRange.Sheet ), UNO_QUERY_THROW ); 1380*cdf0e10cSrcweir Reference< XDataPilotTables > xDPTables( xDPTablesSupp->getDataPilotTables(), UNO_SET_THROW ); 1381*cdf0e10cSrcweir mxDPDescriptor.set( xDPTables->createDataPilotDescriptor(), UNO_SET_THROW ); 1382*cdf0e10cSrcweir mxDPDescriptor->setSourceRange( mpPivotCache->getSourceRange() ); 1383*cdf0e10cSrcweir mxDPDescriptor->setTag( maDefModel.maTag ); 1384*cdf0e10cSrcweir 1385*cdf0e10cSrcweir // global data pilot properties 1386*cdf0e10cSrcweir PropertySet aDescProp( mxDPDescriptor ); 1387*cdf0e10cSrcweir aDescProp.setProperty( PROP_ColumnGrand, maDefModel.mbColGrandTotals ); 1388*cdf0e10cSrcweir aDescProp.setProperty( PROP_RowGrand, maDefModel.mbRowGrandTotals ); 1389*cdf0e10cSrcweir aDescProp.setProperty( PROP_ShowFilterButton, false ); 1390*cdf0e10cSrcweir aDescProp.setProperty( PROP_DrillDownOnDoubleClick, maDefModel.mbEnableDrill ); 1391*cdf0e10cSrcweir 1392*cdf0e10cSrcweir // finalize all fields, this finds field names and creates grouping fields 1393*cdf0e10cSrcweir maFields.forEachMem( &PivotTableField::finalizeImport, ::boost::cref( mxDPDescriptor ) ); 1394*cdf0e10cSrcweir 1395*cdf0e10cSrcweir // all row fields 1396*cdf0e10cSrcweir for( IndexVector::iterator aIt = maRowFields.begin(), aEnd = maRowFields.end(); aIt != aEnd; ++aIt ) 1397*cdf0e10cSrcweir if( PivotTableField* pField = getTableField( *aIt ) ) 1398*cdf0e10cSrcweir pField->convertRowField(); 1399*cdf0e10cSrcweir 1400*cdf0e10cSrcweir // all column fields 1401*cdf0e10cSrcweir for( IndexVector::iterator aIt = maColFields.begin(), aEnd = maColFields.end(); aIt != aEnd; ++aIt ) 1402*cdf0e10cSrcweir if( PivotTableField* pField = getTableField( *aIt ) ) 1403*cdf0e10cSrcweir pField->convertColField(); 1404*cdf0e10cSrcweir 1405*cdf0e10cSrcweir // all page fields 1406*cdf0e10cSrcweir for( PageFieldVector::iterator aIt = maPageFields.begin(), aEnd = maPageFields.end(); aIt != aEnd; ++aIt ) 1407*cdf0e10cSrcweir if( PivotTableField* pField = getTableField( aIt->mnField ) ) 1408*cdf0e10cSrcweir pField->convertPageField( *aIt ); 1409*cdf0e10cSrcweir 1410*cdf0e10cSrcweir // all hidden fields 1411*cdf0e10cSrcweir ::std::set< sal_Int32 > aVisFields; 1412*cdf0e10cSrcweir aVisFields.insert( maRowFields.begin(), maRowFields.end() ); 1413*cdf0e10cSrcweir aVisFields.insert( maColFields.begin(), maColFields.end() ); 1414*cdf0e10cSrcweir for( PageFieldVector::iterator aIt = maPageFields.begin(), aEnd = maPageFields.end(); aIt != aEnd; ++aIt ) 1415*cdf0e10cSrcweir aVisFields.insert( aIt->mnField ); 1416*cdf0e10cSrcweir for( PivotTableFieldVector::iterator aBeg = maFields.begin(), aIt = aBeg, aEnd = maFields.end(); aIt != aEnd; ++aIt ) 1417*cdf0e10cSrcweir if( aVisFields.count( static_cast< sal_Int32 >( aIt - aBeg ) ) == 0 ) 1418*cdf0e10cSrcweir (*aIt)->convertHiddenField(); 1419*cdf0e10cSrcweir 1420*cdf0e10cSrcweir // all data fields 1421*cdf0e10cSrcweir for( DataFieldVector::iterator aIt = maDataFields.begin(), aEnd = maDataFields.end(); aIt != aEnd; ++aIt ) 1422*cdf0e10cSrcweir if( PivotTableField* pField = getTableField( aIt->mnField ) ) 1423*cdf0e10cSrcweir pField->convertDataField( *aIt ); 1424*cdf0e10cSrcweir 1425*cdf0e10cSrcweir // filters 1426*cdf0e10cSrcweir maFilters.forEachMem( &PivotTableFilter::finalizeImport ); 1427*cdf0e10cSrcweir 1428*cdf0e10cSrcweir // calculate base position of table 1429*cdf0e10cSrcweir CellAddress aPos( maLocationModel.maRange.Sheet, maLocationModel.maRange.StartColumn, maLocationModel.maRange.StartRow ); 1430*cdf0e10cSrcweir /* If page fields exist, include them into the destination 1431*cdf0e10cSrcweir area (they are excluded in Excel). Add an extra blank row. */ 1432*cdf0e10cSrcweir if( !maPageFields.empty() ) 1433*cdf0e10cSrcweir aPos.Row = ::std::max< sal_Int32 >( static_cast< sal_Int32 >( aPos.Row - maPageFields.size() - 1 ), 0 ); 1434*cdf0e10cSrcweir 1435*cdf0e10cSrcweir // insert the DataPilot table into the sheet 1436*cdf0e10cSrcweir xDPTables->insertNewByName( maDefModel.maName, aPos, mxDPDescriptor ); 1437*cdf0e10cSrcweir } 1438*cdf0e10cSrcweir catch( Exception& ) 1439*cdf0e10cSrcweir { 1440*cdf0e10cSrcweir OSL_ENSURE( false, "PivotTable::finalizeImport - exception while creating the DataPilot table" ); 1441*cdf0e10cSrcweir } 1442*cdf0e10cSrcweir } 1443*cdf0e10cSrcweir } 1444*cdf0e10cSrcweir } 1445*cdf0e10cSrcweir 1446*cdf0e10cSrcweir void PivotTable::finalizeDateGroupingImport( const Reference< XDataPilotField >& rxBaseDPField, sal_Int32 nBaseFieldIdx ) 1447*cdf0e10cSrcweir { 1448*cdf0e10cSrcweir // process all fields, there is no chaining information in the cache fields 1449*cdf0e10cSrcweir maFields.forEachMem( &PivotTableField::finalizeDateGroupingImport, ::boost::cref( rxBaseDPField ), nBaseFieldIdx ); 1450*cdf0e10cSrcweir } 1451*cdf0e10cSrcweir 1452*cdf0e10cSrcweir void PivotTable::finalizeParentGroupingImport( const Reference< XDataPilotField >& rxBaseDPField, 1453*cdf0e10cSrcweir const PivotCacheField& rBaseCacheField, PivotCacheGroupItemVector& orItemNames ) 1454*cdf0e10cSrcweir { 1455*cdf0e10cSrcweir // try to create parent group fields that group the items of the passed base field 1456*cdf0e10cSrcweir if( PivotTableField* pParentTableField = maFields.get( rBaseCacheField.getParentGroupField() ).get() ) 1457*cdf0e10cSrcweir pParentTableField->finalizeParentGroupingImport( rxBaseDPField, orItemNames ); 1458*cdf0e10cSrcweir } 1459*cdf0e10cSrcweir 1460*cdf0e10cSrcweir Reference< XDataPilotField > PivotTable::getDataPilotField( const OUString& rFieldName ) const 1461*cdf0e10cSrcweir { 1462*cdf0e10cSrcweir Reference< XDataPilotField > xDPField; 1463*cdf0e10cSrcweir if( (rFieldName.getLength() > 0) && mxDPDescriptor.is() ) try 1464*cdf0e10cSrcweir { 1465*cdf0e10cSrcweir Reference< XNameAccess > xDPFieldsNA( mxDPDescriptor->getDataPilotFields(), UNO_QUERY_THROW ); 1466*cdf0e10cSrcweir xDPField.set( xDPFieldsNA->getByName( rFieldName ), UNO_QUERY ); 1467*cdf0e10cSrcweir } 1468*cdf0e10cSrcweir catch( Exception& ) 1469*cdf0e10cSrcweir { 1470*cdf0e10cSrcweir } 1471*cdf0e10cSrcweir return xDPField; 1472*cdf0e10cSrcweir } 1473*cdf0e10cSrcweir 1474*cdf0e10cSrcweir Reference< XDataPilotField > PivotTable::getDataPilotField( sal_Int32 nFieldIdx ) const 1475*cdf0e10cSrcweir { 1476*cdf0e10cSrcweir Reference< XDataPilotField > xDPField; 1477*cdf0e10cSrcweir if( const PivotTableField* pTableField = maFields.get( nFieldIdx ).get() ) 1478*cdf0e10cSrcweir xDPField = getDataPilotField( pTableField->getDPFieldName() ); 1479*cdf0e10cSrcweir return xDPField; 1480*cdf0e10cSrcweir } 1481*cdf0e10cSrcweir 1482*cdf0e10cSrcweir Reference< XDataPilotField > PivotTable::getDataLayoutField() const 1483*cdf0e10cSrcweir { 1484*cdf0e10cSrcweir Reference< XDataPilotField > xDPField; 1485*cdf0e10cSrcweir try 1486*cdf0e10cSrcweir { 1487*cdf0e10cSrcweir Reference< XDataPilotDataLayoutFieldSupplier > xDPDataFieldSupp( mxDPDescriptor, UNO_QUERY_THROW ); 1488*cdf0e10cSrcweir xDPField = xDPDataFieldSupp->getDataLayoutField(); 1489*cdf0e10cSrcweir } 1490*cdf0e10cSrcweir catch( Exception& ) 1491*cdf0e10cSrcweir { 1492*cdf0e10cSrcweir } 1493*cdf0e10cSrcweir return xDPField; 1494*cdf0e10cSrcweir } 1495*cdf0e10cSrcweir 1496*cdf0e10cSrcweir const PivotCacheField* PivotTable::getCacheField( sal_Int32 nFieldIdx ) const 1497*cdf0e10cSrcweir { 1498*cdf0e10cSrcweir return mpPivotCache ? mpPivotCache->getCacheField( nFieldIdx ) : 0; 1499*cdf0e10cSrcweir } 1500*cdf0e10cSrcweir 1501*cdf0e10cSrcweir const PivotCacheField* PivotTable::getCacheFieldOfDataField( sal_Int32 nDataItemIdx ) const 1502*cdf0e10cSrcweir { 1503*cdf0e10cSrcweir const PTDataFieldModel* pDataField = ContainerHelper::getVectorElement( maDataFields, nDataItemIdx ); 1504*cdf0e10cSrcweir return pDataField ? getCacheField( pDataField->mnField ) : 0; 1505*cdf0e10cSrcweir } 1506*cdf0e10cSrcweir 1507*cdf0e10cSrcweir sal_Int32 PivotTable::getCacheDatabaseIndex( sal_Int32 nFieldIdx ) const 1508*cdf0e10cSrcweir { 1509*cdf0e10cSrcweir return mpPivotCache ? mpPivotCache->getCacheDatabaseIndex( nFieldIdx ) : -1; 1510*cdf0e10cSrcweir } 1511*cdf0e10cSrcweir 1512*cdf0e10cSrcweir // private -------------------------------------------------------------------- 1513*cdf0e10cSrcweir 1514*cdf0e10cSrcweir PivotTableField* PivotTable::getTableField( sal_Int32 nFieldIdx ) 1515*cdf0e10cSrcweir { 1516*cdf0e10cSrcweir return (nFieldIdx == OOX_PT_DATALAYOUTFIELD) ? &maDataField : maFields.get( nFieldIdx ).get(); 1517*cdf0e10cSrcweir } 1518*cdf0e10cSrcweir 1519*cdf0e10cSrcweir void PivotTable::importField( IndexVector& orFields, const AttributeList& rAttribs ) 1520*cdf0e10cSrcweir { 1521*cdf0e10cSrcweir orFields.push_back( rAttribs.getInteger( XML_x, -1 ) ); 1522*cdf0e10cSrcweir } 1523*cdf0e10cSrcweir 1524*cdf0e10cSrcweir void PivotTable::importFields( IndexVector& orFields, SequenceInputStream& rStrm ) 1525*cdf0e10cSrcweir { 1526*cdf0e10cSrcweir OSL_ENSURE( orFields.empty(), "PivotTable::importFields - multiple record instances" ); 1527*cdf0e10cSrcweir orFields.clear(); 1528*cdf0e10cSrcweir sal_Int32 nCount = rStrm.readInt32(); 1529*cdf0e10cSrcweir OSL_ENSURE( 4 * nCount == rStrm.getRemaining(), "PivotTable::importFields - invalid field count" ); 1530*cdf0e10cSrcweir nCount = static_cast< sal_Int32 >( rStrm.getRemaining() / 4 ); 1531*cdf0e10cSrcweir for( sal_Int32 nIdx = 0; nIdx < nCount; ++nIdx ) 1532*cdf0e10cSrcweir orFields.push_back( rStrm.readInt32() ); 1533*cdf0e10cSrcweir } 1534*cdf0e10cSrcweir 1535*cdf0e10cSrcweir void PivotTable::importFields( IndexVector& orFields, BiffInputStream& rStrm, sal_Int32 nCount ) 1536*cdf0e10cSrcweir { 1537*cdf0e10cSrcweir OSL_ENSURE( orFields.empty(), "PivotTable::importFields - multiple record instances" ); 1538*cdf0e10cSrcweir orFields.clear(); 1539*cdf0e10cSrcweir OSL_ENSURE( 2 * nCount == rStrm.getRemaining(), "PivotTable::importFields - invalid field count" ); 1540*cdf0e10cSrcweir nCount = static_cast< sal_Int32 >( rStrm.getRemaining() / 2 ); 1541*cdf0e10cSrcweir for( sal_Int32 nIdx = 0; nIdx < nCount; ++nIdx ) 1542*cdf0e10cSrcweir orFields.push_back( rStrm.readInt16() ); 1543*cdf0e10cSrcweir } 1544*cdf0e10cSrcweir 1545*cdf0e10cSrcweir // ============================================================================ 1546*cdf0e10cSrcweir 1547*cdf0e10cSrcweir PivotTableBuffer::PivotTableBuffer( const WorkbookHelper& rHelper ) : 1548*cdf0e10cSrcweir WorkbookHelper( rHelper ) 1549*cdf0e10cSrcweir { 1550*cdf0e10cSrcweir } 1551*cdf0e10cSrcweir 1552*cdf0e10cSrcweir PivotTable& PivotTableBuffer::createPivotTable() 1553*cdf0e10cSrcweir { 1554*cdf0e10cSrcweir PivotTableVector::value_type xTable( new PivotTable( *this ) ); 1555*cdf0e10cSrcweir maTables.push_back( xTable ); 1556*cdf0e10cSrcweir return *xTable; 1557*cdf0e10cSrcweir } 1558*cdf0e10cSrcweir 1559*cdf0e10cSrcweir void PivotTableBuffer::finalizeImport() 1560*cdf0e10cSrcweir { 1561*cdf0e10cSrcweir maTables.forEachMem( &PivotTable::finalizeImport ); 1562*cdf0e10cSrcweir } 1563*cdf0e10cSrcweir 1564*cdf0e10cSrcweir // ============================================================================ 1565*cdf0e10cSrcweir 1566*cdf0e10cSrcweir } // namespace xls 1567*cdf0e10cSrcweir } // namespace oox 1568