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/pivottablefragment.hxx"
29*cdf0e10cSrcweir 
30*cdf0e10cSrcweir #include "oox/xls/biffinputstream.hxx"
31*cdf0e10cSrcweir #include "oox/xls/pivottablebuffer.hxx"
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir namespace oox {
34*cdf0e10cSrcweir namespace xls {
35*cdf0e10cSrcweir 
36*cdf0e10cSrcweir // ============================================================================
37*cdf0e10cSrcweir 
38*cdf0e10cSrcweir using namespace ::oox::core;
39*cdf0e10cSrcweir 
40*cdf0e10cSrcweir using ::rtl::OUString;
41*cdf0e10cSrcweir 
42*cdf0e10cSrcweir // ============================================================================
43*cdf0e10cSrcweir 
44*cdf0e10cSrcweir PivotTableFieldContext::PivotTableFieldContext( WorksheetFragmentBase& rFragment, PivotTableField& rTableField ) :
45*cdf0e10cSrcweir     WorksheetContextBase( rFragment ),
46*cdf0e10cSrcweir     mrTableField( rTableField )
47*cdf0e10cSrcweir {
48*cdf0e10cSrcweir }
49*cdf0e10cSrcweir 
50*cdf0e10cSrcweir ContextHandlerRef PivotTableFieldContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs )
51*cdf0e10cSrcweir {
52*cdf0e10cSrcweir     switch( getCurrentElement() )
53*cdf0e10cSrcweir     {
54*cdf0e10cSrcweir         case XLS_TOKEN( pivotField ):
55*cdf0e10cSrcweir             switch( nElement )
56*cdf0e10cSrcweir             {
57*cdf0e10cSrcweir                 case XLS_TOKEN( items ):            return this;
58*cdf0e10cSrcweir                 case XLS_TOKEN( autoSortScope ):    return this;
59*cdf0e10cSrcweir             }
60*cdf0e10cSrcweir         break;
61*cdf0e10cSrcweir         case XLS_TOKEN( items ):
62*cdf0e10cSrcweir             if( nElement == XLS_TOKEN( item ) ) mrTableField.importItem( rAttribs );
63*cdf0e10cSrcweir         break;
64*cdf0e10cSrcweir         case XLS_TOKEN( autoSortScope ):
65*cdf0e10cSrcweir             if( nElement == XLS_TOKEN( pivotArea ) ) return this;
66*cdf0e10cSrcweir         break;
67*cdf0e10cSrcweir         case XLS_TOKEN( pivotArea ):
68*cdf0e10cSrcweir             if( nElement == XLS_TOKEN( references ) ) return this;
69*cdf0e10cSrcweir         break;
70*cdf0e10cSrcweir         case XLS_TOKEN( references ):
71*cdf0e10cSrcweir             if( nElement == XLS_TOKEN( reference ) ) { mrTableField.importReference( rAttribs ); return this; }
72*cdf0e10cSrcweir         break;
73*cdf0e10cSrcweir         case XLS_TOKEN( reference ):
74*cdf0e10cSrcweir             if( nElement == XLS_TOKEN( x ) ) mrTableField.importReferenceItem( rAttribs );
75*cdf0e10cSrcweir         break;
76*cdf0e10cSrcweir     }
77*cdf0e10cSrcweir     return 0;
78*cdf0e10cSrcweir }
79*cdf0e10cSrcweir 
80*cdf0e10cSrcweir void PivotTableFieldContext::onStartElement( const AttributeList& rAttribs )
81*cdf0e10cSrcweir {
82*cdf0e10cSrcweir     if( isRootElement() )
83*cdf0e10cSrcweir         mrTableField.importPivotField( rAttribs );
84*cdf0e10cSrcweir }
85*cdf0e10cSrcweir 
86*cdf0e10cSrcweir ContextHandlerRef PivotTableFieldContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm )
87*cdf0e10cSrcweir {
88*cdf0e10cSrcweir     switch( getCurrentElement() )
89*cdf0e10cSrcweir     {
90*cdf0e10cSrcweir         case BIFF12_ID_PTFIELD:
91*cdf0e10cSrcweir             switch( nRecId )
92*cdf0e10cSrcweir             {
93*cdf0e10cSrcweir                 case BIFF12_ID_PTFITEMS:        return this;
94*cdf0e10cSrcweir                 case BIFF12_ID_AUTOSORTSCOPE:   return this;
95*cdf0e10cSrcweir             }
96*cdf0e10cSrcweir         break;
97*cdf0e10cSrcweir         case BIFF12_ID_PTFITEMS:
98*cdf0e10cSrcweir             if( nRecId == BIFF12_ID_PTFITEM ) mrTableField.importPTFItem( rStrm );
99*cdf0e10cSrcweir         break;
100*cdf0e10cSrcweir         case BIFF12_ID_AUTOSORTSCOPE:
101*cdf0e10cSrcweir             if( nRecId == BIFF12_ID_PIVOTAREA ) return this;
102*cdf0e10cSrcweir         break;
103*cdf0e10cSrcweir         case BIFF12_ID_PIVOTAREA:
104*cdf0e10cSrcweir             if( nRecId == BIFF12_ID_PTREFERENCES ) return this;
105*cdf0e10cSrcweir         break;
106*cdf0e10cSrcweir         case BIFF12_ID_PTREFERENCES:
107*cdf0e10cSrcweir             if( nRecId == BIFF12_ID_PTREFERENCE ) { mrTableField.importPTReference( rStrm ); return this; }
108*cdf0e10cSrcweir         break;
109*cdf0e10cSrcweir         case BIFF12_ID_PTREFERENCE:
110*cdf0e10cSrcweir             if( nRecId == BIFF12_ID_PTREFERENCEITEM ) mrTableField.importPTReferenceItem( rStrm );
111*cdf0e10cSrcweir         break;
112*cdf0e10cSrcweir     }
113*cdf0e10cSrcweir     return 0;
114*cdf0e10cSrcweir }
115*cdf0e10cSrcweir 
116*cdf0e10cSrcweir void PivotTableFieldContext::onStartRecord( SequenceInputStream& rStrm )
117*cdf0e10cSrcweir {
118*cdf0e10cSrcweir     if( isRootElement() )
119*cdf0e10cSrcweir         mrTableField.importPTField( rStrm );
120*cdf0e10cSrcweir }
121*cdf0e10cSrcweir 
122*cdf0e10cSrcweir // ============================================================================
123*cdf0e10cSrcweir 
124*cdf0e10cSrcweir PivotTableFilterContext::PivotTableFilterContext( WorksheetFragmentBase& rFragment, PivotTableFilter& rTableFilter ) :
125*cdf0e10cSrcweir     WorksheetContextBase( rFragment ),
126*cdf0e10cSrcweir     mrTableFilter( rTableFilter )
127*cdf0e10cSrcweir {
128*cdf0e10cSrcweir }
129*cdf0e10cSrcweir 
130*cdf0e10cSrcweir ContextHandlerRef PivotTableFilterContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs )
131*cdf0e10cSrcweir {
132*cdf0e10cSrcweir     switch( getCurrentElement() )
133*cdf0e10cSrcweir     {
134*cdf0e10cSrcweir         case XLS_TOKEN( filter ):
135*cdf0e10cSrcweir             if( nElement == XLS_TOKEN( autoFilter ) ) return this;
136*cdf0e10cSrcweir         break;
137*cdf0e10cSrcweir         case XLS_TOKEN( autoFilter ):
138*cdf0e10cSrcweir             if( nElement == XLS_TOKEN( filterColumn ) ) return this;
139*cdf0e10cSrcweir         break;
140*cdf0e10cSrcweir         case XLS_TOKEN( filterColumn ):
141*cdf0e10cSrcweir             if( nElement == XLS_TOKEN( top10 ) ) mrTableFilter.importTop10( rAttribs );
142*cdf0e10cSrcweir         break;
143*cdf0e10cSrcweir     }
144*cdf0e10cSrcweir     return 0;
145*cdf0e10cSrcweir }
146*cdf0e10cSrcweir 
147*cdf0e10cSrcweir void PivotTableFilterContext::onStartElement( const AttributeList& rAttribs )
148*cdf0e10cSrcweir {
149*cdf0e10cSrcweir     if( isRootElement() )
150*cdf0e10cSrcweir         mrTableFilter.importFilter( rAttribs );
151*cdf0e10cSrcweir }
152*cdf0e10cSrcweir 
153*cdf0e10cSrcweir ContextHandlerRef PivotTableFilterContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm )
154*cdf0e10cSrcweir {
155*cdf0e10cSrcweir     switch( getCurrentElement() )
156*cdf0e10cSrcweir     {
157*cdf0e10cSrcweir         case BIFF12_ID_PTFILTER:
158*cdf0e10cSrcweir             if( nRecId == BIFF12_ID_AUTOFILTER ) return this;
159*cdf0e10cSrcweir         break;
160*cdf0e10cSrcweir         case BIFF12_ID_AUTOFILTER:
161*cdf0e10cSrcweir             if( nRecId == BIFF12_ID_FILTERCOLUMN ) return this;
162*cdf0e10cSrcweir         break;
163*cdf0e10cSrcweir         case BIFF12_ID_FILTERCOLUMN:
164*cdf0e10cSrcweir             if( nRecId == BIFF12_ID_TOP10FILTER ) mrTableFilter.importTop10Filter( rStrm );
165*cdf0e10cSrcweir         break;
166*cdf0e10cSrcweir     }
167*cdf0e10cSrcweir     return 0;
168*cdf0e10cSrcweir }
169*cdf0e10cSrcweir 
170*cdf0e10cSrcweir void PivotTableFilterContext::onStartRecord( SequenceInputStream& rStrm )
171*cdf0e10cSrcweir {
172*cdf0e10cSrcweir     if( isRootElement() )
173*cdf0e10cSrcweir         mrTableFilter.importPTFilter( rStrm );
174*cdf0e10cSrcweir }
175*cdf0e10cSrcweir 
176*cdf0e10cSrcweir // ============================================================================
177*cdf0e10cSrcweir 
178*cdf0e10cSrcweir PivotTableFragment::PivotTableFragment( const WorksheetHelper& rHelper, const OUString& rFragmentPath ) :
179*cdf0e10cSrcweir     WorksheetFragmentBase( rHelper, rFragmentPath ),
180*cdf0e10cSrcweir     mrPivotTable( getPivotTables().createPivotTable() )
181*cdf0e10cSrcweir {
182*cdf0e10cSrcweir }
183*cdf0e10cSrcweir 
184*cdf0e10cSrcweir ContextHandlerRef PivotTableFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs )
185*cdf0e10cSrcweir {
186*cdf0e10cSrcweir     switch( getCurrentElement() )
187*cdf0e10cSrcweir     {
188*cdf0e10cSrcweir         case XML_ROOT_CONTEXT:
189*cdf0e10cSrcweir             if( nElement == XLS_TOKEN( pivotTableDefinition ) ) { mrPivotTable.importPivotTableDefinition( rAttribs ); return this; }
190*cdf0e10cSrcweir         break;
191*cdf0e10cSrcweir 
192*cdf0e10cSrcweir         case XLS_TOKEN( pivotTableDefinition ):
193*cdf0e10cSrcweir             switch( nElement )
194*cdf0e10cSrcweir             {
195*cdf0e10cSrcweir                 case XLS_TOKEN( location ):     mrPivotTable.importLocation( rAttribs, getSheetIndex() );   break;
196*cdf0e10cSrcweir                 case XLS_TOKEN( pivotFields ):  return this;
197*cdf0e10cSrcweir                 case XLS_TOKEN( rowFields ):    return this;
198*cdf0e10cSrcweir                 case XLS_TOKEN( colFields ):    return this;
199*cdf0e10cSrcweir                 case XLS_TOKEN( pageFields ):   return this;
200*cdf0e10cSrcweir                 case XLS_TOKEN( dataFields ):   return this;
201*cdf0e10cSrcweir                 case XLS_TOKEN( filters ):      return this;
202*cdf0e10cSrcweir             }
203*cdf0e10cSrcweir         break;
204*cdf0e10cSrcweir 
205*cdf0e10cSrcweir         case XLS_TOKEN( pivotFields ):
206*cdf0e10cSrcweir             if( nElement == XLS_TOKEN( pivotField ) ) return new PivotTableFieldContext( *this, mrPivotTable.createTableField() );
207*cdf0e10cSrcweir         break;
208*cdf0e10cSrcweir         case XLS_TOKEN( rowFields ):
209*cdf0e10cSrcweir             if( nElement == XLS_TOKEN( field ) ) mrPivotTable.importRowField( rAttribs );
210*cdf0e10cSrcweir         break;
211*cdf0e10cSrcweir         case XLS_TOKEN( colFields ):
212*cdf0e10cSrcweir             if( nElement == XLS_TOKEN( field ) ) mrPivotTable.importColField( rAttribs );
213*cdf0e10cSrcweir         break;
214*cdf0e10cSrcweir         case XLS_TOKEN( pageFields ):
215*cdf0e10cSrcweir             if( nElement == XLS_TOKEN( pageField ) ) mrPivotTable.importPageField( rAttribs );
216*cdf0e10cSrcweir         break;
217*cdf0e10cSrcweir         case XLS_TOKEN( dataFields ):
218*cdf0e10cSrcweir             if( nElement == XLS_TOKEN( dataField ) ) mrPivotTable.importDataField( rAttribs );
219*cdf0e10cSrcweir         break;
220*cdf0e10cSrcweir         case XLS_TOKEN( filters ):
221*cdf0e10cSrcweir             if( nElement == XLS_TOKEN( filter ) ) return new PivotTableFilterContext( *this, mrPivotTable.createTableFilter() );
222*cdf0e10cSrcweir         break;
223*cdf0e10cSrcweir     }
224*cdf0e10cSrcweir     return 0;
225*cdf0e10cSrcweir }
226*cdf0e10cSrcweir 
227*cdf0e10cSrcweir ContextHandlerRef PivotTableFragment::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm )
228*cdf0e10cSrcweir {
229*cdf0e10cSrcweir     switch( getCurrentElement() )
230*cdf0e10cSrcweir     {
231*cdf0e10cSrcweir         case XML_ROOT_CONTEXT:
232*cdf0e10cSrcweir             if( nRecId == BIFF12_ID_PTDEFINITION ) { mrPivotTable.importPTDefinition( rStrm ); return this; }
233*cdf0e10cSrcweir         break;
234*cdf0e10cSrcweir 
235*cdf0e10cSrcweir         case BIFF12_ID_PTDEFINITION:
236*cdf0e10cSrcweir             switch( nRecId )
237*cdf0e10cSrcweir             {
238*cdf0e10cSrcweir                 case BIFF12_ID_PTLOCATION:      mrPivotTable.importPTLocation( rStrm, getSheetIndex() );    break;
239*cdf0e10cSrcweir                 case BIFF12_ID_PTFIELDS:        return this;
240*cdf0e10cSrcweir                 case BIFF12_ID_PTROWFIELDS:     mrPivotTable.importPTRowFields( rStrm );                    break;
241*cdf0e10cSrcweir                 case BIFF12_ID_PTCOLFIELDS:     mrPivotTable.importPTColFields( rStrm );                    break;
242*cdf0e10cSrcweir                 case BIFF12_ID_PTPAGEFIELDS:    return this;
243*cdf0e10cSrcweir                 case BIFF12_ID_PTDATAFIELDS:    return this;
244*cdf0e10cSrcweir                 case BIFF12_ID_PTFILTERS:       return this;
245*cdf0e10cSrcweir             }
246*cdf0e10cSrcweir         break;
247*cdf0e10cSrcweir 
248*cdf0e10cSrcweir         case BIFF12_ID_PTFIELDS:
249*cdf0e10cSrcweir             if( nRecId == BIFF12_ID_PTFIELD ) return new PivotTableFieldContext( *this, mrPivotTable.createTableField() );
250*cdf0e10cSrcweir         break;
251*cdf0e10cSrcweir         case BIFF12_ID_PTPAGEFIELDS:
252*cdf0e10cSrcweir             if( nRecId == BIFF12_ID_PTPAGEFIELD ) mrPivotTable.importPTPageField( rStrm );
253*cdf0e10cSrcweir         break;
254*cdf0e10cSrcweir         case BIFF12_ID_PTDATAFIELDS:
255*cdf0e10cSrcweir             if( nRecId == BIFF12_ID_PTDATAFIELD ) mrPivotTable.importPTDataField( rStrm );
256*cdf0e10cSrcweir         break;
257*cdf0e10cSrcweir         case BIFF12_ID_PTFILTERS:
258*cdf0e10cSrcweir             if( nRecId == BIFF12_ID_PTFILTER ) return new PivotTableFilterContext( *this, mrPivotTable.createTableFilter() );
259*cdf0e10cSrcweir         break;
260*cdf0e10cSrcweir     }
261*cdf0e10cSrcweir     return 0;
262*cdf0e10cSrcweir }
263*cdf0e10cSrcweir 
264*cdf0e10cSrcweir const RecordInfo* PivotTableFragment::getRecordInfos() const
265*cdf0e10cSrcweir {
266*cdf0e10cSrcweir     static const RecordInfo spRecInfos[] =
267*cdf0e10cSrcweir     {
268*cdf0e10cSrcweir         { BIFF12_ID_AUTOFILTER,         BIFF12_ID_AUTOFILTER + 1        },
269*cdf0e10cSrcweir         { BIFF12_ID_AUTOSORTSCOPE,      BIFF12_ID_AUTOSORTSCOPE + 1     },
270*cdf0e10cSrcweir         { BIFF12_ID_FILTERCOLUMN,       BIFF12_ID_FILTERCOLUMN + 1      },
271*cdf0e10cSrcweir         { BIFF12_ID_PIVOTAREA,          BIFF12_ID_PIVOTAREA + 1         },
272*cdf0e10cSrcweir         { BIFF12_ID_PTCOLFIELDS,        BIFF12_ID_PTCOLFIELDS + 1       },
273*cdf0e10cSrcweir         { BIFF12_ID_PTDATAFIELD,        BIFF12_ID_PTDATAFIELD + 1       },
274*cdf0e10cSrcweir         { BIFF12_ID_PTDATAFIELDS,       BIFF12_ID_PTDATAFIELDS + 1      },
275*cdf0e10cSrcweir         { BIFF12_ID_PTDEFINITION,       BIFF12_ID_PTDEFINITION + 35     },
276*cdf0e10cSrcweir         { BIFF12_ID_PTFIELD,            BIFF12_ID_PTFIELD + 1           },
277*cdf0e10cSrcweir         { BIFF12_ID_PTFIELDS,           BIFF12_ID_PTFIELDS + 1          },
278*cdf0e10cSrcweir         { BIFF12_ID_PTFILTER,           BIFF12_ID_PTFILTER + 1          },
279*cdf0e10cSrcweir         { BIFF12_ID_PTFILTERS,          BIFF12_ID_PTFILTERS + 1         },
280*cdf0e10cSrcweir         { BIFF12_ID_PTFITEM,            BIFF12_ID_PTFITEM - 1           },
281*cdf0e10cSrcweir         { BIFF12_ID_PTFITEMS,           BIFF12_ID_PTFITEMS + 1          },
282*cdf0e10cSrcweir         { BIFF12_ID_PTLOCATION,         BIFF12_ID_PTLOCATION - 1        },
283*cdf0e10cSrcweir         { BIFF12_ID_PTPAGEFIELD,        BIFF12_ID_PTPAGEFIELD + 1       },
284*cdf0e10cSrcweir         { BIFF12_ID_PTPAGEFIELDS,       BIFF12_ID_PTPAGEFIELDS + 1      },
285*cdf0e10cSrcweir         { BIFF12_ID_PTREFERENCE,        BIFF12_ID_PTREFERENCE + 1       },
286*cdf0e10cSrcweir         { BIFF12_ID_PTREFERENCEITEM,    BIFF12_ID_PTREFERENCEITEM + 1   },
287*cdf0e10cSrcweir         { BIFF12_ID_PTREFERENCES,       BIFF12_ID_PTREFERENCES + 1      },
288*cdf0e10cSrcweir         { BIFF12_ID_PTROWFIELDS,        BIFF12_ID_PTROWFIELDS + 1       },
289*cdf0e10cSrcweir         { -1,                           -1                              }
290*cdf0e10cSrcweir     };
291*cdf0e10cSrcweir     return spRecInfos;
292*cdf0e10cSrcweir }
293*cdf0e10cSrcweir 
294*cdf0e10cSrcweir // ============================================================================
295*cdf0e10cSrcweir // ============================================================================
296*cdf0e10cSrcweir 
297*cdf0e10cSrcweir BiffPivotTableContext::BiffPivotTableContext( const WorksheetHelper& rHelper ) :
298*cdf0e10cSrcweir     BiffWorksheetContextBase( rHelper ),
299*cdf0e10cSrcweir     mrPivotTable( getPivotTables().createPivotTable() )
300*cdf0e10cSrcweir {
301*cdf0e10cSrcweir }
302*cdf0e10cSrcweir 
303*cdf0e10cSrcweir void BiffPivotTableContext::importRecord( BiffInputStream& rStrm )
304*cdf0e10cSrcweir {
305*cdf0e10cSrcweir     switch( rStrm.getRecId() )
306*cdf0e10cSrcweir     {
307*cdf0e10cSrcweir         case BIFF_ID_PTDEFINITION:      mrPivotTable.importPTDefinition( rStrm, getSheetIndex() );  break;
308*cdf0e10cSrcweir         case BIFF_ID_PTDEFINITION2:     mrPivotTable.importPTDefinition2( rStrm );                  break;
309*cdf0e10cSrcweir         case BIFF_ID_PTFIELD:           mrPivotTable.createTableField().importPTField( rStrm );     break;
310*cdf0e10cSrcweir         case BIFF_ID_PTROWCOLFIELDS:    mrPivotTable.importPTRowColFields( rStrm );                 break;
311*cdf0e10cSrcweir         case BIFF_ID_PTPAGEFIELDS:      mrPivotTable.importPTPageFields( rStrm );                   break;
312*cdf0e10cSrcweir         case BIFF_ID_PTDATAFIELD:       mrPivotTable.importPTDataField( rStrm );                    break;
313*cdf0e10cSrcweir     }
314*cdf0e10cSrcweir }
315*cdf0e10cSrcweir 
316*cdf0e10cSrcweir // ============================================================================
317*cdf0e10cSrcweir 
318*cdf0e10cSrcweir } // namespace xls
319*cdf0e10cSrcweir } // namespace oox
320