1*ca5ec200SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*ca5ec200SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*ca5ec200SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*ca5ec200SAndrew Rist  * distributed with this work for additional information
6*ca5ec200SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*ca5ec200SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*ca5ec200SAndrew Rist  * "License"); you may not use this file except in compliance
9*ca5ec200SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*ca5ec200SAndrew Rist  *
11*ca5ec200SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*ca5ec200SAndrew Rist  *
13*ca5ec200SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*ca5ec200SAndrew Rist  * software distributed under the License is distributed on an
15*ca5ec200SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*ca5ec200SAndrew Rist  * KIND, either express or implied.  See the License for the
17*ca5ec200SAndrew Rist  * specific language governing permissions and limitations
18*ca5ec200SAndrew Rist  * under the License.
19*ca5ec200SAndrew Rist  *
20*ca5ec200SAndrew Rist  *************************************************************/
21*ca5ec200SAndrew Rist 
22*ca5ec200SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #include "oox/xls/pivottablefragment.hxx"
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include "oox/xls/biffinputstream.hxx"
27cdf0e10cSrcweir #include "oox/xls/pivottablebuffer.hxx"
28cdf0e10cSrcweir 
29cdf0e10cSrcweir namespace oox {
30cdf0e10cSrcweir namespace xls {
31cdf0e10cSrcweir 
32cdf0e10cSrcweir // ============================================================================
33cdf0e10cSrcweir 
34cdf0e10cSrcweir using namespace ::oox::core;
35cdf0e10cSrcweir 
36cdf0e10cSrcweir using ::rtl::OUString;
37cdf0e10cSrcweir 
38cdf0e10cSrcweir // ============================================================================
39cdf0e10cSrcweir 
PivotTableFieldContext(WorksheetFragmentBase & rFragment,PivotTableField & rTableField)40cdf0e10cSrcweir PivotTableFieldContext::PivotTableFieldContext( WorksheetFragmentBase& rFragment, PivotTableField& rTableField ) :
41cdf0e10cSrcweir     WorksheetContextBase( rFragment ),
42cdf0e10cSrcweir     mrTableField( rTableField )
43cdf0e10cSrcweir {
44cdf0e10cSrcweir }
45cdf0e10cSrcweir 
onCreateContext(sal_Int32 nElement,const AttributeList & rAttribs)46cdf0e10cSrcweir ContextHandlerRef PivotTableFieldContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs )
47cdf0e10cSrcweir {
48cdf0e10cSrcweir     switch( getCurrentElement() )
49cdf0e10cSrcweir     {
50cdf0e10cSrcweir         case XLS_TOKEN( pivotField ):
51cdf0e10cSrcweir             switch( nElement )
52cdf0e10cSrcweir             {
53cdf0e10cSrcweir                 case XLS_TOKEN( items ):            return this;
54cdf0e10cSrcweir                 case XLS_TOKEN( autoSortScope ):    return this;
55cdf0e10cSrcweir             }
56cdf0e10cSrcweir         break;
57cdf0e10cSrcweir         case XLS_TOKEN( items ):
58cdf0e10cSrcweir             if( nElement == XLS_TOKEN( item ) ) mrTableField.importItem( rAttribs );
59cdf0e10cSrcweir         break;
60cdf0e10cSrcweir         case XLS_TOKEN( autoSortScope ):
61cdf0e10cSrcweir             if( nElement == XLS_TOKEN( pivotArea ) ) return this;
62cdf0e10cSrcweir         break;
63cdf0e10cSrcweir         case XLS_TOKEN( pivotArea ):
64cdf0e10cSrcweir             if( nElement == XLS_TOKEN( references ) ) return this;
65cdf0e10cSrcweir         break;
66cdf0e10cSrcweir         case XLS_TOKEN( references ):
67cdf0e10cSrcweir             if( nElement == XLS_TOKEN( reference ) ) { mrTableField.importReference( rAttribs ); return this; }
68cdf0e10cSrcweir         break;
69cdf0e10cSrcweir         case XLS_TOKEN( reference ):
70cdf0e10cSrcweir             if( nElement == XLS_TOKEN( x ) ) mrTableField.importReferenceItem( rAttribs );
71cdf0e10cSrcweir         break;
72cdf0e10cSrcweir     }
73cdf0e10cSrcweir     return 0;
74cdf0e10cSrcweir }
75cdf0e10cSrcweir 
onStartElement(const AttributeList & rAttribs)76cdf0e10cSrcweir void PivotTableFieldContext::onStartElement( const AttributeList& rAttribs )
77cdf0e10cSrcweir {
78cdf0e10cSrcweir     if( isRootElement() )
79cdf0e10cSrcweir         mrTableField.importPivotField( rAttribs );
80cdf0e10cSrcweir }
81cdf0e10cSrcweir 
onCreateRecordContext(sal_Int32 nRecId,SequenceInputStream & rStrm)82cdf0e10cSrcweir ContextHandlerRef PivotTableFieldContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm )
83cdf0e10cSrcweir {
84cdf0e10cSrcweir     switch( getCurrentElement() )
85cdf0e10cSrcweir     {
86cdf0e10cSrcweir         case BIFF12_ID_PTFIELD:
87cdf0e10cSrcweir             switch( nRecId )
88cdf0e10cSrcweir             {
89cdf0e10cSrcweir                 case BIFF12_ID_PTFITEMS:        return this;
90cdf0e10cSrcweir                 case BIFF12_ID_AUTOSORTSCOPE:   return this;
91cdf0e10cSrcweir             }
92cdf0e10cSrcweir         break;
93cdf0e10cSrcweir         case BIFF12_ID_PTFITEMS:
94cdf0e10cSrcweir             if( nRecId == BIFF12_ID_PTFITEM ) mrTableField.importPTFItem( rStrm );
95cdf0e10cSrcweir         break;
96cdf0e10cSrcweir         case BIFF12_ID_AUTOSORTSCOPE:
97cdf0e10cSrcweir             if( nRecId == BIFF12_ID_PIVOTAREA ) return this;
98cdf0e10cSrcweir         break;
99cdf0e10cSrcweir         case BIFF12_ID_PIVOTAREA:
100cdf0e10cSrcweir             if( nRecId == BIFF12_ID_PTREFERENCES ) return this;
101cdf0e10cSrcweir         break;
102cdf0e10cSrcweir         case BIFF12_ID_PTREFERENCES:
103cdf0e10cSrcweir             if( nRecId == BIFF12_ID_PTREFERENCE ) { mrTableField.importPTReference( rStrm ); return this; }
104cdf0e10cSrcweir         break;
105cdf0e10cSrcweir         case BIFF12_ID_PTREFERENCE:
106cdf0e10cSrcweir             if( nRecId == BIFF12_ID_PTREFERENCEITEM ) mrTableField.importPTReferenceItem( rStrm );
107cdf0e10cSrcweir         break;
108cdf0e10cSrcweir     }
109cdf0e10cSrcweir     return 0;
110cdf0e10cSrcweir }
111cdf0e10cSrcweir 
onStartRecord(SequenceInputStream & rStrm)112cdf0e10cSrcweir void PivotTableFieldContext::onStartRecord( SequenceInputStream& rStrm )
113cdf0e10cSrcweir {
114cdf0e10cSrcweir     if( isRootElement() )
115cdf0e10cSrcweir         mrTableField.importPTField( rStrm );
116cdf0e10cSrcweir }
117cdf0e10cSrcweir 
118cdf0e10cSrcweir // ============================================================================
119cdf0e10cSrcweir 
PivotTableFilterContext(WorksheetFragmentBase & rFragment,PivotTableFilter & rTableFilter)120cdf0e10cSrcweir PivotTableFilterContext::PivotTableFilterContext( WorksheetFragmentBase& rFragment, PivotTableFilter& rTableFilter ) :
121cdf0e10cSrcweir     WorksheetContextBase( rFragment ),
122cdf0e10cSrcweir     mrTableFilter( rTableFilter )
123cdf0e10cSrcweir {
124cdf0e10cSrcweir }
125cdf0e10cSrcweir 
onCreateContext(sal_Int32 nElement,const AttributeList & rAttribs)126cdf0e10cSrcweir ContextHandlerRef PivotTableFilterContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs )
127cdf0e10cSrcweir {
128cdf0e10cSrcweir     switch( getCurrentElement() )
129cdf0e10cSrcweir     {
130cdf0e10cSrcweir         case XLS_TOKEN( filter ):
131cdf0e10cSrcweir             if( nElement == XLS_TOKEN( autoFilter ) ) return this;
132cdf0e10cSrcweir         break;
133cdf0e10cSrcweir         case XLS_TOKEN( autoFilter ):
134cdf0e10cSrcweir             if( nElement == XLS_TOKEN( filterColumn ) ) return this;
135cdf0e10cSrcweir         break;
136cdf0e10cSrcweir         case XLS_TOKEN( filterColumn ):
137cdf0e10cSrcweir             if( nElement == XLS_TOKEN( top10 ) ) mrTableFilter.importTop10( rAttribs );
138cdf0e10cSrcweir         break;
139cdf0e10cSrcweir     }
140cdf0e10cSrcweir     return 0;
141cdf0e10cSrcweir }
142cdf0e10cSrcweir 
onStartElement(const AttributeList & rAttribs)143cdf0e10cSrcweir void PivotTableFilterContext::onStartElement( const AttributeList& rAttribs )
144cdf0e10cSrcweir {
145cdf0e10cSrcweir     if( isRootElement() )
146cdf0e10cSrcweir         mrTableFilter.importFilter( rAttribs );
147cdf0e10cSrcweir }
148cdf0e10cSrcweir 
onCreateRecordContext(sal_Int32 nRecId,SequenceInputStream & rStrm)149cdf0e10cSrcweir ContextHandlerRef PivotTableFilterContext::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm )
150cdf0e10cSrcweir {
151cdf0e10cSrcweir     switch( getCurrentElement() )
152cdf0e10cSrcweir     {
153cdf0e10cSrcweir         case BIFF12_ID_PTFILTER:
154cdf0e10cSrcweir             if( nRecId == BIFF12_ID_AUTOFILTER ) return this;
155cdf0e10cSrcweir         break;
156cdf0e10cSrcweir         case BIFF12_ID_AUTOFILTER:
157cdf0e10cSrcweir             if( nRecId == BIFF12_ID_FILTERCOLUMN ) return this;
158cdf0e10cSrcweir         break;
159cdf0e10cSrcweir         case BIFF12_ID_FILTERCOLUMN:
160cdf0e10cSrcweir             if( nRecId == BIFF12_ID_TOP10FILTER ) mrTableFilter.importTop10Filter( rStrm );
161cdf0e10cSrcweir         break;
162cdf0e10cSrcweir     }
163cdf0e10cSrcweir     return 0;
164cdf0e10cSrcweir }
165cdf0e10cSrcweir 
onStartRecord(SequenceInputStream & rStrm)166cdf0e10cSrcweir void PivotTableFilterContext::onStartRecord( SequenceInputStream& rStrm )
167cdf0e10cSrcweir {
168cdf0e10cSrcweir     if( isRootElement() )
169cdf0e10cSrcweir         mrTableFilter.importPTFilter( rStrm );
170cdf0e10cSrcweir }
171cdf0e10cSrcweir 
172cdf0e10cSrcweir // ============================================================================
173cdf0e10cSrcweir 
PivotTableFragment(const WorksheetHelper & rHelper,const OUString & rFragmentPath)174cdf0e10cSrcweir PivotTableFragment::PivotTableFragment( const WorksheetHelper& rHelper, const OUString& rFragmentPath ) :
175cdf0e10cSrcweir     WorksheetFragmentBase( rHelper, rFragmentPath ),
176cdf0e10cSrcweir     mrPivotTable( getPivotTables().createPivotTable() )
177cdf0e10cSrcweir {
178cdf0e10cSrcweir }
179cdf0e10cSrcweir 
onCreateContext(sal_Int32 nElement,const AttributeList & rAttribs)180cdf0e10cSrcweir ContextHandlerRef PivotTableFragment::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs )
181cdf0e10cSrcweir {
182cdf0e10cSrcweir     switch( getCurrentElement() )
183cdf0e10cSrcweir     {
184cdf0e10cSrcweir         case XML_ROOT_CONTEXT:
185cdf0e10cSrcweir             if( nElement == XLS_TOKEN( pivotTableDefinition ) ) { mrPivotTable.importPivotTableDefinition( rAttribs ); return this; }
186cdf0e10cSrcweir         break;
187cdf0e10cSrcweir 
188cdf0e10cSrcweir         case XLS_TOKEN( pivotTableDefinition ):
189cdf0e10cSrcweir             switch( nElement )
190cdf0e10cSrcweir             {
191cdf0e10cSrcweir                 case XLS_TOKEN( location ):     mrPivotTable.importLocation( rAttribs, getSheetIndex() );   break;
192cdf0e10cSrcweir                 case XLS_TOKEN( pivotFields ):  return this;
193cdf0e10cSrcweir                 case XLS_TOKEN( rowFields ):    return this;
194cdf0e10cSrcweir                 case XLS_TOKEN( colFields ):    return this;
195cdf0e10cSrcweir                 case XLS_TOKEN( pageFields ):   return this;
196cdf0e10cSrcweir                 case XLS_TOKEN( dataFields ):   return this;
197cdf0e10cSrcweir                 case XLS_TOKEN( filters ):      return this;
198cdf0e10cSrcweir             }
199cdf0e10cSrcweir         break;
200cdf0e10cSrcweir 
201cdf0e10cSrcweir         case XLS_TOKEN( pivotFields ):
202cdf0e10cSrcweir             if( nElement == XLS_TOKEN( pivotField ) ) return new PivotTableFieldContext( *this, mrPivotTable.createTableField() );
203cdf0e10cSrcweir         break;
204cdf0e10cSrcweir         case XLS_TOKEN( rowFields ):
205cdf0e10cSrcweir             if( nElement == XLS_TOKEN( field ) ) mrPivotTable.importRowField( rAttribs );
206cdf0e10cSrcweir         break;
207cdf0e10cSrcweir         case XLS_TOKEN( colFields ):
208cdf0e10cSrcweir             if( nElement == XLS_TOKEN( field ) ) mrPivotTable.importColField( rAttribs );
209cdf0e10cSrcweir         break;
210cdf0e10cSrcweir         case XLS_TOKEN( pageFields ):
211cdf0e10cSrcweir             if( nElement == XLS_TOKEN( pageField ) ) mrPivotTable.importPageField( rAttribs );
212cdf0e10cSrcweir         break;
213cdf0e10cSrcweir         case XLS_TOKEN( dataFields ):
214cdf0e10cSrcweir             if( nElement == XLS_TOKEN( dataField ) ) mrPivotTable.importDataField( rAttribs );
215cdf0e10cSrcweir         break;
216cdf0e10cSrcweir         case XLS_TOKEN( filters ):
217cdf0e10cSrcweir             if( nElement == XLS_TOKEN( filter ) ) return new PivotTableFilterContext( *this, mrPivotTable.createTableFilter() );
218cdf0e10cSrcweir         break;
219cdf0e10cSrcweir     }
220cdf0e10cSrcweir     return 0;
221cdf0e10cSrcweir }
222cdf0e10cSrcweir 
onCreateRecordContext(sal_Int32 nRecId,SequenceInputStream & rStrm)223cdf0e10cSrcweir ContextHandlerRef PivotTableFragment::onCreateRecordContext( sal_Int32 nRecId, SequenceInputStream& rStrm )
224cdf0e10cSrcweir {
225cdf0e10cSrcweir     switch( getCurrentElement() )
226cdf0e10cSrcweir     {
227cdf0e10cSrcweir         case XML_ROOT_CONTEXT:
228cdf0e10cSrcweir             if( nRecId == BIFF12_ID_PTDEFINITION ) { mrPivotTable.importPTDefinition( rStrm ); return this; }
229cdf0e10cSrcweir         break;
230cdf0e10cSrcweir 
231cdf0e10cSrcweir         case BIFF12_ID_PTDEFINITION:
232cdf0e10cSrcweir             switch( nRecId )
233cdf0e10cSrcweir             {
234cdf0e10cSrcweir                 case BIFF12_ID_PTLOCATION:      mrPivotTable.importPTLocation( rStrm, getSheetIndex() );    break;
235cdf0e10cSrcweir                 case BIFF12_ID_PTFIELDS:        return this;
236cdf0e10cSrcweir                 case BIFF12_ID_PTROWFIELDS:     mrPivotTable.importPTRowFields( rStrm );                    break;
237cdf0e10cSrcweir                 case BIFF12_ID_PTCOLFIELDS:     mrPivotTable.importPTColFields( rStrm );                    break;
238cdf0e10cSrcweir                 case BIFF12_ID_PTPAGEFIELDS:    return this;
239cdf0e10cSrcweir                 case BIFF12_ID_PTDATAFIELDS:    return this;
240cdf0e10cSrcweir                 case BIFF12_ID_PTFILTERS:       return this;
241cdf0e10cSrcweir             }
242cdf0e10cSrcweir         break;
243cdf0e10cSrcweir 
244cdf0e10cSrcweir         case BIFF12_ID_PTFIELDS:
245cdf0e10cSrcweir             if( nRecId == BIFF12_ID_PTFIELD ) return new PivotTableFieldContext( *this, mrPivotTable.createTableField() );
246cdf0e10cSrcweir         break;
247cdf0e10cSrcweir         case BIFF12_ID_PTPAGEFIELDS:
248cdf0e10cSrcweir             if( nRecId == BIFF12_ID_PTPAGEFIELD ) mrPivotTable.importPTPageField( rStrm );
249cdf0e10cSrcweir         break;
250cdf0e10cSrcweir         case BIFF12_ID_PTDATAFIELDS:
251cdf0e10cSrcweir             if( nRecId == BIFF12_ID_PTDATAFIELD ) mrPivotTable.importPTDataField( rStrm );
252cdf0e10cSrcweir         break;
253cdf0e10cSrcweir         case BIFF12_ID_PTFILTERS:
254cdf0e10cSrcweir             if( nRecId == BIFF12_ID_PTFILTER ) return new PivotTableFilterContext( *this, mrPivotTable.createTableFilter() );
255cdf0e10cSrcweir         break;
256cdf0e10cSrcweir     }
257cdf0e10cSrcweir     return 0;
258cdf0e10cSrcweir }
259cdf0e10cSrcweir 
getRecordInfos() const260cdf0e10cSrcweir const RecordInfo* PivotTableFragment::getRecordInfos() const
261cdf0e10cSrcweir {
262cdf0e10cSrcweir     static const RecordInfo spRecInfos[] =
263cdf0e10cSrcweir     {
264cdf0e10cSrcweir         { BIFF12_ID_AUTOFILTER,         BIFF12_ID_AUTOFILTER + 1        },
265cdf0e10cSrcweir         { BIFF12_ID_AUTOSORTSCOPE,      BIFF12_ID_AUTOSORTSCOPE + 1     },
266cdf0e10cSrcweir         { BIFF12_ID_FILTERCOLUMN,       BIFF12_ID_FILTERCOLUMN + 1      },
267cdf0e10cSrcweir         { BIFF12_ID_PIVOTAREA,          BIFF12_ID_PIVOTAREA + 1         },
268cdf0e10cSrcweir         { BIFF12_ID_PTCOLFIELDS,        BIFF12_ID_PTCOLFIELDS + 1       },
269cdf0e10cSrcweir         { BIFF12_ID_PTDATAFIELD,        BIFF12_ID_PTDATAFIELD + 1       },
270cdf0e10cSrcweir         { BIFF12_ID_PTDATAFIELDS,       BIFF12_ID_PTDATAFIELDS + 1      },
271cdf0e10cSrcweir         { BIFF12_ID_PTDEFINITION,       BIFF12_ID_PTDEFINITION + 35     },
272cdf0e10cSrcweir         { BIFF12_ID_PTFIELD,            BIFF12_ID_PTFIELD + 1           },
273cdf0e10cSrcweir         { BIFF12_ID_PTFIELDS,           BIFF12_ID_PTFIELDS + 1          },
274cdf0e10cSrcweir         { BIFF12_ID_PTFILTER,           BIFF12_ID_PTFILTER + 1          },
275cdf0e10cSrcweir         { BIFF12_ID_PTFILTERS,          BIFF12_ID_PTFILTERS + 1         },
276cdf0e10cSrcweir         { BIFF12_ID_PTFITEM,            BIFF12_ID_PTFITEM - 1           },
277cdf0e10cSrcweir         { BIFF12_ID_PTFITEMS,           BIFF12_ID_PTFITEMS + 1          },
278cdf0e10cSrcweir         { BIFF12_ID_PTLOCATION,         BIFF12_ID_PTLOCATION - 1        },
279cdf0e10cSrcweir         { BIFF12_ID_PTPAGEFIELD,        BIFF12_ID_PTPAGEFIELD + 1       },
280cdf0e10cSrcweir         { BIFF12_ID_PTPAGEFIELDS,       BIFF12_ID_PTPAGEFIELDS + 1      },
281cdf0e10cSrcweir         { BIFF12_ID_PTREFERENCE,        BIFF12_ID_PTREFERENCE + 1       },
282cdf0e10cSrcweir         { BIFF12_ID_PTREFERENCEITEM,    BIFF12_ID_PTREFERENCEITEM + 1   },
283cdf0e10cSrcweir         { BIFF12_ID_PTREFERENCES,       BIFF12_ID_PTREFERENCES + 1      },
284cdf0e10cSrcweir         { BIFF12_ID_PTROWFIELDS,        BIFF12_ID_PTROWFIELDS + 1       },
285cdf0e10cSrcweir         { -1,                           -1                              }
286cdf0e10cSrcweir     };
287cdf0e10cSrcweir     return spRecInfos;
288cdf0e10cSrcweir }
289cdf0e10cSrcweir 
290cdf0e10cSrcweir // ============================================================================
291cdf0e10cSrcweir // ============================================================================
292cdf0e10cSrcweir 
BiffPivotTableContext(const WorksheetHelper & rHelper)293cdf0e10cSrcweir BiffPivotTableContext::BiffPivotTableContext( const WorksheetHelper& rHelper ) :
294cdf0e10cSrcweir     BiffWorksheetContextBase( rHelper ),
295cdf0e10cSrcweir     mrPivotTable( getPivotTables().createPivotTable() )
296cdf0e10cSrcweir {
297cdf0e10cSrcweir }
298cdf0e10cSrcweir 
importRecord(BiffInputStream & rStrm)299cdf0e10cSrcweir void BiffPivotTableContext::importRecord( BiffInputStream& rStrm )
300cdf0e10cSrcweir {
301cdf0e10cSrcweir     switch( rStrm.getRecId() )
302cdf0e10cSrcweir     {
303cdf0e10cSrcweir         case BIFF_ID_PTDEFINITION:      mrPivotTable.importPTDefinition( rStrm, getSheetIndex() );  break;
304cdf0e10cSrcweir         case BIFF_ID_PTDEFINITION2:     mrPivotTable.importPTDefinition2( rStrm );                  break;
305cdf0e10cSrcweir         case BIFF_ID_PTFIELD:           mrPivotTable.createTableField().importPTField( rStrm );     break;
306cdf0e10cSrcweir         case BIFF_ID_PTROWCOLFIELDS:    mrPivotTable.importPTRowColFields( rStrm );                 break;
307cdf0e10cSrcweir         case BIFF_ID_PTPAGEFIELDS:      mrPivotTable.importPTPageFields( rStrm );                   break;
308cdf0e10cSrcweir         case BIFF_ID_PTDATAFIELD:       mrPivotTable.importPTDataField( rStrm );                    break;
309cdf0e10cSrcweir     }
310cdf0e10cSrcweir }
311cdf0e10cSrcweir 
312cdf0e10cSrcweir // ============================================================================
313cdf0e10cSrcweir 
314cdf0e10cSrcweir } // namespace xls
315cdf0e10cSrcweir } // namespace oox
316