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/querytablebuffer.hxx"
25cdf0e10cSrcweir
26cdf0e10cSrcweir #include <com/sun/star/container/XEnumerationAccess.hpp>
27cdf0e10cSrcweir #include <com/sun/star/sheet/XAreaLink.hpp>
28cdf0e10cSrcweir #include <com/sun/star/sheet/XAreaLinks.hpp>
29cdf0e10cSrcweir #include "oox/core/filterbase.hxx"
30cdf0e10cSrcweir #include "oox/helper/attributelist.hxx"
31cdf0e10cSrcweir #include "oox/xls/addressconverter.hxx"
32cdf0e10cSrcweir #include "oox/xls/biffinputstream.hxx"
33cdf0e10cSrcweir #include "oox/xls/connectionsbuffer.hxx"
34cdf0e10cSrcweir #include "oox/xls/defnamesbuffer.hxx"
35cdf0e10cSrcweir
36cdf0e10cSrcweir namespace oox {
37cdf0e10cSrcweir namespace xls {
38cdf0e10cSrcweir
39cdf0e10cSrcweir // ============================================================================
40cdf0e10cSrcweir
41cdf0e10cSrcweir using namespace ::com::sun::star::container;
42cdf0e10cSrcweir using namespace ::com::sun::star::sheet;
43cdf0e10cSrcweir using namespace ::com::sun::star::table;
44cdf0e10cSrcweir using namespace ::com::sun::star::uno;
45cdf0e10cSrcweir
46cdf0e10cSrcweir using ::rtl::OUString;
47cdf0e10cSrcweir using ::rtl::OUStringBuffer;
48cdf0e10cSrcweir
49cdf0e10cSrcweir // ============================================================================
50cdf0e10cSrcweir
51cdf0e10cSrcweir namespace {
52cdf0e10cSrcweir
53cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_HEADERS = 0x00000001;
54cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_ROWNUMBERS = 0x00000002;
55cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_DISABLEREFRESH = 0x00000004;
56cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_BACKGROUND = 0x00000008;
57cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_FIRSTBACKGROUND = 0x00000010;
58cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_REFRESHONLOAD = 0x00000020;
59cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_FILLFORMULAS = 0x00000100;
60cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_SAVEDATA = 0x00000200;
61cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_DISABLEEDIT = 0x00000400;
62cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_PRESERVEFORMAT = 0x00000800;
63cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_ADJUSTCOLWIDTH = 0x00001000;
64cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_INTERMEDIATE = 0x00002000;
65cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_APPLYNUMFMT = 0x00004000;
66cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_APPLYFONT = 0x00008000;
67cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_APPLYALIGNMENT = 0x00010000;
68cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_APPLYBORDER = 0x00020000;
69cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_APPLYFILL = 0x00040000;
70cdf0e10cSrcweir const sal_uInt32 BIFF12_QUERYTABLE_APPLYPROTECTION = 0x00080000;
71cdf0e10cSrcweir
72cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_HEADERS = 0x0001;
73cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_ROWNUMBERS = 0x0002;
74cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_DISABLEREFRESH = 0x0004;
75cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_BACKGROUND = 0x0008;
76cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_FIRSTBACKGROUND = 0x0010;
77cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_REFRESHONLOAD = 0x0020;
78cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_DELETEUNUSED = 0x0040;
79cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_FILLFORMULAS = 0x0080;
80cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_ADJUSTCOLWIDTH = 0x0100;
81cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_SAVEDATA = 0x0200;
82cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_DISABLEEDIT = 0x0400;
83cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_OVERWRITEEXISTING = 0x2000;
84cdf0e10cSrcweir
85cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_APPLYNUMFMT = 0x0001;
86cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_APPLYFONT = 0x0002;
87cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_APPLYALIGNMENT = 0x0004;
88cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_APPLYBORDER = 0x0008;
89cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_APPLYFILL = 0x0010;
90cdf0e10cSrcweir const sal_uInt16 BIFF_QUERYTABLE_APPLYPROTECTION = 0x0020;
91cdf0e10cSrcweir
92cdf0e10cSrcweir const sal_uInt32 BIFF_QTREFRESH_PRESERVEFORMAT = 0x00000001;
93cdf0e10cSrcweir const sal_uInt32 BIFF_QTREFRESH_ADJUSTCOLWIDTH = 0x00000002;
94cdf0e10cSrcweir
95cdf0e10cSrcweir // ----------------------------------------------------------------------------
96cdf0e10cSrcweir
lclAppendWebQueryTableName(OUStringBuffer & rTables,const OUString & rTableName)97cdf0e10cSrcweir void lclAppendWebQueryTableName( OUStringBuffer& rTables, const OUString& rTableName )
98cdf0e10cSrcweir {
99cdf0e10cSrcweir if( rTableName.getLength() > 0 )
100cdf0e10cSrcweir {
101cdf0e10cSrcweir if( rTables.getLength() > 0 )
102cdf0e10cSrcweir rTables.append( sal_Unicode( ';' ) );
103cdf0e10cSrcweir rTables.appendAscii( RTL_CONSTASCII_STRINGPARAM( "HTML__" ) ).append( rTableName );
104cdf0e10cSrcweir }
105cdf0e10cSrcweir }
106cdf0e10cSrcweir
lclAppendWebQueryTableIndex(OUStringBuffer & rTables,sal_Int32 nTableIndex)107cdf0e10cSrcweir void lclAppendWebQueryTableIndex( OUStringBuffer& rTables, sal_Int32 nTableIndex )
108cdf0e10cSrcweir {
109cdf0e10cSrcweir if( nTableIndex > 0 )
110cdf0e10cSrcweir {
111cdf0e10cSrcweir if( rTables.getLength() > 0 )
112cdf0e10cSrcweir rTables.append( sal_Unicode( ';' ) );
113cdf0e10cSrcweir rTables.appendAscii( RTL_CONSTASCII_STRINGPARAM( "HTML_" ) ).append( nTableIndex );
114cdf0e10cSrcweir }
115cdf0e10cSrcweir }
116cdf0e10cSrcweir
lclBuildWebQueryTables(const WebPrModel::TablesVector & rTables)117cdf0e10cSrcweir OUString lclBuildWebQueryTables( const WebPrModel::TablesVector& rTables )
118cdf0e10cSrcweir {
119cdf0e10cSrcweir if( rTables.empty() )
120cdf0e10cSrcweir return CREATE_OUSTRING( "HTML_tables" );
121cdf0e10cSrcweir
122cdf0e10cSrcweir OUStringBuffer aTables;
123cdf0e10cSrcweir for( WebPrModel::TablesVector::const_iterator aIt = rTables.begin(), aEnd = rTables.end(); aIt != aEnd; ++aIt )
124cdf0e10cSrcweir {
125cdf0e10cSrcweir if( aIt->has< OUString >() )
126cdf0e10cSrcweir lclAppendWebQueryTableName( aTables, aIt->get< OUString >() );
127cdf0e10cSrcweir else if( aIt->has< sal_Int32 >() )
128cdf0e10cSrcweir lclAppendWebQueryTableIndex( aTables, aIt->get< sal_Int32 >() );
129cdf0e10cSrcweir }
130cdf0e10cSrcweir return aTables.makeStringAndClear();
131cdf0e10cSrcweir }
132cdf0e10cSrcweir
lclFindAreaLink(const Reference<XAreaLinks> & rxAreaLinks,const CellAddress & rDestPos,const OUString & rFileUrl,const OUString & rTables,const OUString & rFilterName,const OUString & rFilterOptions)133cdf0e10cSrcweir Reference< XAreaLink > lclFindAreaLink(
134cdf0e10cSrcweir const Reference< XAreaLinks >& rxAreaLinks, const CellAddress& rDestPos,
135cdf0e10cSrcweir const OUString& rFileUrl, const OUString& rTables, const OUString& rFilterName, const OUString& rFilterOptions )
136cdf0e10cSrcweir {
137cdf0e10cSrcweir try
138cdf0e10cSrcweir {
139cdf0e10cSrcweir Reference< XEnumerationAccess > xAreaLinksEA( rxAreaLinks, UNO_QUERY_THROW );
140cdf0e10cSrcweir Reference< XEnumeration > xAreaLinksEnum( xAreaLinksEA->createEnumeration(), UNO_SET_THROW );
141cdf0e10cSrcweir while( xAreaLinksEnum->hasMoreElements() )
142cdf0e10cSrcweir {
143cdf0e10cSrcweir Reference< XAreaLink > xAreaLink( xAreaLinksEnum->nextElement(), UNO_QUERY_THROW );
144cdf0e10cSrcweir PropertySet aPropSet( xAreaLink );
145cdf0e10cSrcweir CellRangeAddress aDestArea = xAreaLink->getDestArea();
146cdf0e10cSrcweir OUString aString;
147cdf0e10cSrcweir if( (rDestPos.Sheet == aDestArea.Sheet) && (rDestPos.Column == aDestArea.StartColumn) && (rDestPos.Row == aDestArea.StartRow) &&
148cdf0e10cSrcweir (rTables == xAreaLink->getSourceArea()) &&
149cdf0e10cSrcweir aPropSet.getProperty( aString, PROP_Url ) && (rFileUrl == aString) &&
150cdf0e10cSrcweir aPropSet.getProperty( aString, PROP_Filter ) && (rFilterName == aString) &&
151cdf0e10cSrcweir aPropSet.getProperty( aString, PROP_FilterOptions ) && (rFilterOptions == aString) )
152cdf0e10cSrcweir return xAreaLink;
153cdf0e10cSrcweir }
154cdf0e10cSrcweir }
155cdf0e10cSrcweir catch( Exception& )
156cdf0e10cSrcweir {
157cdf0e10cSrcweir }
158cdf0e10cSrcweir return Reference< XAreaLink >();
159cdf0e10cSrcweir }
160cdf0e10cSrcweir
161cdf0e10cSrcweir } // namespace
162cdf0e10cSrcweir
163cdf0e10cSrcweir // ============================================================================
164cdf0e10cSrcweir
QueryTableModel()165cdf0e10cSrcweir QueryTableModel::QueryTableModel() :
166cdf0e10cSrcweir mnConnId( -1 ),
167cdf0e10cSrcweir mnGrowShrinkType( XML_insertDelete ),
168cdf0e10cSrcweir mbHeaders( true ),
169cdf0e10cSrcweir mbRowNumbers( false ),
170cdf0e10cSrcweir mbDisableRefresh( false ),
171cdf0e10cSrcweir mbBackground( true ),
172cdf0e10cSrcweir mbFirstBackground( false ),
173cdf0e10cSrcweir mbRefreshOnLoad( false ),
174cdf0e10cSrcweir mbFillFormulas( false ),
175cdf0e10cSrcweir mbRemoveDataOnSave( false ),
176cdf0e10cSrcweir mbDisableEdit( false ),
177cdf0e10cSrcweir mbPreserveFormat( true ),
178cdf0e10cSrcweir mbAdjustColWidth( true ),
179cdf0e10cSrcweir mbIntermediate( false )
180cdf0e10cSrcweir {
181cdf0e10cSrcweir }
182cdf0e10cSrcweir
183cdf0e10cSrcweir // ----------------------------------------------------------------------------
184cdf0e10cSrcweir
QueryTable(const WorksheetHelper & rHelper)185cdf0e10cSrcweir QueryTable::QueryTable( const WorksheetHelper& rHelper ) :
186cdf0e10cSrcweir WorksheetHelper( rHelper )
187cdf0e10cSrcweir {
188cdf0e10cSrcweir }
189cdf0e10cSrcweir
importQueryTable(const AttributeList & rAttribs)190cdf0e10cSrcweir void QueryTable::importQueryTable( const AttributeList& rAttribs )
191cdf0e10cSrcweir {
192cdf0e10cSrcweir maModel.maDefName = rAttribs.getXString( XML_name, OUString() );
193cdf0e10cSrcweir maModel.mnConnId = rAttribs.getInteger( XML_connectionId, -1 );
194cdf0e10cSrcweir maModel.mnGrowShrinkType = rAttribs.getToken( XML_growShrinkType, XML_insertDelete );
195cdf0e10cSrcweir maModel.mnAutoFormatId = rAttribs.getInteger( XML_autoFormatId, 0 );
196cdf0e10cSrcweir maModel.mbHeaders = rAttribs.getBool( XML_headers, true );
197cdf0e10cSrcweir maModel.mbRowNumbers = rAttribs.getBool( XML_rowNumbers, false );
198cdf0e10cSrcweir maModel.mbDisableRefresh = rAttribs.getBool( XML_disableRefresh, false );
199cdf0e10cSrcweir maModel.mbBackground = rAttribs.getBool( XML_backgroundRefresh, true );
200cdf0e10cSrcweir maModel.mbFirstBackground = rAttribs.getBool( XML_firstBackgroundRefresh, false );
201cdf0e10cSrcweir maModel.mbRefreshOnLoad = rAttribs.getBool( XML_refreshOnLoad, false );
202cdf0e10cSrcweir maModel.mbFillFormulas = rAttribs.getBool( XML_fillFormulas, false );
203cdf0e10cSrcweir maModel.mbRemoveDataOnSave = rAttribs.getBool( XML_removeDataOnSave, false );
204cdf0e10cSrcweir maModel.mbDisableEdit = rAttribs.getBool( XML_disableEdit, false );
205cdf0e10cSrcweir maModel.mbPreserveFormat = rAttribs.getBool( XML_preserveFormatting, true );
206cdf0e10cSrcweir maModel.mbAdjustColWidth = rAttribs.getBool( XML_adjustColumnWidth, true );
207cdf0e10cSrcweir maModel.mbIntermediate = rAttribs.getBool( XML_intermediate, false );
208cdf0e10cSrcweir maModel.mbApplyNumFmt = rAttribs.getBool( XML_applyNumberFormats, false );
209cdf0e10cSrcweir maModel.mbApplyFont = rAttribs.getBool( XML_applyFontFormats, false );
210cdf0e10cSrcweir maModel.mbApplyAlignment = rAttribs.getBool( XML_applyAlignmentFormats, false );
211cdf0e10cSrcweir maModel.mbApplyBorder = rAttribs.getBool( XML_applyBorderFormats, false );
212cdf0e10cSrcweir maModel.mbApplyFill = rAttribs.getBool( XML_applyPatternFormats, false );
213cdf0e10cSrcweir // OOXML and BIFF12 documentation differ: OOXML mentions width/height, BIFF12 mentions protection
214cdf0e10cSrcweir maModel.mbApplyProtection = rAttribs.getBool( XML_applyWidthHeightFormats, false );
215cdf0e10cSrcweir }
216cdf0e10cSrcweir
importQueryTable(SequenceInputStream & rStrm)217cdf0e10cSrcweir void QueryTable::importQueryTable( SequenceInputStream& rStrm )
218cdf0e10cSrcweir {
219cdf0e10cSrcweir sal_uInt32 nFlags;
220cdf0e10cSrcweir rStrm >> nFlags;
221cdf0e10cSrcweir maModel.mnAutoFormatId = rStrm.readuInt16();
222cdf0e10cSrcweir rStrm >> maModel.mnConnId >> maModel.maDefName;
223cdf0e10cSrcweir
224cdf0e10cSrcweir static const sal_Int32 spnGrowShrinkTypes[] = { XML_insertClear, XML_insertDelete, XML_overwriteClear };
225cdf0e10cSrcweir maModel.mnGrowShrinkType = STATIC_ARRAY_SELECT( spnGrowShrinkTypes, extractValue< sal_uInt8 >( nFlags, 6, 2 ), XML_insertDelete );
226cdf0e10cSrcweir
227cdf0e10cSrcweir maModel.mbHeaders = getFlag( nFlags, BIFF12_QUERYTABLE_HEADERS );
228cdf0e10cSrcweir maModel.mbRowNumbers = getFlag( nFlags, BIFF12_QUERYTABLE_ROWNUMBERS );
229cdf0e10cSrcweir maModel.mbDisableRefresh = getFlag( nFlags, BIFF12_QUERYTABLE_DISABLEREFRESH );
230cdf0e10cSrcweir maModel.mbBackground = getFlag( nFlags, BIFF12_QUERYTABLE_BACKGROUND );
231cdf0e10cSrcweir maModel.mbFirstBackground = getFlag( nFlags, BIFF12_QUERYTABLE_FIRSTBACKGROUND );
232cdf0e10cSrcweir maModel.mbRefreshOnLoad = getFlag( nFlags, BIFF12_QUERYTABLE_REFRESHONLOAD );
233cdf0e10cSrcweir maModel.mbFillFormulas = getFlag( nFlags, BIFF12_QUERYTABLE_FILLFORMULAS );
234cdf0e10cSrcweir maModel.mbRemoveDataOnSave = !getFlag( nFlags, BIFF12_QUERYTABLE_SAVEDATA ); // flag negated in BIFF12
235cdf0e10cSrcweir maModel.mbDisableEdit = getFlag( nFlags, BIFF12_QUERYTABLE_DISABLEEDIT );
236cdf0e10cSrcweir maModel.mbPreserveFormat = getFlag( nFlags, BIFF12_QUERYTABLE_PRESERVEFORMAT );
237cdf0e10cSrcweir maModel.mbAdjustColWidth = getFlag( nFlags, BIFF12_QUERYTABLE_ADJUSTCOLWIDTH );
238cdf0e10cSrcweir maModel.mbIntermediate = getFlag( nFlags, BIFF12_QUERYTABLE_INTERMEDIATE );
239cdf0e10cSrcweir maModel.mbApplyNumFmt = getFlag( nFlags, BIFF12_QUERYTABLE_APPLYNUMFMT );
240cdf0e10cSrcweir maModel.mbApplyFont = getFlag( nFlags, BIFF12_QUERYTABLE_APPLYFONT );
241cdf0e10cSrcweir maModel.mbApplyAlignment = getFlag( nFlags, BIFF12_QUERYTABLE_APPLYALIGNMENT );
242cdf0e10cSrcweir maModel.mbApplyBorder = getFlag( nFlags, BIFF12_QUERYTABLE_APPLYBORDER );
243cdf0e10cSrcweir maModel.mbApplyFill = getFlag( nFlags, BIFF12_QUERYTABLE_APPLYFILL );
244cdf0e10cSrcweir maModel.mbApplyProtection = getFlag( nFlags, BIFF12_QUERYTABLE_APPLYPROTECTION );
245cdf0e10cSrcweir }
246cdf0e10cSrcweir
importQueryTable(BiffInputStream & rStrm)247cdf0e10cSrcweir void QueryTable::importQueryTable( BiffInputStream& rStrm )
248cdf0e10cSrcweir {
249cdf0e10cSrcweir sal_uInt16 nFlags, nAutoFormatFlags;
250cdf0e10cSrcweir rStrm >> nFlags;
251cdf0e10cSrcweir maModel.mnAutoFormatId = rStrm.readuInt16();
252cdf0e10cSrcweir rStrm >> nAutoFormatFlags;
253cdf0e10cSrcweir rStrm.skip( 4 );
254cdf0e10cSrcweir maModel.maDefName = rStrm.readUniString();
255cdf0e10cSrcweir
256cdf0e10cSrcweir bool bDeleteUnused = getFlag( nFlags, BIFF_QUERYTABLE_DELETEUNUSED );
257cdf0e10cSrcweir bool bOverwriteExisting = getFlag( nFlags, BIFF_QUERYTABLE_OVERWRITEEXISTING );
258cdf0e10cSrcweir OSL_ENSURE( !bDeleteUnused || !bOverwriteExisting, "QueryTable::importQueryTable - invalid flags" );
259cdf0e10cSrcweir maModel.mnGrowShrinkType = bDeleteUnused ? XML_insertDelete : (bOverwriteExisting ? XML_overwriteClear : XML_insertClear);
260cdf0e10cSrcweir
261cdf0e10cSrcweir maModel.mbHeaders = getFlag( nFlags, BIFF_QUERYTABLE_HEADERS );
262cdf0e10cSrcweir maModel.mbRowNumbers = getFlag( nFlags, BIFF_QUERYTABLE_ROWNUMBERS );
263cdf0e10cSrcweir maModel.mbDisableRefresh = getFlag( nFlags, BIFF_QUERYTABLE_DISABLEREFRESH );
264cdf0e10cSrcweir maModel.mbBackground = getFlag( nFlags, BIFF_QUERYTABLE_BACKGROUND );
265cdf0e10cSrcweir maModel.mbFirstBackground = getFlag( nFlags, BIFF_QUERYTABLE_FIRSTBACKGROUND );
266cdf0e10cSrcweir maModel.mbRefreshOnLoad = getFlag( nFlags, BIFF_QUERYTABLE_REFRESHONLOAD );
267cdf0e10cSrcweir maModel.mbFillFormulas = getFlag( nFlags, BIFF_QUERYTABLE_FILLFORMULAS );
268cdf0e10cSrcweir maModel.mbRemoveDataOnSave = !getFlag( nFlags, BIFF_QUERYTABLE_SAVEDATA ); // flag negated in BIFF
269cdf0e10cSrcweir maModel.mbDisableEdit = getFlag( nFlags, BIFF_QUERYTABLE_DISABLEEDIT );
270cdf0e10cSrcweir maModel.mbAdjustColWidth = getFlag( nFlags, BIFF_QUERYTABLE_ADJUSTCOLWIDTH );
271cdf0e10cSrcweir maModel.mbApplyNumFmt = getFlag( nAutoFormatFlags, BIFF_QUERYTABLE_APPLYNUMFMT );
272cdf0e10cSrcweir maModel.mbApplyFont = getFlag( nAutoFormatFlags, BIFF_QUERYTABLE_APPLYFONT );
273cdf0e10cSrcweir maModel.mbApplyAlignment = getFlag( nAutoFormatFlags, BIFF_QUERYTABLE_APPLYALIGNMENT );
274cdf0e10cSrcweir maModel.mbApplyBorder = getFlag( nAutoFormatFlags, BIFF_QUERYTABLE_APPLYBORDER );
275cdf0e10cSrcweir maModel.mbApplyFill = getFlag( nAutoFormatFlags, BIFF_QUERYTABLE_APPLYFILL );
276cdf0e10cSrcweir maModel.mbApplyProtection = getFlag( nAutoFormatFlags, BIFF_QUERYTABLE_APPLYPROTECTION );
277cdf0e10cSrcweir
278cdf0e10cSrcweir // create a new connection object that will store settings from following records
279cdf0e10cSrcweir OSL_ENSURE( maModel.mnConnId == -1, "QueryTable::importQueryTable - multiple call" );
280cdf0e10cSrcweir Connection& rConnection = getConnections().createConnectionWithId();
281cdf0e10cSrcweir maModel.mnConnId = rConnection.getConnectionId();
282cdf0e10cSrcweir
283cdf0e10cSrcweir // a DBQUERY record with some PCITEM_STRING records must follow
284cdf0e10cSrcweir bool bHasDbQuery = (rStrm.getNextRecId() == BIFF_ID_DBQUERY) && rStrm.startNextRecord();
285cdf0e10cSrcweir OSL_ENSURE( bHasDbQuery, "QueryTable::importQueryTable - missing DBQUERY record" );
286cdf0e10cSrcweir if( bHasDbQuery )
287cdf0e10cSrcweir rConnection.importDbQuery( rStrm );
288cdf0e10cSrcweir }
289cdf0e10cSrcweir
importQueryTableRefresh(BiffInputStream & rStrm)290cdf0e10cSrcweir void QueryTable::importQueryTableRefresh( BiffInputStream& rStrm )
291cdf0e10cSrcweir {
292cdf0e10cSrcweir rStrm.skip( 4 );
293cdf0e10cSrcweir bool bPivot = rStrm.readuInt16() != 0;
294cdf0e10cSrcweir OSL_ENSURE( !bPivot, "QueryTable::importQueryTableRefresh - unexpected pivot flag" );
295cdf0e10cSrcweir if( !bPivot )
296cdf0e10cSrcweir {
297cdf0e10cSrcweir rStrm.skip( 2 );
298cdf0e10cSrcweir sal_uInt32 nFlags = rStrm.readuInt32();
299cdf0e10cSrcweir maModel.mbPreserveFormat = getFlag( nFlags, BIFF_QTREFRESH_PRESERVEFORMAT );
300cdf0e10cSrcweir maModel.mbAdjustColWidth = getFlag( nFlags, BIFF_QTREFRESH_ADJUSTCOLWIDTH );
301cdf0e10cSrcweir }
302cdf0e10cSrcweir }
303cdf0e10cSrcweir
importQueryTableSettings(BiffInputStream & rStrm)304cdf0e10cSrcweir void QueryTable::importQueryTableSettings( BiffInputStream& rStrm )
305cdf0e10cSrcweir {
306cdf0e10cSrcweir ConnectionRef xConnection = getConnections().getConnection( maModel.mnConnId );
307cdf0e10cSrcweir OSL_ENSURE( xConnection.get(), "QueryTable::importQueryTableSettings - missing connection object" );
308cdf0e10cSrcweir if( xConnection.get() )
309cdf0e10cSrcweir xConnection->importQueryTableSettings( rStrm );
310cdf0e10cSrcweir }
311cdf0e10cSrcweir
finalizeImport()312cdf0e10cSrcweir void QueryTable::finalizeImport()
313cdf0e10cSrcweir {
314cdf0e10cSrcweir ConnectionRef xConnection = getConnections().getConnection( maModel.mnConnId );
315cdf0e10cSrcweir OSL_ENSURE( xConnection.get(), "QueryTable::finalizeImport - missing connection object" );
316cdf0e10cSrcweir if( xConnection.get() && (xConnection->getConnectionType() == BIFF12_CONNECTION_HTML) )
317cdf0e10cSrcweir {
318cdf0e10cSrcweir // check that valid web query properties exist
319cdf0e10cSrcweir const WebPrModel* pWebPr = xConnection->getModel().mxWebPr.get();
320cdf0e10cSrcweir if( pWebPr && !pWebPr->mbXml )
321cdf0e10cSrcweir {
322cdf0e10cSrcweir OUString aFileUrl = getBaseFilter().getAbsoluteUrl( pWebPr->maUrl );
323cdf0e10cSrcweir if( aFileUrl.getLength() > 0 )
324cdf0e10cSrcweir {
325cdf0e10cSrcweir // resolve destination cell range (stored as defined name containing the range)
326cdf0e10cSrcweir OUString aDefName = maModel.maDefName.replace( ' ', '_' ).replace( '-', '_' );
327cdf0e10cSrcweir DefinedNameRef xDefName = getDefinedNames().getByModelName( aDefName, getSheetIndex() );
328cdf0e10cSrcweir OSL_ENSURE( xDefName.get(), "QueryTable::finalizeImport - missing defined name" );
329cdf0e10cSrcweir if( xDefName.get() )
330cdf0e10cSrcweir {
331cdf0e10cSrcweir CellRangeAddress aDestRange;
332cdf0e10cSrcweir bool bIsRange = xDefName->getAbsoluteRange( aDestRange ) && (aDestRange.Sheet == getSheetIndex());
333cdf0e10cSrcweir OSL_ENSURE( bIsRange, "QueryTable::finalizeImport - defined name does not contain valid cell range" );
334cdf0e10cSrcweir if( bIsRange && getAddressConverter().checkCellRange( aDestRange, false, true ) )
335cdf0e10cSrcweir {
336cdf0e10cSrcweir CellAddress aDestPos( aDestRange.Sheet, aDestRange.StartColumn, aDestRange.StartRow );
337cdf0e10cSrcweir // find tables mode: entire document, all tables, or specific tables
338cdf0e10cSrcweir OUString aTables = pWebPr->mbHtmlTables ? lclBuildWebQueryTables( pWebPr->maTables ) : CREATE_OUSTRING( "HTML_all" );
339cdf0e10cSrcweir if( aTables.getLength() > 0 ) try
340cdf0e10cSrcweir {
341cdf0e10cSrcweir PropertySet aDocProps( getDocument() );
342cdf0e10cSrcweir Reference< XAreaLinks > xAreaLinks( aDocProps.getAnyProperty( PROP_AreaLinks ), UNO_QUERY_THROW );
343cdf0e10cSrcweir OUString aFilterName = CREATE_OUSTRING( "calc_HTML_WebQuery" );
344cdf0e10cSrcweir OUString aFilterOptions;
345cdf0e10cSrcweir xAreaLinks->insertAtPosition( aDestPos, aFileUrl, aTables, aFilterName, aFilterOptions );
346cdf0e10cSrcweir // set refresh interval (convert minutes to seconds)
347cdf0e10cSrcweir sal_Int32 nRefreshPeriod = xConnection->getModel().mnInterval * 60;
348cdf0e10cSrcweir if( nRefreshPeriod > 0 )
349cdf0e10cSrcweir {
350cdf0e10cSrcweir PropertySet aPropSet( lclFindAreaLink( xAreaLinks, aDestPos, aFileUrl, aTables, aFilterName, aFilterOptions ) );
351cdf0e10cSrcweir aPropSet.setProperty( PROP_RefreshPeriod, nRefreshPeriod );
352cdf0e10cSrcweir }
353cdf0e10cSrcweir }
354cdf0e10cSrcweir catch( Exception& )
355cdf0e10cSrcweir {
356cdf0e10cSrcweir }
357cdf0e10cSrcweir }
358cdf0e10cSrcweir }
359cdf0e10cSrcweir }
360cdf0e10cSrcweir }
361cdf0e10cSrcweir }
362cdf0e10cSrcweir }
363cdf0e10cSrcweir
364cdf0e10cSrcweir // ============================================================================
365cdf0e10cSrcweir
QueryTableBuffer(const WorksheetHelper & rHelper)366cdf0e10cSrcweir QueryTableBuffer::QueryTableBuffer( const WorksheetHelper& rHelper ) :
367cdf0e10cSrcweir WorksheetHelper( rHelper )
368cdf0e10cSrcweir {
369cdf0e10cSrcweir }
370cdf0e10cSrcweir
createQueryTable()371cdf0e10cSrcweir QueryTable& QueryTableBuffer::createQueryTable()
372cdf0e10cSrcweir {
373cdf0e10cSrcweir QueryTableVector::value_type xQueryTable( new QueryTable( *this ) );
374cdf0e10cSrcweir maQueryTables.push_back( xQueryTable );
375cdf0e10cSrcweir return *xQueryTable;
376cdf0e10cSrcweir }
377cdf0e10cSrcweir
finalizeImport()378cdf0e10cSrcweir void QueryTableBuffer::finalizeImport()
379cdf0e10cSrcweir {
380cdf0e10cSrcweir maQueryTables.forEachMem( &QueryTable::finalizeImport );
381cdf0e10cSrcweir }
382cdf0e10cSrcweir
383cdf0e10cSrcweir // ============================================================================
384cdf0e10cSrcweir
385cdf0e10cSrcweir } // namespace xls
386cdf0e10cSrcweir } // namespace oox
387