xref: /aoo4110/main/sc/source/filter/excel/impop.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_sc.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "imp_op.hxx"
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski #include <filter/msfilter/countryid.hxx>
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include "scitems.hxx"
32*b1cdbd2cSJim Jagielski #include <editeng/eeitem.hxx>
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski #include <editeng/editdata.hxx>
35*b1cdbd2cSJim Jagielski #include <editeng/editeng.hxx>
36*b1cdbd2cSJim Jagielski #include <editeng/editobj.hxx>
37*b1cdbd2cSJim Jagielski #include <editeng/editstat.hxx>
38*b1cdbd2cSJim Jagielski #include <editeng/flditem.hxx>
39*b1cdbd2cSJim Jagielski #include <svx/pageitem.hxx>
40*b1cdbd2cSJim Jagielski #include <editeng/colritem.hxx>
41*b1cdbd2cSJim Jagielski #include <sfx2/printer.hxx>
42*b1cdbd2cSJim Jagielski #include <sfx2/docfile.hxx>
43*b1cdbd2cSJim Jagielski #include <svl/zforlist.hxx>
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski #include <sfx2/objsh.hxx>
46*b1cdbd2cSJim Jagielski #include "docuno.hxx"
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski #include "cell.hxx"
49*b1cdbd2cSJim Jagielski #include "document.hxx"
50*b1cdbd2cSJim Jagielski #include "rangenam.hxx"
51*b1cdbd2cSJim Jagielski #include "compiler.hxx"
52*b1cdbd2cSJim Jagielski #include "patattr.hxx"
53*b1cdbd2cSJim Jagielski #include "attrib.hxx"
54*b1cdbd2cSJim Jagielski #include "globstr.hrc"
55*b1cdbd2cSJim Jagielski #include "global.hxx"
56*b1cdbd2cSJim Jagielski #include "markdata.hxx"
57*b1cdbd2cSJim Jagielski #include "olinetab.hxx"
58*b1cdbd2cSJim Jagielski #include "stlsheet.hxx"
59*b1cdbd2cSJim Jagielski #include "stlpool.hxx"
60*b1cdbd2cSJim Jagielski #include "compiler.hxx"
61*b1cdbd2cSJim Jagielski #include "viewopti.hxx"
62*b1cdbd2cSJim Jagielski #include "docoptio.hxx"
63*b1cdbd2cSJim Jagielski #include "scextopt.hxx"
64*b1cdbd2cSJim Jagielski #include "editutil.hxx"
65*b1cdbd2cSJim Jagielski #include "filtopt.hxx"
66*b1cdbd2cSJim Jagielski #include "scerrors.hxx"
67*b1cdbd2cSJim Jagielski #include "unonames.hxx"
68*b1cdbd2cSJim Jagielski #include "paramisc.hxx"
69*b1cdbd2cSJim Jagielski #include "postit.hxx"
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski #include "fapihelper.hxx"
72*b1cdbd2cSJim Jagielski #include "xltools.hxx"
73*b1cdbd2cSJim Jagielski #include "xltable.hxx"
74*b1cdbd2cSJim Jagielski #include "xlview.hxx"
75*b1cdbd2cSJim Jagielski #include "xltracer.hxx"
76*b1cdbd2cSJim Jagielski #include "xihelper.hxx"
77*b1cdbd2cSJim Jagielski #include "xipage.hxx"
78*b1cdbd2cSJim Jagielski #include "xiview.hxx"
79*b1cdbd2cSJim Jagielski #include "xilink.hxx"
80*b1cdbd2cSJim Jagielski #include "xiescher.hxx"
81*b1cdbd2cSJim Jagielski #include "xicontent.hxx"
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski #include "excimp8.hxx"
84*b1cdbd2cSJim Jagielski #include "excform.hxx"
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski #if defined( WNT )
87*b1cdbd2cSJim Jagielski #include <math.h>
88*b1cdbd2cSJim Jagielski #else
89*b1cdbd2cSJim Jagielski #include <stdlib.h>
90*b1cdbd2cSJim Jagielski #endif
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski const double ImportExcel::fExcToTwips =
96*b1cdbd2cSJim Jagielski 	( double ) TWIPS_PER_CHAR / 256.0;
97*b1cdbd2cSJim Jagielski 
98*b1cdbd2cSJim Jagielski 
ImportTyp(ScDocument * pDoc,CharSet eQ)99*b1cdbd2cSJim Jagielski ImportTyp::ImportTyp( ScDocument* pDoc, CharSet eQ )
100*b1cdbd2cSJim Jagielski {
101*b1cdbd2cSJim Jagielski 	eQuellChar = eQ;
102*b1cdbd2cSJim Jagielski 	pD = pDoc;
103*b1cdbd2cSJim Jagielski }
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski 
~ImportTyp()106*b1cdbd2cSJim Jagielski ImportTyp::~ImportTyp()
107*b1cdbd2cSJim Jagielski {
108*b1cdbd2cSJim Jagielski }
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski 
Read()111*b1cdbd2cSJim Jagielski FltError ImportTyp::Read()
112*b1cdbd2cSJim Jagielski {
113*b1cdbd2cSJim Jagielski 	return eERR_INTERN;
114*b1cdbd2cSJim Jagielski }
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski 
ImportExcel(XclImpRootData & rImpData,SvStream & rStrm)117*b1cdbd2cSJim Jagielski ImportExcel::ImportExcel( XclImpRootData& rImpData, SvStream& rStrm ):
118*b1cdbd2cSJim Jagielski     ImportTyp( &rImpData.mrDoc, rImpData.meTextEnc ),
119*b1cdbd2cSJim Jagielski     XclImpRoot( rImpData ),
120*b1cdbd2cSJim Jagielski     maStrm( rStrm, GetRoot() ),
121*b1cdbd2cSJim Jagielski     aIn( maStrm ),
122*b1cdbd2cSJim Jagielski     maScOleSize( ScAddress::INITIALIZE_INVALID ),
123*b1cdbd2cSJim Jagielski     mnLastRefIdx( 0 ),
124*b1cdbd2cSJim Jagielski     mnIxfeIndex( 0 ),
125*b1cdbd2cSJim Jagielski     mbBiff2HasXfs( false ),
126*b1cdbd2cSJim Jagielski     mbBiff2HasXfsValid( false )
127*b1cdbd2cSJim Jagielski {
128*b1cdbd2cSJim Jagielski     nBdshtTab = 0;
129*b1cdbd2cSJim Jagielski 
130*b1cdbd2cSJim Jagielski 	// Root-Daten fuellen - nach new's ohne Root als Parameter
131*b1cdbd2cSJim Jagielski     pExcRoot = &GetOldRoot();
132*b1cdbd2cSJim Jagielski     pExcRoot->pIR = this;   // ExcRoot -> XclImpRoot
133*b1cdbd2cSJim Jagielski     pExcRoot->eDateiTyp = BiffX;
134*b1cdbd2cSJim Jagielski 	pExcRoot->pExtSheetBuff = new ExtSheetBuffer( pExcRoot );	//&aExtSheetBuff;
135*b1cdbd2cSJim Jagielski 	pExcRoot->pShrfmlaBuff = new ShrfmlaBuffer( pExcRoot );		//&aShrfrmlaBuff;
136*b1cdbd2cSJim Jagielski     pExcRoot->pExtNameBuff = new ExtNameBuff ( *this );
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski     pExtNameBuff = new NameBuffer( pExcRoot );          //#94039# prevent empty rootdata
139*b1cdbd2cSJim Jagielski     pExtNameBuff->SetBase( 1 );
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski     pOutlineListBuffer = new XclImpOutlineListBuffer( );
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski 	// ab Biff8
144*b1cdbd2cSJim Jagielski     pFormConv = pExcRoot->pFmlaConverter = new ExcelToSc( GetRoot() );
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski 	bTabTruncated = sal_False;
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski 	// Excel-Dokument per Default auf 31.12.1899, entspricht Excel-Einstellungen mit 1.1.1900
149*b1cdbd2cSJim Jagielski 	ScDocOptions aOpt = pD->GetDocOptions();
150*b1cdbd2cSJim Jagielski 	aOpt.SetDate( 30, 12, 1899 );
151*b1cdbd2cSJim Jagielski 	pD->SetDocOptions( aOpt );
152*b1cdbd2cSJim Jagielski 	pD->GetFormatTable()->ChangeNullDate( 30, 12, 1899 );
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski     ScDocOptions aDocOpt( pD->GetDocOptions() );
155*b1cdbd2cSJim Jagielski     aDocOpt.SetIgnoreCase( sal_True );              // always in Excel
156*b1cdbd2cSJim Jagielski     aDocOpt.SetFormulaRegexEnabled( sal_False );    // regular expressions? what's that?
157*b1cdbd2cSJim Jagielski     aDocOpt.SetLookUpColRowNames( sal_False );      // default: no natural language refs
158*b1cdbd2cSJim Jagielski 	pD->SetDocOptions( aDocOpt );
159*b1cdbd2cSJim Jagielski }
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski 
~ImportExcel(void)162*b1cdbd2cSJim Jagielski ImportExcel::~ImportExcel( void )
163*b1cdbd2cSJim Jagielski {
164*b1cdbd2cSJim Jagielski     GetDoc().SetSrcCharSet( GetTextEncoding() );
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski     delete pExtNameBuff;
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski     delete pOutlineListBuffer;
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski 	delete pFormConv;
171*b1cdbd2cSJim Jagielski }
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 
ReadFileSharing()174*b1cdbd2cSJim Jagielski void ImportExcel::ReadFileSharing()
175*b1cdbd2cSJim Jagielski {
176*b1cdbd2cSJim Jagielski     sal_uInt16 nRecommendReadOnly, nPasswordHash;
177*b1cdbd2cSJim Jagielski     maStrm >> nRecommendReadOnly >> nPasswordHash;
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski     if( (nRecommendReadOnly != 0) || (nPasswordHash != 0) )
180*b1cdbd2cSJim Jagielski     {
181*b1cdbd2cSJim Jagielski         if( SfxItemSet* pItemSet = GetMedium().GetItemSet() )
182*b1cdbd2cSJim Jagielski             pItemSet->Put( SfxBoolItem( SID_DOC_READONLY, sal_True ) );
183*b1cdbd2cSJim Jagielski 
184*b1cdbd2cSJim Jagielski         if( SfxObjectShell* pShell = GetDocShell() )
185*b1cdbd2cSJim Jagielski         {
186*b1cdbd2cSJim Jagielski             if( nRecommendReadOnly != 0 )
187*b1cdbd2cSJim Jagielski                 pShell->SetLoadReadonly( sal_True );
188*b1cdbd2cSJim Jagielski             if( nPasswordHash != 0 )
189*b1cdbd2cSJim Jagielski                 pShell->SetModifyPasswordHash( nPasswordHash );
190*b1cdbd2cSJim Jagielski         }
191*b1cdbd2cSJim Jagielski     }
192*b1cdbd2cSJim Jagielski }
193*b1cdbd2cSJim Jagielski 
ReadXFIndex(const ScAddress & rScPos,bool bBiff2)194*b1cdbd2cSJim Jagielski sal_uInt16 ImportExcel::ReadXFIndex( const ScAddress& rScPos, bool bBiff2 )
195*b1cdbd2cSJim Jagielski {
196*b1cdbd2cSJim Jagielski     sal_uInt16 nXFIdx = 0;
197*b1cdbd2cSJim Jagielski     if( bBiff2 )
198*b1cdbd2cSJim Jagielski     {
199*b1cdbd2cSJim Jagielski         /*  #i71453# On first call, check if the file contains XF records (by
200*b1cdbd2cSJim Jagielski             trying to access the first XF with index 0). If there are no XFs,
201*b1cdbd2cSJim Jagielski             the explicit formatting information contained in each cell record
202*b1cdbd2cSJim Jagielski             will be used instead. */
203*b1cdbd2cSJim Jagielski         if( !mbBiff2HasXfsValid )
204*b1cdbd2cSJim Jagielski         {
205*b1cdbd2cSJim Jagielski             mbBiff2HasXfsValid = true;
206*b1cdbd2cSJim Jagielski             mbBiff2HasXfs = GetXFBuffer().GetXF( 0 ) != 0;
207*b1cdbd2cSJim Jagielski         }
208*b1cdbd2cSJim Jagielski         // read formatting information (includes the XF identifier)
209*b1cdbd2cSJim Jagielski         sal_uInt8 nFlags1, nFlags2, nFlags3;
210*b1cdbd2cSJim Jagielski         maStrm >> nFlags1 >> nFlags2 >> nFlags3;
211*b1cdbd2cSJim Jagielski         /*  If the file contains XFs, extract and set the XF identifier,
212*b1cdbd2cSJim Jagielski             otherwise get the explicit formatting. */
213*b1cdbd2cSJim Jagielski         if( mbBiff2HasXfs )
214*b1cdbd2cSJim Jagielski         {
215*b1cdbd2cSJim Jagielski             nXFIdx = ::extract_value< sal_uInt16 >( nFlags1, 0, 6 );
216*b1cdbd2cSJim Jagielski             /*  If the identifier is equal to 63, then the real identifier is
217*b1cdbd2cSJim Jagielski                 contained in the preceding IXFE record (stored in mnBiff2XfId). */
218*b1cdbd2cSJim Jagielski             if( nXFIdx == 63 )
219*b1cdbd2cSJim Jagielski                 nXFIdx = mnIxfeIndex;
220*b1cdbd2cSJim Jagielski         }
221*b1cdbd2cSJim Jagielski         else
222*b1cdbd2cSJim Jagielski         {
223*b1cdbd2cSJim Jagielski             /*  Let the XclImpXF class do the conversion of the imported
224*b1cdbd2cSJim Jagielski                 formatting. The XF buffer is empty, therefore will not do any
225*b1cdbd2cSJim Jagielski                 conversion based on the XF index later on. */
226*b1cdbd2cSJim Jagielski             XclImpXF::ApplyPatternForBiff2CellFormat( GetRoot(), rScPos, nFlags1, nFlags2, nFlags3 );
227*b1cdbd2cSJim Jagielski         }
228*b1cdbd2cSJim Jagielski     }
229*b1cdbd2cSJim Jagielski     else
230*b1cdbd2cSJim Jagielski         aIn >> nXFIdx;
231*b1cdbd2cSJim Jagielski     return nXFIdx;
232*b1cdbd2cSJim Jagielski }
233*b1cdbd2cSJim Jagielski 
ReadDimensions()234*b1cdbd2cSJim Jagielski void ImportExcel::ReadDimensions()
235*b1cdbd2cSJim Jagielski {
236*b1cdbd2cSJim Jagielski     XclRange aXclUsedArea( ScAddress::UNINITIALIZED );
237*b1cdbd2cSJim Jagielski     if( (maStrm.GetRecId() == EXC_ID2_DIMENSIONS) || (GetBiff() <= EXC_BIFF5) )
238*b1cdbd2cSJim Jagielski     {
239*b1cdbd2cSJim Jagielski         maStrm >> aXclUsedArea;
240*b1cdbd2cSJim Jagielski         if( (aXclUsedArea.GetColCount() > 1) && (aXclUsedArea.GetRowCount() > 1) )
241*b1cdbd2cSJim Jagielski         {
242*b1cdbd2cSJim Jagielski             // Excel stores first unused row/column index
243*b1cdbd2cSJim Jagielski             --aXclUsedArea.maLast.mnCol;
244*b1cdbd2cSJim Jagielski             --aXclUsedArea.maLast.mnRow;
245*b1cdbd2cSJim Jagielski             // create the Calc range
246*b1cdbd2cSJim Jagielski             SCTAB nScTab = GetCurrScTab();
247*b1cdbd2cSJim Jagielski             ScRange& rScUsedArea = GetExtDocOptions().GetOrCreateTabSettings( nScTab ).maUsedArea;
248*b1cdbd2cSJim Jagielski             GetAddressConverter().ConvertRange( rScUsedArea, aXclUsedArea, nScTab, nScTab, false );
249*b1cdbd2cSJim Jagielski             // if any error occurs in ConvertRange(), rScUsedArea keeps untouched
250*b1cdbd2cSJim Jagielski         }
251*b1cdbd2cSJim Jagielski     }
252*b1cdbd2cSJim Jagielski     else
253*b1cdbd2cSJim Jagielski     {
254*b1cdbd2cSJim Jagielski         sal_uInt32 nXclRow1, nXclRow2;
255*b1cdbd2cSJim Jagielski         maStrm >> nXclRow1 >> nXclRow2 >> aXclUsedArea.maFirst.mnCol >> aXclUsedArea.maLast.mnCol;
256*b1cdbd2cSJim Jagielski         if( (nXclRow1 < nXclRow2) && (aXclUsedArea.GetColCount() > 1) &&
257*b1cdbd2cSJim Jagielski             (nXclRow1 <= static_cast< sal_uInt32 >( GetScMaxPos().Row() )) )
258*b1cdbd2cSJim Jagielski         {
259*b1cdbd2cSJim Jagielski             // Excel stores first unused row/column index
260*b1cdbd2cSJim Jagielski             --nXclRow2;
261*b1cdbd2cSJim Jagielski             --aXclUsedArea.maLast.mnCol;
262*b1cdbd2cSJim Jagielski             // convert row indexes to 16-bit values
263*b1cdbd2cSJim Jagielski             aXclUsedArea.maFirst.mnRow = static_cast< sal_uInt16 >( nXclRow1 );
264*b1cdbd2cSJim Jagielski             aXclUsedArea.maLast.mnRow = limit_cast< sal_uInt16 >( nXclRow2, aXclUsedArea.maFirst.mnRow, SAL_MAX_UINT16 );
265*b1cdbd2cSJim Jagielski             // create the Calc range
266*b1cdbd2cSJim Jagielski             SCTAB nScTab = GetCurrScTab();
267*b1cdbd2cSJim Jagielski             ScRange& rScUsedArea = GetExtDocOptions().GetOrCreateTabSettings( nScTab ).maUsedArea;
268*b1cdbd2cSJim Jagielski             GetAddressConverter().ConvertRange( rScUsedArea, aXclUsedArea, nScTab, nScTab, false );
269*b1cdbd2cSJim Jagielski             // if any error occurs in ConvertRange(), rScUsedArea keeps untouched
270*b1cdbd2cSJim Jagielski         }
271*b1cdbd2cSJim Jagielski     }
272*b1cdbd2cSJim Jagielski }
273*b1cdbd2cSJim Jagielski 
ReadBlank()274*b1cdbd2cSJim Jagielski void ImportExcel::ReadBlank()
275*b1cdbd2cSJim Jagielski {
276*b1cdbd2cSJim Jagielski     XclAddress aXclPos;
277*b1cdbd2cSJim Jagielski     aIn >> aXclPos;
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski     ScAddress aScPos( ScAddress::UNINITIALIZED );
280*b1cdbd2cSJim Jagielski     if( GetAddressConverter().ConvertAddress( aScPos, aXclPos, GetCurrScTab(), true ) )
281*b1cdbd2cSJim Jagielski     {
282*b1cdbd2cSJim Jagielski         sal_uInt16 nXFIdx = ReadXFIndex( aScPos, maStrm.GetRecId() == EXC_ID2_BLANK );
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski         GetXFRangeBuffer().SetBlankXF( aScPos, nXFIdx );
285*b1cdbd2cSJim Jagielski     }
286*b1cdbd2cSJim Jagielski }
287*b1cdbd2cSJim Jagielski 
ReadInteger()288*b1cdbd2cSJim Jagielski void ImportExcel::ReadInteger()
289*b1cdbd2cSJim Jagielski {
290*b1cdbd2cSJim Jagielski     XclAddress aXclPos;
291*b1cdbd2cSJim Jagielski     maStrm >> aXclPos;
292*b1cdbd2cSJim Jagielski 
293*b1cdbd2cSJim Jagielski     ScAddress aScPos( ScAddress::UNINITIALIZED );
294*b1cdbd2cSJim Jagielski     if( GetAddressConverter().ConvertAddress( aScPos, aXclPos, GetCurrScTab(), true ) )
295*b1cdbd2cSJim Jagielski     {
296*b1cdbd2cSJim Jagielski         sal_uInt16 nXFIdx = ReadXFIndex( aScPos, true );
297*b1cdbd2cSJim Jagielski         sal_uInt16 nValue;
298*b1cdbd2cSJim Jagielski         maStrm >> nValue;
299*b1cdbd2cSJim Jagielski 
300*b1cdbd2cSJim Jagielski         GetXFRangeBuffer().SetXF( aScPos, nXFIdx );
301*b1cdbd2cSJim Jagielski         GetDoc().PutCell( aScPos, new ScValueCell( nValue ) );
302*b1cdbd2cSJim Jagielski     }
303*b1cdbd2cSJim Jagielski }
304*b1cdbd2cSJim Jagielski 
ReadNumber()305*b1cdbd2cSJim Jagielski void ImportExcel::ReadNumber()
306*b1cdbd2cSJim Jagielski {
307*b1cdbd2cSJim Jagielski     XclAddress aXclPos;
308*b1cdbd2cSJim Jagielski     maStrm >> aXclPos;
309*b1cdbd2cSJim Jagielski 
310*b1cdbd2cSJim Jagielski     ScAddress aScPos( ScAddress::UNINITIALIZED );
311*b1cdbd2cSJim Jagielski     if( GetAddressConverter().ConvertAddress( aScPos, aXclPos, GetCurrScTab(), true ) )
312*b1cdbd2cSJim Jagielski     {
313*b1cdbd2cSJim Jagielski         sal_uInt16 nXFIdx = ReadXFIndex( aScPos, maStrm.GetRecId() == EXC_ID2_NUMBER );
314*b1cdbd2cSJim Jagielski         double fValue;
315*b1cdbd2cSJim Jagielski         maStrm >> fValue;
316*b1cdbd2cSJim Jagielski 
317*b1cdbd2cSJim Jagielski         GetXFRangeBuffer().SetXF( aScPos, nXFIdx );
318*b1cdbd2cSJim Jagielski         GetDoc().PutCell( aScPos, new ScValueCell( fValue ) );
319*b1cdbd2cSJim Jagielski     }
320*b1cdbd2cSJim Jagielski }
321*b1cdbd2cSJim Jagielski 
ReadLabel()322*b1cdbd2cSJim Jagielski void ImportExcel::ReadLabel()
323*b1cdbd2cSJim Jagielski {
324*b1cdbd2cSJim Jagielski     XclAddress aXclPos;
325*b1cdbd2cSJim Jagielski     maStrm >> aXclPos;
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski     ScAddress aScPos( ScAddress::UNINITIALIZED );
328*b1cdbd2cSJim Jagielski     if( GetAddressConverter().ConvertAddress( aScPos, aXclPos, GetCurrScTab(), true ) )
329*b1cdbd2cSJim Jagielski     {
330*b1cdbd2cSJim Jagielski         /*  Record ID   BIFF    XF type     String type
331*b1cdbd2cSJim Jagielski             0x0004      2-7     3 byte      8-bit length, byte string
332*b1cdbd2cSJim Jagielski             0x0004      8       3 byte      16-bit length, unicode string
333*b1cdbd2cSJim Jagielski             0x0204      2-7     2 byte      16-bit length, byte string
334*b1cdbd2cSJim Jagielski             0x0204      8       2 byte      16-bit length, unicode string */
335*b1cdbd2cSJim Jagielski         bool bBiff2 = maStrm.GetRecId() == EXC_ID2_LABEL;
336*b1cdbd2cSJim Jagielski         sal_uInt16 nXFIdx = ReadXFIndex( aScPos, bBiff2 );
337*b1cdbd2cSJim Jagielski         XclStrFlags nFlags = (bBiff2 && (GetBiff() <= EXC_BIFF5)) ? EXC_STR_8BITLENGTH : EXC_STR_DEFAULT;
338*b1cdbd2cSJim Jagielski         XclImpString aString;
339*b1cdbd2cSJim Jagielski 
340*b1cdbd2cSJim Jagielski         // #i63105# use text encoding from FONT record
341*b1cdbd2cSJim Jagielski         rtl_TextEncoding eOldTextEnc = GetTextEncoding();
342*b1cdbd2cSJim Jagielski         if( const XclImpFont* pFont = GetXFBuffer().GetFont( nXFIdx ) )
343*b1cdbd2cSJim Jagielski             SetTextEncoding( pFont->GetFontEncoding() );
344*b1cdbd2cSJim Jagielski         aString.Read( maStrm, nFlags );
345*b1cdbd2cSJim Jagielski         SetTextEncoding( eOldTextEnc );
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski         GetXFRangeBuffer().SetXF( aScPos, nXFIdx );
348*b1cdbd2cSJim Jagielski         if( ScBaseCell* pCell = XclImpStringHelper::CreateCell( GetRoot(), aString, nXFIdx ) )
349*b1cdbd2cSJim Jagielski             GetDoc().PutCell( aScPos, pCell );
350*b1cdbd2cSJim Jagielski     }
351*b1cdbd2cSJim Jagielski }
352*b1cdbd2cSJim Jagielski 
ReadBoolErr()353*b1cdbd2cSJim Jagielski void ImportExcel::ReadBoolErr()
354*b1cdbd2cSJim Jagielski {
355*b1cdbd2cSJim Jagielski     XclAddress aXclPos;
356*b1cdbd2cSJim Jagielski     maStrm >> aXclPos;
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski     ScAddress aScPos( ScAddress::UNINITIALIZED );
359*b1cdbd2cSJim Jagielski     if( GetAddressConverter().ConvertAddress( aScPos, aXclPos, GetCurrScTab(), true ) )
360*b1cdbd2cSJim Jagielski     {
361*b1cdbd2cSJim Jagielski         sal_uInt16 nXFIdx = ReadXFIndex( aScPos, maStrm.GetRecId() == EXC_ID2_BOOLERR );
362*b1cdbd2cSJim Jagielski         sal_uInt8 nValue, nType;
363*b1cdbd2cSJim Jagielski         maStrm >> nValue >> nType;
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski         if( nType == EXC_BOOLERR_BOOL )
366*b1cdbd2cSJim Jagielski             GetXFRangeBuffer().SetBoolXF( aScPos, nXFIdx );
367*b1cdbd2cSJim Jagielski         else
368*b1cdbd2cSJim Jagielski             GetXFRangeBuffer().SetXF( aScPos, nXFIdx );
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski         double fValue;
371*b1cdbd2cSJim Jagielski         const ScTokenArray* pScTokArr = ErrorToFormula( nType, nValue, fValue );
372*b1cdbd2cSJim Jagielski         ScFormulaCell* pCell = new ScFormulaCell( pD, aScPos, pScTokArr );
373*b1cdbd2cSJim Jagielski         pCell->SetHybridDouble( fValue );
374*b1cdbd2cSJim Jagielski         GetDoc().PutCell( aScPos, pCell );
375*b1cdbd2cSJim Jagielski     }
376*b1cdbd2cSJim Jagielski }
377*b1cdbd2cSJim Jagielski 
ReadRk()378*b1cdbd2cSJim Jagielski void ImportExcel::ReadRk()
379*b1cdbd2cSJim Jagielski {
380*b1cdbd2cSJim Jagielski     XclAddress aXclPos;
381*b1cdbd2cSJim Jagielski     maStrm >> aXclPos;
382*b1cdbd2cSJim Jagielski 
383*b1cdbd2cSJim Jagielski     ScAddress aScPos( ScAddress::UNINITIALIZED );
384*b1cdbd2cSJim Jagielski     if( GetAddressConverter().ConvertAddress( aScPos, aXclPos, GetCurrScTab(), true ) )
385*b1cdbd2cSJim Jagielski     {
386*b1cdbd2cSJim Jagielski         sal_uInt16 nXFIdx = ReadXFIndex( aScPos, false );
387*b1cdbd2cSJim Jagielski         sal_Int32 nRk;
388*b1cdbd2cSJim Jagielski         maStrm >> nRk;
389*b1cdbd2cSJim Jagielski 
390*b1cdbd2cSJim Jagielski         GetXFRangeBuffer().SetXF( aScPos, nXFIdx );
391*b1cdbd2cSJim Jagielski         GetDoc().PutCell( aScPos, new ScValueCell( XclTools::GetDoubleFromRK( nRk ) ) );
392*b1cdbd2cSJim Jagielski     }
393*b1cdbd2cSJim Jagielski }
394*b1cdbd2cSJim Jagielski 
395*b1cdbd2cSJim Jagielski 
Window1()396*b1cdbd2cSJim Jagielski void ImportExcel::Window1()
397*b1cdbd2cSJim Jagielski {
398*b1cdbd2cSJim Jagielski     GetDocViewSettings().ReadWindow1( maStrm );
399*b1cdbd2cSJim Jagielski }
400*b1cdbd2cSJim Jagielski 
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski 
403*b1cdbd2cSJim Jagielski 
Row25(void)404*b1cdbd2cSJim Jagielski void ImportExcel::Row25( void )
405*b1cdbd2cSJim Jagielski {
406*b1cdbd2cSJim Jagielski 	sal_uInt16	nRow, nRowHeight;
407*b1cdbd2cSJim Jagielski 
408*b1cdbd2cSJim Jagielski 	aIn >> nRow;
409*b1cdbd2cSJim Jagielski     aIn.Ignore( 4 );   // Mic und Mac ueberspringen
410*b1cdbd2cSJim Jagielski 
411*b1cdbd2cSJim Jagielski     if( ValidRow( nRow ) )
412*b1cdbd2cSJim Jagielski 	{
413*b1cdbd2cSJim Jagielski 		aIn >> nRowHeight;	// direkt in Twips angegeben
414*b1cdbd2cSJim Jagielski         aIn.Ignore( 2 );
415*b1cdbd2cSJim Jagielski 
416*b1cdbd2cSJim Jagielski         if( GetBiff() == EXC_BIFF2 )
417*b1cdbd2cSJim Jagielski 		{// -------------------- BIFF2
418*b1cdbd2cSJim Jagielski             pColRowBuff->SetHeight( nRow, nRowHeight );
419*b1cdbd2cSJim Jagielski 		}
420*b1cdbd2cSJim Jagielski 		else
421*b1cdbd2cSJim Jagielski 		{// -------------------- BIFF5
422*b1cdbd2cSJim Jagielski 			sal_uInt16	nGrbit;
423*b1cdbd2cSJim Jagielski 
424*b1cdbd2cSJim Jagielski             aIn.Ignore( 2 );   // reserved
425*b1cdbd2cSJim Jagielski 			aIn >> nGrbit;
426*b1cdbd2cSJim Jagielski 
427*b1cdbd2cSJim Jagielski             sal_uInt8 nLevel = ::extract_value< sal_uInt8 >( nGrbit, 0, 3 );
428*b1cdbd2cSJim Jagielski             pRowOutlineBuff->SetLevel( nRow, nLevel,
429*b1cdbd2cSJim Jagielski                 ::get_flag( nGrbit, EXC_ROW_COLLAPSED ), ::get_flag( nGrbit, EXC_ROW_HIDDEN ) );
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski             pColRowBuff->SetRowSettings( nRow, nRowHeight, nGrbit );
432*b1cdbd2cSJim Jagielski 		}
433*b1cdbd2cSJim Jagielski 	}
434*b1cdbd2cSJim Jagielski }
435*b1cdbd2cSJim Jagielski 
436*b1cdbd2cSJim Jagielski 
Bof2(void)437*b1cdbd2cSJim Jagielski void ImportExcel::Bof2( void )
438*b1cdbd2cSJim Jagielski {
439*b1cdbd2cSJim Jagielski     sal_uInt16 nSubType;
440*b1cdbd2cSJim Jagielski     maStrm.DisableDecryption();
441*b1cdbd2cSJim Jagielski     maStrm.Ignore( 2 );
442*b1cdbd2cSJim Jagielski     maStrm >> nSubType;
443*b1cdbd2cSJim Jagielski 
444*b1cdbd2cSJim Jagielski     if( nSubType == 0x0020 )        // Chart
445*b1cdbd2cSJim Jagielski 		pExcRoot->eDateiTyp = Biff2C;
446*b1cdbd2cSJim Jagielski     else if( nSubType == 0x0040 )   // Macro
447*b1cdbd2cSJim Jagielski 		pExcRoot->eDateiTyp = Biff2M;
448*b1cdbd2cSJim Jagielski     else                            // #i51490# Excel interprets invalid indexes as worksheet
449*b1cdbd2cSJim Jagielski         pExcRoot->eDateiTyp = Biff2;
450*b1cdbd2cSJim Jagielski }
451*b1cdbd2cSJim Jagielski 
452*b1cdbd2cSJim Jagielski 
Eof(void)453*b1cdbd2cSJim Jagielski void ImportExcel::Eof( void )
454*b1cdbd2cSJim Jagielski {
455*b1cdbd2cSJim Jagielski 	//	POST: darf nur nach einer GUELTIGEN Tabelle gerufen werden!
456*b1cdbd2cSJim Jagielski 	EndSheet();
457*b1cdbd2cSJim Jagielski     IncCurrScTab();
458*b1cdbd2cSJim Jagielski }
459*b1cdbd2cSJim Jagielski 
460*b1cdbd2cSJim Jagielski 
SheetPassword(void)461*b1cdbd2cSJim Jagielski void ImportExcel::SheetPassword( void )
462*b1cdbd2cSJim Jagielski {
463*b1cdbd2cSJim Jagielski     if (GetRoot().GetBiff() != EXC_BIFF8)
464*b1cdbd2cSJim Jagielski         return;
465*b1cdbd2cSJim Jagielski 
466*b1cdbd2cSJim Jagielski     GetRoot().GetSheetProtectBuffer().ReadPasswordHash( aIn, GetCurrScTab() );
467*b1cdbd2cSJim Jagielski }
468*b1cdbd2cSJim Jagielski 
469*b1cdbd2cSJim Jagielski 
Externsheet(void)470*b1cdbd2cSJim Jagielski void ImportExcel::Externsheet( void )
471*b1cdbd2cSJim Jagielski {
472*b1cdbd2cSJim Jagielski     String aUrl, aTabName;
473*b1cdbd2cSJim Jagielski     bool bSameWorkBook;
474*b1cdbd2cSJim Jagielski     String aEncodedUrl( aIn.ReadByteString( false ) );
475*b1cdbd2cSJim Jagielski     XclImpUrlHelper::DecodeUrl( aUrl, aTabName, bSameWorkBook, *pExcRoot->pIR, aEncodedUrl );
476*b1cdbd2cSJim Jagielski     mnLastRefIdx = pExcRoot->pExtSheetBuff->Add( aUrl, aTabName, bSameWorkBook );
477*b1cdbd2cSJim Jagielski }
478*b1cdbd2cSJim Jagielski 
479*b1cdbd2cSJim Jagielski 
WinProtection(void)480*b1cdbd2cSJim Jagielski void ImportExcel:: WinProtection( void )
481*b1cdbd2cSJim Jagielski {
482*b1cdbd2cSJim Jagielski     if (GetRoot().GetBiff() != EXC_BIFF8)
483*b1cdbd2cSJim Jagielski         return;
484*b1cdbd2cSJim Jagielski 
485*b1cdbd2cSJim Jagielski     GetRoot().GetDocProtectBuffer().ReadWinProtect( aIn );
486*b1cdbd2cSJim Jagielski }
487*b1cdbd2cSJim Jagielski 
488*b1cdbd2cSJim Jagielski 
Columndefault(void)489*b1cdbd2cSJim Jagielski void ImportExcel::Columndefault( void )
490*b1cdbd2cSJim Jagielski {// Default Cell Attributes
491*b1cdbd2cSJim Jagielski 	sal_uInt16	nColMic, nColMac;
492*b1cdbd2cSJim Jagielski 	sal_uInt8	nOpt0;
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski 	aIn >> nColMic >> nColMac;
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski     DBG_ASSERT( aIn.GetRecLeft() == (sal_Size)(nColMac - nColMic) * 3 + 2,
497*b1cdbd2cSJim Jagielski                 "ImportExcel::Columndefault - wrong record size" );
498*b1cdbd2cSJim Jagielski 
499*b1cdbd2cSJim Jagielski 	nColMac--;
500*b1cdbd2cSJim Jagielski 
501*b1cdbd2cSJim Jagielski 	if( nColMac > MAXCOL )
502*b1cdbd2cSJim Jagielski 		nColMac = static_cast<sal_uInt16>(MAXCOL);
503*b1cdbd2cSJim Jagielski 
504*b1cdbd2cSJim Jagielski 	for( sal_uInt16 nCol = nColMic ; nCol <= nColMac ; nCol++ )
505*b1cdbd2cSJim Jagielski 	{
506*b1cdbd2cSJim Jagielski 		aIn >> nOpt0;
507*b1cdbd2cSJim Jagielski         aIn.Ignore( 2 );   // nur 0. Attribut-Byte benutzt
508*b1cdbd2cSJim Jagielski 
509*b1cdbd2cSJim Jagielski 		if( nOpt0 & 0x80 )	// Col hidden?
510*b1cdbd2cSJim Jagielski             pColRowBuff->HideCol( nCol );
511*b1cdbd2cSJim Jagielski 	}
512*b1cdbd2cSJim Jagielski }
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski 
Array25(void)515*b1cdbd2cSJim Jagielski void ImportExcel::Array25( void )
516*b1cdbd2cSJim Jagielski {
517*b1cdbd2cSJim Jagielski 	sal_uInt16		nFirstRow, nLastRow, nFormLen;
518*b1cdbd2cSJim Jagielski 	sal_uInt8		nFirstCol, nLastCol;
519*b1cdbd2cSJim Jagielski 
520*b1cdbd2cSJim Jagielski 	aIn >> nFirstRow >> nLastRow >> nFirstCol >> nLastCol;
521*b1cdbd2cSJim Jagielski 
522*b1cdbd2cSJim Jagielski     if( GetBiff() == EXC_BIFF2 )
523*b1cdbd2cSJim Jagielski 	{//						BIFF2
524*b1cdbd2cSJim Jagielski         aIn.Ignore( 1 );
525*b1cdbd2cSJim Jagielski 		nFormLen = aIn.ReaduInt8();
526*b1cdbd2cSJim Jagielski 	}
527*b1cdbd2cSJim Jagielski 	else
528*b1cdbd2cSJim Jagielski 	{//						BIFF5
529*b1cdbd2cSJim Jagielski         aIn.Ignore( 6 );
530*b1cdbd2cSJim Jagielski 		aIn >> nFormLen;
531*b1cdbd2cSJim Jagielski 	}
532*b1cdbd2cSJim Jagielski 
533*b1cdbd2cSJim Jagielski     if( ValidColRow( nLastCol, nLastRow ) )
534*b1cdbd2cSJim Jagielski 	{
535*b1cdbd2cSJim Jagielski 		// jetzt steht Lesemarke auf Formel, Laenge in nFormLen
536*b1cdbd2cSJim Jagielski 		const ScTokenArray*	pErgebnis;
537*b1cdbd2cSJim Jagielski 
538*b1cdbd2cSJim Jagielski         pFormConv->Reset( ScAddress( static_cast<SCCOL>(nFirstCol),
539*b1cdbd2cSJim Jagielski                     static_cast<SCROW>(nFirstRow), GetCurrScTab() ) );
540*b1cdbd2cSJim Jagielski         pFormConv->Convert( pErgebnis, maStrm, nFormLen, true, FT_CellFormula);
541*b1cdbd2cSJim Jagielski 
542*b1cdbd2cSJim Jagielski 		DBG_ASSERT( pErgebnis, "*ImportExcel::Array25(): ScTokenArray ist NULL!" );
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski 		ScMarkData			aMarkData;
545*b1cdbd2cSJim Jagielski         aMarkData.SelectOneTable( GetCurrScTab() );
546*b1cdbd2cSJim Jagielski         pD->InsertMatrixFormula( static_cast<SCCOL>(nFirstCol),
547*b1cdbd2cSJim Jagielski                 static_cast<SCROW>(nFirstRow), static_cast<SCCOL>(nLastCol),
548*b1cdbd2cSJim Jagielski                 static_cast<SCROW>(nLastRow), aMarkData, EMPTY_STRING,
549*b1cdbd2cSJim Jagielski                 pErgebnis );
550*b1cdbd2cSJim Jagielski 	}
551*b1cdbd2cSJim Jagielski }
552*b1cdbd2cSJim Jagielski 
553*b1cdbd2cSJim Jagielski 
Rec1904(void)554*b1cdbd2cSJim Jagielski void ImportExcel::Rec1904( void )
555*b1cdbd2cSJim Jagielski {
556*b1cdbd2cSJim Jagielski 	sal_uInt16	n1904;
557*b1cdbd2cSJim Jagielski 
558*b1cdbd2cSJim Jagielski 	aIn >> n1904;
559*b1cdbd2cSJim Jagielski 
560*b1cdbd2cSJim Jagielski 	if( n1904 )
561*b1cdbd2cSJim Jagielski 	{// 1904 date system
562*b1cdbd2cSJim Jagielski 		ScDocOptions aOpt = pD->GetDocOptions();
563*b1cdbd2cSJim Jagielski 		aOpt.SetDate( 1, 1, 1904 );
564*b1cdbd2cSJim Jagielski 		pD->SetDocOptions( aOpt );
565*b1cdbd2cSJim Jagielski 		pD->GetFormatTable()->ChangeNullDate( 1, 1, 1904 );
566*b1cdbd2cSJim Jagielski 	}
567*b1cdbd2cSJim Jagielski }
568*b1cdbd2cSJim Jagielski 
569*b1cdbd2cSJim Jagielski 
Externname25(void)570*b1cdbd2cSJim Jagielski void ImportExcel::Externname25( void )
571*b1cdbd2cSJim Jagielski {
572*b1cdbd2cSJim Jagielski 	sal_uInt32		nRes;
573*b1cdbd2cSJim Jagielski 	sal_uInt16		nOpt;
574*b1cdbd2cSJim Jagielski 
575*b1cdbd2cSJim Jagielski 	aIn >> nOpt >> nRes;
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski     String aName( aIn.ReadByteString( sal_False ) );
578*b1cdbd2cSJim Jagielski 
579*b1cdbd2cSJim Jagielski 	if( ( nOpt & 0x0001 ) || ( ( nOpt & 0xFFFE ) == 0x0000 ) )
580*b1cdbd2cSJim Jagielski 	{// external name
581*b1cdbd2cSJim Jagielski         ScfTools::ConvertToScDefinedName( aName );
582*b1cdbd2cSJim Jagielski         pExcRoot->pExtNameBuff->AddName( aName, mnLastRefIdx );
583*b1cdbd2cSJim Jagielski 	}
584*b1cdbd2cSJim Jagielski 	else if( nOpt & 0x0010 )
585*b1cdbd2cSJim Jagielski 	{// ole link
586*b1cdbd2cSJim Jagielski         pExcRoot->pExtNameBuff->AddOLE( aName, mnLastRefIdx, nRes );        // nRes is storage ID
587*b1cdbd2cSJim Jagielski 	}
588*b1cdbd2cSJim Jagielski 	else
589*b1cdbd2cSJim Jagielski 	{// dde link
590*b1cdbd2cSJim Jagielski         pExcRoot->pExtNameBuff->AddDDE( aName, mnLastRefIdx );
591*b1cdbd2cSJim Jagielski 	}
592*b1cdbd2cSJim Jagielski }
593*b1cdbd2cSJim Jagielski 
594*b1cdbd2cSJim Jagielski 
Colwidth(void)595*b1cdbd2cSJim Jagielski void ImportExcel::Colwidth( void )
596*b1cdbd2cSJim Jagielski {// Column Width
597*b1cdbd2cSJim Jagielski 	sal_uInt8	nColFirst, nColLast;
598*b1cdbd2cSJim Jagielski 	sal_uInt16	nColWidth;
599*b1cdbd2cSJim Jagielski 
600*b1cdbd2cSJim Jagielski 	aIn >> nColFirst >> nColLast >> nColWidth;
601*b1cdbd2cSJim Jagielski 
602*b1cdbd2cSJim Jagielski //! TODO: add a check for the unlikely case of changed MAXCOL (-> XclImpAddressConverter)
603*b1cdbd2cSJim Jagielski //   if( nColLast > MAXCOL )
604*b1cdbd2cSJim Jagielski //       nColLast = static_cast<sal_uInt16>(MAXCOL);
605*b1cdbd2cSJim Jagielski 
606*b1cdbd2cSJim Jagielski     sal_uInt16 nScWidth = XclTools::GetScColumnWidth( nColWidth, GetCharWidth() );
607*b1cdbd2cSJim Jagielski     pColRowBuff->SetWidthRange( nColFirst, nColLast, nScWidth );
608*b1cdbd2cSJim Jagielski }
609*b1cdbd2cSJim Jagielski 
610*b1cdbd2cSJim Jagielski 
Defrowheight2(void)611*b1cdbd2cSJim Jagielski void ImportExcel::Defrowheight2( void )
612*b1cdbd2cSJim Jagielski {
613*b1cdbd2cSJim Jagielski     sal_uInt16 nDefHeight;
614*b1cdbd2cSJim Jagielski     maStrm >> nDefHeight;
615*b1cdbd2cSJim Jagielski     nDefHeight &= 0x7FFF;
616*b1cdbd2cSJim Jagielski     pColRowBuff->SetDefHeight( nDefHeight, EXC_DEFROW_UNSYNCED );
617*b1cdbd2cSJim Jagielski }
618*b1cdbd2cSJim Jagielski 
619*b1cdbd2cSJim Jagielski 
SheetProtect(void)620*b1cdbd2cSJim Jagielski void ImportExcel::SheetProtect( void )
621*b1cdbd2cSJim Jagielski {
622*b1cdbd2cSJim Jagielski     if (GetRoot().GetBiff() != EXC_BIFF8)
623*b1cdbd2cSJim Jagielski         return;
624*b1cdbd2cSJim Jagielski 
625*b1cdbd2cSJim Jagielski     GetRoot().GetSheetProtectBuffer().ReadProtect( aIn, GetCurrScTab() );
626*b1cdbd2cSJim Jagielski }
627*b1cdbd2cSJim Jagielski 
DocProtect(void)628*b1cdbd2cSJim Jagielski void ImportExcel::DocProtect( void )
629*b1cdbd2cSJim Jagielski {
630*b1cdbd2cSJim Jagielski     if (GetRoot().GetBiff() != EXC_BIFF8)
631*b1cdbd2cSJim Jagielski         return;
632*b1cdbd2cSJim Jagielski 
633*b1cdbd2cSJim Jagielski     GetRoot().GetDocProtectBuffer().ReadDocProtect( aIn );
634*b1cdbd2cSJim Jagielski }
635*b1cdbd2cSJim Jagielski 
DocPasssword(void)636*b1cdbd2cSJim Jagielski void ImportExcel::DocPasssword( void )
637*b1cdbd2cSJim Jagielski {
638*b1cdbd2cSJim Jagielski     if (GetRoot().GetBiff() != EXC_BIFF8)
639*b1cdbd2cSJim Jagielski         return;
640*b1cdbd2cSJim Jagielski 
641*b1cdbd2cSJim Jagielski     GetRoot().GetDocProtectBuffer().ReadPasswordHash( aIn );
642*b1cdbd2cSJim Jagielski }
643*b1cdbd2cSJim Jagielski 
Codepage(void)644*b1cdbd2cSJim Jagielski void ImportExcel::Codepage( void )
645*b1cdbd2cSJim Jagielski {
646*b1cdbd2cSJim Jagielski     SetCodePage( maStrm.ReaduInt16() );
647*b1cdbd2cSJim Jagielski }
648*b1cdbd2cSJim Jagielski 
649*b1cdbd2cSJim Jagielski 
Ixfe(void)650*b1cdbd2cSJim Jagielski void ImportExcel::Ixfe( void )
651*b1cdbd2cSJim Jagielski {
652*b1cdbd2cSJim Jagielski 	maStrm >> mnIxfeIndex;
653*b1cdbd2cSJim Jagielski }
654*b1cdbd2cSJim Jagielski 
655*b1cdbd2cSJim Jagielski 
DefColWidth(void)656*b1cdbd2cSJim Jagielski void ImportExcel::DefColWidth( void )
657*b1cdbd2cSJim Jagielski {
658*b1cdbd2cSJim Jagielski     // stored as entire characters -> convert to 1/256 of characters (as in COLINFO)
659*b1cdbd2cSJim Jagielski     double fDefWidth = 256.0 * maStrm.ReaduInt16();
660*b1cdbd2cSJim Jagielski 
661*b1cdbd2cSJim Jagielski     // #i3006# additional space for default width - Excel adds space depending on font size
662*b1cdbd2cSJim Jagielski     long nFontHt = GetFontBuffer().GetAppFontData().mnHeight;
663*b1cdbd2cSJim Jagielski     fDefWidth += XclTools::GetXclDefColWidthCorrection( nFontHt );
664*b1cdbd2cSJim Jagielski 
665*b1cdbd2cSJim Jagielski     sal_uInt16 nScWidth = XclTools::GetScColumnWidth( limit_cast< sal_uInt16 >( fDefWidth ), GetCharWidth() );
666*b1cdbd2cSJim Jagielski     pColRowBuff->SetDefWidth( nScWidth );
667*b1cdbd2cSJim Jagielski }
668*b1cdbd2cSJim Jagielski 
669*b1cdbd2cSJim Jagielski 
Builtinfmtcnt(void)670*b1cdbd2cSJim Jagielski void ImportExcel::Builtinfmtcnt( void )
671*b1cdbd2cSJim Jagielski {
672*b1cdbd2cSJim Jagielski }
673*b1cdbd2cSJim Jagielski 
674*b1cdbd2cSJim Jagielski 
Colinfo(void)675*b1cdbd2cSJim Jagielski void ImportExcel::Colinfo( void )
676*b1cdbd2cSJim Jagielski {// Column Formatting Information
677*b1cdbd2cSJim Jagielski 	sal_uInt16	nColFirst, nColLast, nColWidth, nXF;
678*b1cdbd2cSJim Jagielski 	sal_uInt16	nOpt;
679*b1cdbd2cSJim Jagielski 
680*b1cdbd2cSJim Jagielski 	aIn >> nColFirst >> nColLast >> nColWidth >> nXF >> nOpt;
681*b1cdbd2cSJim Jagielski 
682*b1cdbd2cSJim Jagielski 	if( nColFirst > MAXCOL )
683*b1cdbd2cSJim Jagielski 		return;
684*b1cdbd2cSJim Jagielski 
685*b1cdbd2cSJim Jagielski 	if( nColLast > MAXCOL )
686*b1cdbd2cSJim Jagielski 		nColLast = static_cast<sal_uInt16>(MAXCOL);
687*b1cdbd2cSJim Jagielski 
688*b1cdbd2cSJim Jagielski     bool bHidden = ::get_flag( nOpt, EXC_COLINFO_HIDDEN );
689*b1cdbd2cSJim Jagielski     bool bCollapsed = ::get_flag( nOpt, EXC_COLINFO_COLLAPSED );
690*b1cdbd2cSJim Jagielski     sal_uInt8 nLevel = ::extract_value< sal_uInt8 >( nOpt, 8, 3 );
691*b1cdbd2cSJim Jagielski     pColOutlineBuff->SetLevelRange( nColFirst, nColLast, nLevel, bCollapsed, bHidden );
692*b1cdbd2cSJim Jagielski 
693*b1cdbd2cSJim Jagielski     if( bHidden )
694*b1cdbd2cSJim Jagielski         pColRowBuff->HideColRange( nColFirst, nColLast );
695*b1cdbd2cSJim Jagielski 
696*b1cdbd2cSJim Jagielski     sal_uInt16 nScWidth = XclTools::GetScColumnWidth( nColWidth, GetCharWidth() );
697*b1cdbd2cSJim Jagielski     pColRowBuff->SetWidthRange( nColFirst, nColLast, nScWidth );
698*b1cdbd2cSJim Jagielski     pColRowBuff->SetDefaultXF( nColFirst, nColLast, nXF );
699*b1cdbd2cSJim Jagielski }
700*b1cdbd2cSJim Jagielski 
701*b1cdbd2cSJim Jagielski 
Wsbool(void)702*b1cdbd2cSJim Jagielski void ImportExcel::Wsbool( void )
703*b1cdbd2cSJim Jagielski {
704*b1cdbd2cSJim Jagielski 	sal_uInt16 nFlags;
705*b1cdbd2cSJim Jagielski 	aIn >> nFlags;
706*b1cdbd2cSJim Jagielski 
707*b1cdbd2cSJim Jagielski     pRowOutlineBuff->SetButtonMode( ::get_flag( nFlags, EXC_WSBOOL_ROWBELOW ) );
708*b1cdbd2cSJim Jagielski     pColOutlineBuff->SetButtonMode( ::get_flag( nFlags, EXC_WSBOOL_COLBELOW ) );
709*b1cdbd2cSJim Jagielski 
710*b1cdbd2cSJim Jagielski     GetPageSettings().SetFitToPages( ::get_flag( nFlags, EXC_WSBOOL_FITTOPAGE ) );
711*b1cdbd2cSJim Jagielski }
712*b1cdbd2cSJim Jagielski 
713*b1cdbd2cSJim Jagielski 
Boundsheet(void)714*b1cdbd2cSJim Jagielski void ImportExcel::Boundsheet( void )
715*b1cdbd2cSJim Jagielski {
716*b1cdbd2cSJim Jagielski     sal_uInt16 nGrbit = 0;
717*b1cdbd2cSJim Jagielski 
718*b1cdbd2cSJim Jagielski     if( GetBiff() == EXC_BIFF5 )
719*b1cdbd2cSJim Jagielski 	{
720*b1cdbd2cSJim Jagielski         aIn.DisableDecryption();
721*b1cdbd2cSJim Jagielski         maSheetOffsets.push_back( aIn.ReaduInt32() );
722*b1cdbd2cSJim Jagielski         aIn.EnableDecryption();
723*b1cdbd2cSJim Jagielski 		aIn >> nGrbit;
724*b1cdbd2cSJim Jagielski 	}
725*b1cdbd2cSJim Jagielski 
726*b1cdbd2cSJim Jagielski     String aName( aIn.ReadByteString( sal_False ) );
727*b1cdbd2cSJim Jagielski 
728*b1cdbd2cSJim Jagielski     SCTAB nScTab = static_cast< SCTAB >( nBdshtTab );
729*b1cdbd2cSJim Jagielski     if( nScTab > 0 )
730*b1cdbd2cSJim Jagielski 	{
731*b1cdbd2cSJim Jagielski         DBG_ASSERT( !pD->HasTable( nScTab ), "ImportExcel::Boundsheet - sheet exists already" );
732*b1cdbd2cSJim Jagielski         pD->MakeTable( nScTab );
733*b1cdbd2cSJim Jagielski 	}
734*b1cdbd2cSJim Jagielski 
735*b1cdbd2cSJim Jagielski 	if( ( nGrbit & 0x0001 ) || ( nGrbit & 0x0002 ) )
736*b1cdbd2cSJim Jagielski         pD->SetVisible( nScTab, sal_False );
737*b1cdbd2cSJim Jagielski 
738*b1cdbd2cSJim Jagielski     if( !pD->RenameTab( nScTab, aName ) )
739*b1cdbd2cSJim Jagielski     {
740*b1cdbd2cSJim Jagielski         pD->CreateValidTabName( aName );
741*b1cdbd2cSJim Jagielski         pD->RenameTab( nScTab, aName );
742*b1cdbd2cSJim Jagielski     }
743*b1cdbd2cSJim Jagielski 
744*b1cdbd2cSJim Jagielski 	nBdshtTab++;
745*b1cdbd2cSJim Jagielski }
746*b1cdbd2cSJim Jagielski 
747*b1cdbd2cSJim Jagielski 
Country(void)748*b1cdbd2cSJim Jagielski void ImportExcel::Country( void )
749*b1cdbd2cSJim Jagielski {
750*b1cdbd2cSJim Jagielski     sal_uInt16 nUICountry, nDocCountry;
751*b1cdbd2cSJim Jagielski     maStrm >> nUICountry >> nDocCountry;
752*b1cdbd2cSJim Jagielski 
753*b1cdbd2cSJim Jagielski     // Store system language in XclRoot
754*b1cdbd2cSJim Jagielski     LanguageType eLanguage = ::msfilter::ConvertCountryToLanguage( static_cast< ::msfilter::CountryId >( nDocCountry ) );
755*b1cdbd2cSJim Jagielski     if( eLanguage != LANGUAGE_DONTKNOW )
756*b1cdbd2cSJim Jagielski         SetDocLanguage( eLanguage );
757*b1cdbd2cSJim Jagielski 
758*b1cdbd2cSJim Jagielski     // Set Excel UI language in add-in name translator
759*b1cdbd2cSJim Jagielski     eLanguage = ::msfilter::ConvertCountryToLanguage( static_cast< ::msfilter::CountryId >( nUICountry ) );
760*b1cdbd2cSJim Jagielski     if( eLanguage != LANGUAGE_DONTKNOW )
761*b1cdbd2cSJim Jagielski         SetUILanguage( eLanguage );
762*b1cdbd2cSJim Jagielski }
763*b1cdbd2cSJim Jagielski 
764*b1cdbd2cSJim Jagielski 
ReadUsesElfs()765*b1cdbd2cSJim Jagielski void ImportExcel::ReadUsesElfs()
766*b1cdbd2cSJim Jagielski {
767*b1cdbd2cSJim Jagielski     if( maStrm.ReaduInt16() != 0 )
768*b1cdbd2cSJim Jagielski     {
769*b1cdbd2cSJim Jagielski         ScDocOptions aDocOpt = GetDoc().GetDocOptions();
770*b1cdbd2cSJim Jagielski         aDocOpt.SetLookUpColRowNames( sal_True );
771*b1cdbd2cSJim Jagielski         GetDoc().SetDocOptions( aDocOpt );
772*b1cdbd2cSJim Jagielski     }
773*b1cdbd2cSJim Jagielski }
774*b1cdbd2cSJim Jagielski 
775*b1cdbd2cSJim Jagielski 
Hideobj(void)776*b1cdbd2cSJim Jagielski void ImportExcel::Hideobj( void )
777*b1cdbd2cSJim Jagielski {
778*b1cdbd2cSJim Jagielski 	sal_uInt16		nHide;
779*b1cdbd2cSJim Jagielski 	ScVObjMode	eOle, eChart, eDraw;
780*b1cdbd2cSJim Jagielski 
781*b1cdbd2cSJim Jagielski 	aIn >> nHide;
782*b1cdbd2cSJim Jagielski 
783*b1cdbd2cSJim Jagielski 	ScViewOptions aOpts( pD->GetViewOptions() );
784*b1cdbd2cSJim Jagielski 
785*b1cdbd2cSJim Jagielski 	switch( nHide )
786*b1cdbd2cSJim Jagielski 	{
787*b1cdbd2cSJim Jagielski 		case 1:							// Placeholders
788*b1cdbd2cSJim Jagielski 			eOle   = VOBJ_MODE_SHOW;	// in Excel 97 werden nur Charts als Platzhalter angezeigt
789*b1cdbd2cSJim Jagielski 			eChart = VOBJ_MODE_SHOW;	//#i80528# VOBJ_MODE_DUMMY replaced by VOBJ_MODE_SHOW now
790*b1cdbd2cSJim Jagielski 			eDraw  = VOBJ_MODE_SHOW;
791*b1cdbd2cSJim Jagielski 			break;
792*b1cdbd2cSJim Jagielski 		case 2:							// Hide all
793*b1cdbd2cSJim Jagielski 			eOle   = VOBJ_MODE_HIDE;
794*b1cdbd2cSJim Jagielski 			eChart = VOBJ_MODE_HIDE;
795*b1cdbd2cSJim Jagielski 			eDraw  = VOBJ_MODE_HIDE;
796*b1cdbd2cSJim Jagielski 			break;
797*b1cdbd2cSJim Jagielski 		default:						// Show all
798*b1cdbd2cSJim Jagielski 			eOle   = VOBJ_MODE_SHOW;
799*b1cdbd2cSJim Jagielski 			eChart = VOBJ_MODE_SHOW;
800*b1cdbd2cSJim Jagielski 			eDraw  = VOBJ_MODE_SHOW;
801*b1cdbd2cSJim Jagielski 			break;
802*b1cdbd2cSJim Jagielski 	}
803*b1cdbd2cSJim Jagielski 
804*b1cdbd2cSJim Jagielski 	aOpts.SetObjMode( VOBJ_TYPE_OLE,   eOle );
805*b1cdbd2cSJim Jagielski 	aOpts.SetObjMode( VOBJ_TYPE_CHART, eChart );
806*b1cdbd2cSJim Jagielski 	aOpts.SetObjMode( VOBJ_TYPE_DRAW,  eDraw );
807*b1cdbd2cSJim Jagielski 
808*b1cdbd2cSJim Jagielski 	pD->SetViewOptions( aOpts );
809*b1cdbd2cSJim Jagielski }
810*b1cdbd2cSJim Jagielski 
811*b1cdbd2cSJim Jagielski 
Bundleheader(void)812*b1cdbd2cSJim Jagielski void ImportExcel::Bundleheader( void )
813*b1cdbd2cSJim Jagielski {
814*b1cdbd2cSJim Jagielski }
815*b1cdbd2cSJim Jagielski 
816*b1cdbd2cSJim Jagielski 
Standardwidth(void)817*b1cdbd2cSJim Jagielski void ImportExcel::Standardwidth( void )
818*b1cdbd2cSJim Jagielski {
819*b1cdbd2cSJim Jagielski     sal_uInt16 nScWidth = XclTools::GetScColumnWidth( maStrm.ReaduInt16(), GetCharWidth() );
820*b1cdbd2cSJim Jagielski     pColRowBuff->SetDefWidth( nScWidth, sal_True );
821*b1cdbd2cSJim Jagielski }
822*b1cdbd2cSJim Jagielski 
823*b1cdbd2cSJim Jagielski 
Shrfmla(void)824*b1cdbd2cSJim Jagielski void ImportExcel::Shrfmla( void )
825*b1cdbd2cSJim Jagielski {
826*b1cdbd2cSJim Jagielski 	sal_uInt16				nFirstRow, nLastRow, nLenExpr;
827*b1cdbd2cSJim Jagielski 	sal_uInt8				nFirstCol, nLastCol;
828*b1cdbd2cSJim Jagielski 
829*b1cdbd2cSJim Jagielski 	aIn >> nFirstRow >> nLastRow >> nFirstCol >> nLastCol;
830*b1cdbd2cSJim Jagielski     aIn.Ignore( 2 );
831*b1cdbd2cSJim Jagielski 	aIn >> nLenExpr;
832*b1cdbd2cSJim Jagielski 
833*b1cdbd2cSJim Jagielski 	// jetzt steht Lesemarke an der Formel
834*b1cdbd2cSJim Jagielski 
835*b1cdbd2cSJim Jagielski 	const ScTokenArray*	pErgebnis;
836*b1cdbd2cSJim Jagielski 
837*b1cdbd2cSJim Jagielski 	pFormConv->Reset();
838*b1cdbd2cSJim Jagielski     pFormConv->Convert( pErgebnis, maStrm, nLenExpr, true, FT_SharedFormula );
839*b1cdbd2cSJim Jagielski 
840*b1cdbd2cSJim Jagielski 
841*b1cdbd2cSJim Jagielski 	DBG_ASSERT( pErgebnis, "+ImportExcel::Shrfmla(): ScTokenArray ist NULL!" );
842*b1cdbd2cSJim Jagielski 
843*b1cdbd2cSJim Jagielski     pExcRoot->pShrfmlaBuff->Store( ScRange( static_cast<SCCOL>(nFirstCol),
844*b1cdbd2cSJim Jagielski                 static_cast<SCROW>(nFirstRow), GetCurrScTab(),
845*b1cdbd2cSJim Jagielski                 static_cast<SCCOL>(nLastCol), static_cast<SCROW>(nLastRow),
846*b1cdbd2cSJim Jagielski                 GetCurrScTab()), *pErgebnis );
847*b1cdbd2cSJim Jagielski }
848*b1cdbd2cSJim Jagielski 
849*b1cdbd2cSJim Jagielski 
Mulrk(void)850*b1cdbd2cSJim Jagielski void ImportExcel::Mulrk( void )
851*b1cdbd2cSJim Jagielski {
852*b1cdbd2cSJim Jagielski     XclAddress aXclPos;
853*b1cdbd2cSJim Jagielski     sal_uInt16  nXF;
854*b1cdbd2cSJim Jagielski     sal_Int32   nRkNum;
855*b1cdbd2cSJim Jagielski 
856*b1cdbd2cSJim Jagielski     aIn >> aXclPos;
857*b1cdbd2cSJim Jagielski 
858*b1cdbd2cSJim Jagielski     for( XclAddress aCurrXclPos( aXclPos ); (aXclPos.mnCol <= aCurrXclPos.mnCol) && (aIn.GetRecLeft() > 2); ++aCurrXclPos.mnCol )
859*b1cdbd2cSJim Jagielski     {
860*b1cdbd2cSJim Jagielski         aIn >> nXF >> nRkNum;
861*b1cdbd2cSJim Jagielski 
862*b1cdbd2cSJim Jagielski         ScAddress aScPos( ScAddress::UNINITIALIZED );
863*b1cdbd2cSJim Jagielski         if( GetAddressConverter().ConvertAddress( aScPos, aCurrXclPos, GetCurrScTab(), true ) )
864*b1cdbd2cSJim Jagielski         {
865*b1cdbd2cSJim Jagielski             GetXFRangeBuffer().SetXF( aScPos, nXF );
866*b1cdbd2cSJim Jagielski             GetDoc().PutCell( aScPos, new ScValueCell( XclTools::GetDoubleFromRK( nRkNum ) ) );
867*b1cdbd2cSJim Jagielski         }
868*b1cdbd2cSJim Jagielski     }
869*b1cdbd2cSJim Jagielski }
870*b1cdbd2cSJim Jagielski 
871*b1cdbd2cSJim Jagielski 
Mulblank(void)872*b1cdbd2cSJim Jagielski void ImportExcel::Mulblank( void )
873*b1cdbd2cSJim Jagielski {
874*b1cdbd2cSJim Jagielski     XclAddress aXclPos;
875*b1cdbd2cSJim Jagielski     sal_uInt16  nXF;
876*b1cdbd2cSJim Jagielski 
877*b1cdbd2cSJim Jagielski     aIn >> aXclPos;
878*b1cdbd2cSJim Jagielski 
879*b1cdbd2cSJim Jagielski     for( XclAddress aCurrXclPos( aXclPos ); (aXclPos.mnCol <= aCurrXclPos.mnCol) && (aIn.GetRecLeft() > 2); ++aCurrXclPos.mnCol )
880*b1cdbd2cSJim Jagielski     {
881*b1cdbd2cSJim Jagielski         aIn >> nXF;
882*b1cdbd2cSJim Jagielski 
883*b1cdbd2cSJim Jagielski         ScAddress aScPos( ScAddress::UNINITIALIZED );
884*b1cdbd2cSJim Jagielski         if( GetAddressConverter().ConvertAddress( aScPos, aCurrXclPos, GetCurrScTab(), true ) )
885*b1cdbd2cSJim Jagielski             GetXFRangeBuffer().SetBlankXF( aScPos, nXF );
886*b1cdbd2cSJim Jagielski     }
887*b1cdbd2cSJim Jagielski }
888*b1cdbd2cSJim Jagielski 
889*b1cdbd2cSJim Jagielski 
Rstring(void)890*b1cdbd2cSJim Jagielski void ImportExcel::Rstring( void )
891*b1cdbd2cSJim Jagielski {
892*b1cdbd2cSJim Jagielski     XclAddress aXclPos;
893*b1cdbd2cSJim Jagielski     sal_uInt16 nXFIdx;
894*b1cdbd2cSJim Jagielski     aIn >> aXclPos >> nXFIdx;
895*b1cdbd2cSJim Jagielski 
896*b1cdbd2cSJim Jagielski     ScAddress aScPos( ScAddress::UNINITIALIZED );
897*b1cdbd2cSJim Jagielski     if( GetAddressConverter().ConvertAddress( aScPos, aXclPos, GetCurrScTab(), true ) )
898*b1cdbd2cSJim Jagielski     {
899*b1cdbd2cSJim Jagielski         // unformatted Unicode string with separate formatting information
900*b1cdbd2cSJim Jagielski         XclImpString aString;
901*b1cdbd2cSJim Jagielski 
902*b1cdbd2cSJim Jagielski         // #i63105# use text encoding from FONT record
903*b1cdbd2cSJim Jagielski         rtl_TextEncoding eOldTextEnc = GetTextEncoding();
904*b1cdbd2cSJim Jagielski         if( const XclImpFont* pFont = GetXFBuffer().GetFont( nXFIdx ) )
905*b1cdbd2cSJim Jagielski             SetTextEncoding( pFont->GetFontEncoding() );
906*b1cdbd2cSJim Jagielski         aString.Read( maStrm );
907*b1cdbd2cSJim Jagielski         SetTextEncoding( eOldTextEnc );
908*b1cdbd2cSJim Jagielski 
909*b1cdbd2cSJim Jagielski         // character formatting runs
910*b1cdbd2cSJim Jagielski         if( !aString.IsRich() )
911*b1cdbd2cSJim Jagielski             aString.ReadFormats( maStrm );
912*b1cdbd2cSJim Jagielski 
913*b1cdbd2cSJim Jagielski         GetXFRangeBuffer().SetXF( aScPos, nXFIdx );
914*b1cdbd2cSJim Jagielski         if( ScBaseCell* pCell = XclImpStringHelper::CreateCell( *this, aString, nXFIdx ) )
915*b1cdbd2cSJim Jagielski             GetDoc().PutCell( aScPos, pCell );
916*b1cdbd2cSJim Jagielski     }
917*b1cdbd2cSJim Jagielski }
918*b1cdbd2cSJim Jagielski 
919*b1cdbd2cSJim Jagielski 
Cellmerging()920*b1cdbd2cSJim Jagielski void ImportExcel::Cellmerging()
921*b1cdbd2cSJim Jagielski {
922*b1cdbd2cSJim Jagielski     XclImpAddressConverter& rAddrConv = GetAddressConverter();
923*b1cdbd2cSJim Jagielski     SCTAB nScTab = GetCurrScTab();
924*b1cdbd2cSJim Jagielski 
925*b1cdbd2cSJim Jagielski     sal_uInt16 nCount;
926*b1cdbd2cSJim Jagielski     maStrm >> nCount;
927*b1cdbd2cSJim Jagielski     for( sal_uInt16 nIdx = 0; (nIdx < nCount) && (maStrm.GetRecLeft() >= 8); ++nIdx )
928*b1cdbd2cSJim Jagielski     {
929*b1cdbd2cSJim Jagielski         XclRange aXclRange;
930*b1cdbd2cSJim Jagielski         maStrm >> aXclRange;    // 16-bit rows and columns
931*b1cdbd2cSJim Jagielski         ScRange aScRange( ScAddress::UNINITIALIZED );
932*b1cdbd2cSJim Jagielski         if( rAddrConv.ConvertRange( aScRange, aXclRange, nScTab, nScTab, true ) )
933*b1cdbd2cSJim Jagielski             GetXFRangeBuffer().SetMerge( aScRange.aStart.Col(), aScRange.aStart.Row(), aScRange.aEnd.Col(), aScRange.aEnd.Row() );
934*b1cdbd2cSJim Jagielski     }
935*b1cdbd2cSJim Jagielski }
936*b1cdbd2cSJim Jagielski 
937*b1cdbd2cSJim Jagielski 
Olesize(void)938*b1cdbd2cSJim Jagielski void ImportExcel::Olesize( void )
939*b1cdbd2cSJim Jagielski {
940*b1cdbd2cSJim Jagielski     XclRange aXclOleSize( ScAddress::UNINITIALIZED );
941*b1cdbd2cSJim Jagielski     maStrm.Ignore( 2 );
942*b1cdbd2cSJim Jagielski     aXclOleSize.Read( maStrm, false );
943*b1cdbd2cSJim Jagielski 
944*b1cdbd2cSJim Jagielski     SCTAB nScTab = GetCurrScTab();
945*b1cdbd2cSJim Jagielski     GetAddressConverter().ConvertRange( maScOleSize, aXclOleSize, nScTab, nScTab, false );
946*b1cdbd2cSJim Jagielski }
947*b1cdbd2cSJim Jagielski 
948*b1cdbd2cSJim Jagielski 
Row34(void)949*b1cdbd2cSJim Jagielski void ImportExcel::Row34( void )
950*b1cdbd2cSJim Jagielski {
951*b1cdbd2cSJim Jagielski 	sal_uInt16	nRow, nRowHeight, nGrbit, nXF;
952*b1cdbd2cSJim Jagielski 
953*b1cdbd2cSJim Jagielski 	aIn >> nRow;
954*b1cdbd2cSJim Jagielski     aIn.Ignore( 4 );   // Mic und Mac ueberspringen
955*b1cdbd2cSJim Jagielski 
956*b1cdbd2cSJim Jagielski     SCROW nScRow = static_cast< SCROW >( nRow );
957*b1cdbd2cSJim Jagielski 
958*b1cdbd2cSJim Jagielski     if( ValidRow( nScRow ) )
959*b1cdbd2cSJim Jagielski 	{
960*b1cdbd2cSJim Jagielski 		aIn >> nRowHeight;	// direkt in Twips angegeben
961*b1cdbd2cSJim Jagielski         aIn.Ignore( 4 );
962*b1cdbd2cSJim Jagielski 
963*b1cdbd2cSJim Jagielski 		aIn >> nGrbit >> nXF;
964*b1cdbd2cSJim Jagielski 
965*b1cdbd2cSJim Jagielski         sal_uInt8 nLevel = ::extract_value< sal_uInt8 >( nGrbit, 0, 3 );
966*b1cdbd2cSJim Jagielski         pRowOutlineBuff->SetLevel( nScRow, nLevel,
967*b1cdbd2cSJim Jagielski             ::get_flag( nGrbit, EXC_ROW_COLLAPSED ), ::get_flag( nGrbit, EXC_ROW_HIDDEN ) );
968*b1cdbd2cSJim Jagielski 
969*b1cdbd2cSJim Jagielski         pColRowBuff->SetRowSettings( nScRow, nRowHeight, nGrbit );
970*b1cdbd2cSJim Jagielski 
971*b1cdbd2cSJim Jagielski         if( nGrbit & EXC_ROW_USEDEFXF )
972*b1cdbd2cSJim Jagielski             GetXFRangeBuffer().SetRowDefXF( nScRow, nXF & EXC_ROW_XFMASK );
973*b1cdbd2cSJim Jagielski 	}
974*b1cdbd2cSJim Jagielski }
975*b1cdbd2cSJim Jagielski 
976*b1cdbd2cSJim Jagielski 
Bof3(void)977*b1cdbd2cSJim Jagielski void ImportExcel::Bof3( void )
978*b1cdbd2cSJim Jagielski {
979*b1cdbd2cSJim Jagielski     sal_uInt16 nSubType;
980*b1cdbd2cSJim Jagielski     maStrm.DisableDecryption();
981*b1cdbd2cSJim Jagielski     maStrm.Ignore( 2 );
982*b1cdbd2cSJim Jagielski     maStrm >> nSubType;
983*b1cdbd2cSJim Jagielski 
984*b1cdbd2cSJim Jagielski     DBG_ASSERT( nSubType != 0x0100, "*ImportExcel::Bof3(): Biff3 als Workbook?!" );
985*b1cdbd2cSJim Jagielski     if( nSubType == 0x0100 )        // Book
986*b1cdbd2cSJim Jagielski 		pExcRoot->eDateiTyp = Biff3W;
987*b1cdbd2cSJim Jagielski     else if( nSubType == 0x0020 )   // Chart
988*b1cdbd2cSJim Jagielski 		pExcRoot->eDateiTyp = Biff3C;
989*b1cdbd2cSJim Jagielski     else if( nSubType == 0x0040 )   // Macro
990*b1cdbd2cSJim Jagielski 		pExcRoot->eDateiTyp = Biff3M;
991*b1cdbd2cSJim Jagielski     else                            // #i51490# Excel interprets invalid indexes as worksheet
992*b1cdbd2cSJim Jagielski         pExcRoot->eDateiTyp = Biff3;
993*b1cdbd2cSJim Jagielski }
994*b1cdbd2cSJim Jagielski 
995*b1cdbd2cSJim Jagielski 
Array34(void)996*b1cdbd2cSJim Jagielski void ImportExcel::Array34( void )
997*b1cdbd2cSJim Jagielski {
998*b1cdbd2cSJim Jagielski 	sal_uInt16					nFirstRow, nLastRow, nFormLen;
999*b1cdbd2cSJim Jagielski 	sal_uInt8					nFirstCol, nLastCol;
1000*b1cdbd2cSJim Jagielski 
1001*b1cdbd2cSJim Jagielski 	aIn >> nFirstRow >> nLastRow >> nFirstCol >> nLastCol;
1002*b1cdbd2cSJim Jagielski     aIn.Ignore( (GetBiff() >= EXC_BIFF5) ? 6 : 2 );
1003*b1cdbd2cSJim Jagielski 	aIn >> nFormLen;
1004*b1cdbd2cSJim Jagielski 
1005*b1cdbd2cSJim Jagielski     if( ValidColRow( nLastCol, nLastRow ) )
1006*b1cdbd2cSJim Jagielski 	{
1007*b1cdbd2cSJim Jagielski 		// jetzt steht Lesemarke auf Formel, Laenge in nFormLen
1008*b1cdbd2cSJim Jagielski 		const ScTokenArray*	pErgebnis;
1009*b1cdbd2cSJim Jagielski 
1010*b1cdbd2cSJim Jagielski         pFormConv->Reset( ScAddress( static_cast<SCCOL>(nFirstCol),
1011*b1cdbd2cSJim Jagielski                     static_cast<SCROW>(nFirstRow), GetCurrScTab() ) );
1012*b1cdbd2cSJim Jagielski         pFormConv->Convert( pErgebnis, maStrm, nFormLen, true, FT_CellFormula);
1013*b1cdbd2cSJim Jagielski 
1014*b1cdbd2cSJim Jagielski 		DBG_ASSERT( pErgebnis, "+ImportExcel::Array34(): ScTokenArray ist NULL!" );
1015*b1cdbd2cSJim Jagielski 
1016*b1cdbd2cSJim Jagielski 		ScMarkData			aMarkData;
1017*b1cdbd2cSJim Jagielski         aMarkData.SelectOneTable( GetCurrScTab() );
1018*b1cdbd2cSJim Jagielski         pD->InsertMatrixFormula( static_cast<SCCOL>(nFirstCol),
1019*b1cdbd2cSJim Jagielski                 static_cast<SCROW>(nFirstRow), static_cast<SCCOL>(nLastCol),
1020*b1cdbd2cSJim Jagielski                 static_cast<SCROW>(nLastRow), aMarkData, EMPTY_STRING,
1021*b1cdbd2cSJim Jagielski                 pErgebnis);
1022*b1cdbd2cSJim Jagielski 	}
1023*b1cdbd2cSJim Jagielski }
1024*b1cdbd2cSJim Jagielski 
1025*b1cdbd2cSJim Jagielski 
Externname34(void)1026*b1cdbd2cSJim Jagielski void ImportExcel::Externname34( void )
1027*b1cdbd2cSJim Jagielski {
1028*b1cdbd2cSJim Jagielski }
1029*b1cdbd2cSJim Jagielski 
1030*b1cdbd2cSJim Jagielski 
Defrowheight345(void)1031*b1cdbd2cSJim Jagielski void ImportExcel::Defrowheight345( void )
1032*b1cdbd2cSJim Jagielski {
1033*b1cdbd2cSJim Jagielski     sal_uInt16 nFlags, nDefHeight;
1034*b1cdbd2cSJim Jagielski     maStrm >> nFlags >> nDefHeight;
1035*b1cdbd2cSJim Jagielski     pColRowBuff->SetDefHeight( nDefHeight, nFlags );
1036*b1cdbd2cSJim Jagielski }
1037*b1cdbd2cSJim Jagielski 
1038*b1cdbd2cSJim Jagielski 
TableOp(void)1039*b1cdbd2cSJim Jagielski void ImportExcel::TableOp( void )
1040*b1cdbd2cSJim Jagielski {
1041*b1cdbd2cSJim Jagielski 	sal_uInt16 nFirstRow, nLastRow;
1042*b1cdbd2cSJim Jagielski 	sal_uInt8 nFirstCol, nLastCol;
1043*b1cdbd2cSJim Jagielski 	sal_uInt16 nGrbit;
1044*b1cdbd2cSJim Jagielski 	sal_uInt16 nInpRow, nInpCol, nInpRow2, nInpCol2;
1045*b1cdbd2cSJim Jagielski 
1046*b1cdbd2cSJim Jagielski 	aIn >> nFirstRow >> nLastRow >> nFirstCol >> nLastCol >> nGrbit
1047*b1cdbd2cSJim Jagielski 		>> nInpRow >> nInpCol >> nInpRow2 >> nInpCol2;
1048*b1cdbd2cSJim Jagielski 
1049*b1cdbd2cSJim Jagielski     if( ValidColRow( nLastCol, nLastRow ) )
1050*b1cdbd2cSJim Jagielski 	{
1051*b1cdbd2cSJim Jagielski 		if( nFirstCol && nFirstRow )
1052*b1cdbd2cSJim Jagielski 		{
1053*b1cdbd2cSJim Jagielski 			ScTabOpParam aTabOpParam;
1054*b1cdbd2cSJim Jagielski             aTabOpParam.nMode = (nGrbit & EXC_TABLEOP_BOTH) ? 2 : ((nGrbit & EXC_TABLEOP_ROW) ? 1 : 0 );
1055*b1cdbd2cSJim Jagielski 			sal_uInt16 nCol = nFirstCol - 1;
1056*b1cdbd2cSJim Jagielski 			sal_uInt16 nRow = nFirstRow - 1;
1057*b1cdbd2cSJim Jagielski             SCTAB nTab = GetCurrScTab();
1058*b1cdbd2cSJim Jagielski 			switch( aTabOpParam.nMode )
1059*b1cdbd2cSJim Jagielski 			{
1060*b1cdbd2cSJim Jagielski 				case 0:		// COL
1061*b1cdbd2cSJim Jagielski                     aTabOpParam.aRefFormulaCell.Set(
1062*b1cdbd2cSJim Jagielski                             static_cast<SCCOL>(nFirstCol),
1063*b1cdbd2cSJim Jagielski                             static_cast<SCROW>(nFirstRow - 1), nTab, sal_False,
1064*b1cdbd2cSJim Jagielski                             sal_False, sal_False );
1065*b1cdbd2cSJim Jagielski                     aTabOpParam.aRefFormulaEnd.Set(
1066*b1cdbd2cSJim Jagielski                             static_cast<SCCOL>(nLastCol),
1067*b1cdbd2cSJim Jagielski                             static_cast<SCROW>(nFirstRow - 1), nTab, sal_False,
1068*b1cdbd2cSJim Jagielski                             sal_False, sal_False );
1069*b1cdbd2cSJim Jagielski                     aTabOpParam.aRefColCell.Set( static_cast<SCCOL>(nInpCol),
1070*b1cdbd2cSJim Jagielski                             static_cast<SCROW>(nInpRow), nTab, sal_False, sal_False,
1071*b1cdbd2cSJim Jagielski                             sal_False );
1072*b1cdbd2cSJim Jagielski 					nRow++;
1073*b1cdbd2cSJim Jagielski 				break;
1074*b1cdbd2cSJim Jagielski 				case 1:		// ROW
1075*b1cdbd2cSJim Jagielski                     aTabOpParam.aRefFormulaCell.Set(
1076*b1cdbd2cSJim Jagielski                             static_cast<SCCOL>(nFirstCol - 1),
1077*b1cdbd2cSJim Jagielski                             static_cast<SCROW>(nFirstRow), nTab, sal_False, sal_False,
1078*b1cdbd2cSJim Jagielski                             sal_False );
1079*b1cdbd2cSJim Jagielski                     aTabOpParam.aRefFormulaEnd.Set(
1080*b1cdbd2cSJim Jagielski                             static_cast<SCCOL>(nFirstCol - 1),
1081*b1cdbd2cSJim Jagielski                             static_cast<SCROW>(nLastRow), nTab, sal_False, sal_False,
1082*b1cdbd2cSJim Jagielski                             sal_False );
1083*b1cdbd2cSJim Jagielski                     aTabOpParam.aRefRowCell.Set( static_cast<SCCOL>(nInpCol),
1084*b1cdbd2cSJim Jagielski                             static_cast<SCROW>(nInpRow), nTab, sal_False, sal_False,
1085*b1cdbd2cSJim Jagielski                             sal_False );
1086*b1cdbd2cSJim Jagielski 					nCol++;
1087*b1cdbd2cSJim Jagielski 				break;
1088*b1cdbd2cSJim Jagielski 				case 2:		// TWO-INPUT
1089*b1cdbd2cSJim Jagielski                     aTabOpParam.aRefFormulaCell.Set(
1090*b1cdbd2cSJim Jagielski                             static_cast<SCCOL>(nFirstCol - 1),
1091*b1cdbd2cSJim Jagielski                             static_cast<SCROW>(nFirstRow - 1), nTab, sal_False,
1092*b1cdbd2cSJim Jagielski                             sal_False, sal_False );
1093*b1cdbd2cSJim Jagielski                     aTabOpParam.aRefRowCell.Set( static_cast<SCCOL>(nInpCol),
1094*b1cdbd2cSJim Jagielski                             static_cast<SCROW>(nInpRow), nTab, sal_False, sal_False,
1095*b1cdbd2cSJim Jagielski                             sal_False );
1096*b1cdbd2cSJim Jagielski                     aTabOpParam.aRefColCell.Set( static_cast<SCCOL>(nInpCol2),
1097*b1cdbd2cSJim Jagielski                             static_cast<SCROW>(nInpRow2), nTab, sal_False, sal_False,
1098*b1cdbd2cSJim Jagielski                             sal_False );
1099*b1cdbd2cSJim Jagielski 				break;
1100*b1cdbd2cSJim Jagielski 			}
1101*b1cdbd2cSJim Jagielski 
1102*b1cdbd2cSJim Jagielski 			ScMarkData aMarkData;
1103*b1cdbd2cSJim Jagielski             aMarkData.SelectOneTable( nTab );
1104*b1cdbd2cSJim Jagielski             pD->InsertTableOp( aTabOpParam, static_cast<SCCOL>(nCol),
1105*b1cdbd2cSJim Jagielski                     static_cast<SCROW>(nRow), static_cast<SCCOL>(nLastCol),
1106*b1cdbd2cSJim Jagielski                     static_cast<SCROW>(nLastRow), aMarkData );
1107*b1cdbd2cSJim Jagielski 		}
1108*b1cdbd2cSJim Jagielski 	}
1109*b1cdbd2cSJim Jagielski 	else
1110*b1cdbd2cSJim Jagielski     {
1111*b1cdbd2cSJim Jagielski 		bTabTruncated = sal_True;
1112*b1cdbd2cSJim Jagielski         GetTracer().TraceInvalidRow(GetCurrScTab(), nLastRow, MAXROW);
1113*b1cdbd2cSJim Jagielski     }
1114*b1cdbd2cSJim Jagielski }
1115*b1cdbd2cSJim Jagielski 
1116*b1cdbd2cSJim Jagielski 
Bof4(void)1117*b1cdbd2cSJim Jagielski void ImportExcel::Bof4( void )
1118*b1cdbd2cSJim Jagielski {
1119*b1cdbd2cSJim Jagielski     sal_uInt16 nSubType;
1120*b1cdbd2cSJim Jagielski     maStrm.DisableDecryption();
1121*b1cdbd2cSJim Jagielski     maStrm.Ignore( 2 );
1122*b1cdbd2cSJim Jagielski     maStrm >> nSubType;
1123*b1cdbd2cSJim Jagielski 
1124*b1cdbd2cSJim Jagielski     if( nSubType == 0x0100 )        // Book
1125*b1cdbd2cSJim Jagielski 		pExcRoot->eDateiTyp = Biff4W;
1126*b1cdbd2cSJim Jagielski     else if( nSubType == 0x0020 )   // Chart
1127*b1cdbd2cSJim Jagielski 		pExcRoot->eDateiTyp = Biff4C;
1128*b1cdbd2cSJim Jagielski     else if( nSubType == 0x0040 )   // Macro
1129*b1cdbd2cSJim Jagielski 		pExcRoot->eDateiTyp = Biff4M;
1130*b1cdbd2cSJim Jagielski     else                            // #i51490# Excel interprets invalid indexes as worksheet
1131*b1cdbd2cSJim Jagielski         pExcRoot->eDateiTyp = Biff4;
1132*b1cdbd2cSJim Jagielski }
1133*b1cdbd2cSJim Jagielski 
1134*b1cdbd2cSJim Jagielski 
Bof5(void)1135*b1cdbd2cSJim Jagielski void ImportExcel::Bof5( void )
1136*b1cdbd2cSJim Jagielski {
1137*b1cdbd2cSJim Jagielski 	//POST:	eDateiTyp = Typ der zu lesenden Datei
1138*b1cdbd2cSJim Jagielski 	sal_uInt16		nSubType, nVers;
1139*b1cdbd2cSJim Jagielski 	BiffTyp		eDatei;
1140*b1cdbd2cSJim Jagielski 
1141*b1cdbd2cSJim Jagielski     maStrm.DisableDecryption();
1142*b1cdbd2cSJim Jagielski     maStrm >> nVers >> nSubType;
1143*b1cdbd2cSJim Jagielski 
1144*b1cdbd2cSJim Jagielski 	switch( nSubType )
1145*b1cdbd2cSJim Jagielski 	{
1146*b1cdbd2cSJim Jagielski         case 0x0005:    eDatei = Biff5W;    break;  // workbook globals
1147*b1cdbd2cSJim Jagielski         case 0x0006:    eDatei = Biff5V;    break;  // VB module
1148*b1cdbd2cSJim Jagielski         case 0x0010:    eDatei = Biff5;     break;  // worksheet
1149*b1cdbd2cSJim Jagielski         case 0x0020:    eDatei = Biff5C;    break;  // chart
1150*b1cdbd2cSJim Jagielski         case 0x0040:    eDatei = Biff5M4;   break;  // macro sheet
1151*b1cdbd2cSJim Jagielski 		default:
1152*b1cdbd2cSJim Jagielski 			pExcRoot->eDateiTyp = BiffX;
1153*b1cdbd2cSJim Jagielski 			return;
1154*b1cdbd2cSJim Jagielski 	}
1155*b1cdbd2cSJim Jagielski 
1156*b1cdbd2cSJim Jagielski     if( nVers == 0x0600 && (GetBiff() == EXC_BIFF8) )
1157*b1cdbd2cSJim Jagielski 		eDatei = ( BiffTyp ) ( eDatei - Biff5 + Biff8 );
1158*b1cdbd2cSJim Jagielski 
1159*b1cdbd2cSJim Jagielski 	pExcRoot->eDateiTyp = eDatei;
1160*b1cdbd2cSJim Jagielski }
1161*b1cdbd2cSJim Jagielski 
EndSheet(void)1162*b1cdbd2cSJim Jagielski void ImportExcel::EndSheet( void )
1163*b1cdbd2cSJim Jagielski {
1164*b1cdbd2cSJim Jagielski 	pExcRoot->pExtSheetBuff->Reset();
1165*b1cdbd2cSJim Jagielski 
1166*b1cdbd2cSJim Jagielski     if( GetBiff() <= EXC_BIFF5 )
1167*b1cdbd2cSJim Jagielski     {
1168*b1cdbd2cSJim Jagielski 		pExcRoot->pExtNameBuff->Reset();
1169*b1cdbd2cSJim Jagielski         mnLastRefIdx = 0;
1170*b1cdbd2cSJim Jagielski     }
1171*b1cdbd2cSJim Jagielski 
1172*b1cdbd2cSJim Jagielski     FinalizeTable();
1173*b1cdbd2cSJim Jagielski }
1174*b1cdbd2cSJim Jagielski 
1175*b1cdbd2cSJim Jagielski 
NeueTabelle(void)1176*b1cdbd2cSJim Jagielski void ImportExcel::NeueTabelle( void )
1177*b1cdbd2cSJim Jagielski {
1178*b1cdbd2cSJim Jagielski     SCTAB nTab = GetCurrScTab();
1179*b1cdbd2cSJim Jagielski 	if( nTab > 0 && !pD->HasTable( nTab ) )
1180*b1cdbd2cSJim Jagielski 		pD->MakeTable( nTab );
1181*b1cdbd2cSJim Jagielski 
1182*b1cdbd2cSJim Jagielski     pExcRoot->pShrfmlaBuff->Clear();
1183*b1cdbd2cSJim Jagielski 
1184*b1cdbd2cSJim Jagielski     InitializeTable( nTab );
1185*b1cdbd2cSJim Jagielski 
1186*b1cdbd2cSJim Jagielski     pOutlineListBuffer->Append( new XclImpOutlineDataBuffer( GetRoot(), nTab ) );
1187*b1cdbd2cSJim Jagielski 
1188*b1cdbd2cSJim Jagielski     pExcRoot->pColRowBuff = pColRowBuff = pOutlineListBuffer->Last()->GetColRowBuff();
1189*b1cdbd2cSJim Jagielski     pColOutlineBuff = pOutlineListBuffer->Last()->GetColOutline();
1190*b1cdbd2cSJim Jagielski     pRowOutlineBuff = pOutlineListBuffer->Last()->GetRowOutline();
1191*b1cdbd2cSJim Jagielski }
1192*b1cdbd2cSJim Jagielski 
1193*b1cdbd2cSJim Jagielski 
ErrorToFormula(sal_uInt8 bErrOrVal,sal_uInt8 nError,double & rVal)1194*b1cdbd2cSJim Jagielski const ScTokenArray* ImportExcel::ErrorToFormula( sal_uInt8 bErrOrVal, sal_uInt8 nError, double& rVal )
1195*b1cdbd2cSJim Jagielski {
1196*b1cdbd2cSJim Jagielski     return pFormConv->GetBoolErr( XclTools::ErrorToEnum( rVal, bErrOrVal, nError ) );
1197*b1cdbd2cSJim Jagielski }
1198*b1cdbd2cSJim Jagielski 
1199*b1cdbd2cSJim Jagielski 
AdjustRowHeight()1200*b1cdbd2cSJim Jagielski void ImportExcel::AdjustRowHeight()
1201*b1cdbd2cSJim Jagielski {
1202*b1cdbd2cSJim Jagielski     /*  #93255# Speed up chart import: import all sheets without charts, then
1203*b1cdbd2cSJim Jagielski         update row heights (here), last load all charts -> do not any longer
1204*b1cdbd2cSJim Jagielski         update inside of ScDocShell::ConvertFrom() (causes update of existing
1205*b1cdbd2cSJim Jagielski         charts during each and every change of row height). */
1206*b1cdbd2cSJim Jagielski     	/*if( ScModelObj* pDocObj = GetDocModelObj() )
1207*b1cdbd2cSJim Jagielski          pDocObj->UpdateAllRowHeights();*/
1208*b1cdbd2cSJim Jagielski 
1209*b1cdbd2cSJim Jagielski        //just update row heights for : 1. visible sheet, 2. sheet containing sdrobject. i120586
1210*b1cdbd2cSJim Jagielski 	SCTAB nCount = GetDoc().GetTableCount();
1211*b1cdbd2cSJim Jagielski 	SCTAB nVisible = GetDocViewSettings().GetDisplScTab();
1212*b1cdbd2cSJim Jagielski 
1213*b1cdbd2cSJim Jagielski 	GetDoc().SetPendingRowHeights(nVisible, false);
1214*b1cdbd2cSJim Jagielski 
1215*b1cdbd2cSJim Jagielski 	ScMarkData aUpdateSheets;
1216*b1cdbd2cSJim Jagielski 	for (SCTAB nTab=0; nTab<nCount; ++nTab)
1217*b1cdbd2cSJim Jagielski 	{
1218*b1cdbd2cSJim Jagielski 		if ( false == GetDoc().IsPendingRowHeights(nTab))
1219*b1cdbd2cSJim Jagielski 			aUpdateSheets.SelectTable( nTab, true );
1220*b1cdbd2cSJim Jagielski 	}
1221*b1cdbd2cSJim Jagielski 
1222*b1cdbd2cSJim Jagielski 	ScModelObj* pDocObj = GetDocModelObj();
1223*b1cdbd2cSJim Jagielski 	if (pDocObj && (aUpdateSheets.GetSelectCount()))
1224*b1cdbd2cSJim Jagielski 		pDocObj->UpdateAllRowHeights(&aUpdateSheets);
1225*b1cdbd2cSJim Jagielski      //end i120586
1226*b1cdbd2cSJim Jagielski }
1227*b1cdbd2cSJim Jagielski 
1228*b1cdbd2cSJim Jagielski 
PostDocLoad(void)1229*b1cdbd2cSJim Jagielski void ImportExcel::PostDocLoad( void )
1230*b1cdbd2cSJim Jagielski {
1231*b1cdbd2cSJim Jagielski     /*  Set automatic page numbering in Default page style (default is "page number = 1").
1232*b1cdbd2cSJim Jagielski         Otherwise hidden tables (i.e. for scenarios) which have Default page style will
1233*b1cdbd2cSJim Jagielski         break automatic page numbering. */
1234*b1cdbd2cSJim Jagielski     if( SfxStyleSheetBase* pStyleSheet = GetStyleSheetPool().Find( ScGlobal::GetRscString( STR_STYLENAME_STANDARD ), SFX_STYLE_FAMILY_PAGE ) )
1235*b1cdbd2cSJim Jagielski         pStyleSheet->GetItemSet().Put( SfxUInt16Item( ATTR_PAGE_FIRSTPAGENO, 0 ) );
1236*b1cdbd2cSJim Jagielski 
1237*b1cdbd2cSJim Jagielski     // outlines for all sheets, sets hidden rows and columns (#i11776# after filtered ranges)
1238*b1cdbd2cSJim Jagielski     for( XclImpOutlineDataBuffer* pBuffer = pOutlineListBuffer->First(); pBuffer; pBuffer = pOutlineListBuffer->Next() )
1239*b1cdbd2cSJim Jagielski         pBuffer->Convert();
1240*b1cdbd2cSJim Jagielski 
1241*b1cdbd2cSJim Jagielski     // document view settings (before visible OLE area)
1242*b1cdbd2cSJim Jagielski     GetDocViewSettings().Finalize();
1243*b1cdbd2cSJim Jagielski 
1244*b1cdbd2cSJim Jagielski     // process all drawing objects (including OLE, charts, controls; after hiding rows/columns; before visible OLE area)
1245*b1cdbd2cSJim Jagielski     GetObjectManager().ConvertObjects();
1246*b1cdbd2cSJim Jagielski 
1247*b1cdbd2cSJim Jagielski     // visible area (used if this document is an embedded OLE object)
1248*b1cdbd2cSJim Jagielski     if( SfxObjectShell* pDocShell = GetDocShell() )
1249*b1cdbd2cSJim Jagielski     {
1250*b1cdbd2cSJim Jagielski         // visible area if embedded
1251*b1cdbd2cSJim Jagielski         const ScExtDocSettings& rDocSett = GetExtDocOptions().GetDocSettings();
1252*b1cdbd2cSJim Jagielski         SCTAB nDisplScTab = rDocSett.mnDisplTab;
1253*b1cdbd2cSJim Jagielski 
1254*b1cdbd2cSJim Jagielski         /*  #i44077# If a new OLE object is inserted from file, there is no
1255*b1cdbd2cSJim Jagielski             OLESIZE record in the Excel file. Calculate used area from file
1256*b1cdbd2cSJim Jagielski             contents (used cells and drawing objects). */
1257*b1cdbd2cSJim Jagielski         if( !maScOleSize.IsValid() )
1258*b1cdbd2cSJim Jagielski         {
1259*b1cdbd2cSJim Jagielski             // used area of displayed sheet (cell contents)
1260*b1cdbd2cSJim Jagielski             if( const ScExtTabSettings* pTabSett = GetExtDocOptions().GetTabSettings( nDisplScTab ) )
1261*b1cdbd2cSJim Jagielski                 maScOleSize = pTabSett->maUsedArea;
1262*b1cdbd2cSJim Jagielski             // add all valid drawing objects
1263*b1cdbd2cSJim Jagielski             ScRange aScObjArea = GetObjectManager().GetUsedArea( nDisplScTab );
1264*b1cdbd2cSJim Jagielski             if( aScObjArea.IsValid() )
1265*b1cdbd2cSJim Jagielski                 maScOleSize.ExtendTo( aScObjArea );
1266*b1cdbd2cSJim Jagielski         }
1267*b1cdbd2cSJim Jagielski 
1268*b1cdbd2cSJim Jagielski         // valid size found - set it at the document
1269*b1cdbd2cSJim Jagielski         if( maScOleSize.IsValid() )
1270*b1cdbd2cSJim Jagielski         {
1271*b1cdbd2cSJim Jagielski             pDocShell->SetVisArea( GetDoc().GetMMRect(
1272*b1cdbd2cSJim Jagielski                 maScOleSize.aStart.Col(), maScOleSize.aStart.Row(),
1273*b1cdbd2cSJim Jagielski                 maScOleSize.aEnd.Col(), maScOleSize.aEnd.Row(), nDisplScTab ) );
1274*b1cdbd2cSJim Jagielski             GetDoc().SetVisibleTab( nDisplScTab );
1275*b1cdbd2cSJim Jagielski         }
1276*b1cdbd2cSJim Jagielski     }
1277*b1cdbd2cSJim Jagielski 
1278*b1cdbd2cSJim Jagielski     // #111099# open forms in alive mode (has no effect, if no controls in document)
1279*b1cdbd2cSJim Jagielski     if( ScModelObj* pDocObj = GetDocModelObj() )
1280*b1cdbd2cSJim Jagielski         pDocObj->setPropertyValue( CREATE_OUSTRING( SC_UNO_APPLYFMDES ), uno::Any( false ) );
1281*b1cdbd2cSJim Jagielski 
1282*b1cdbd2cSJim Jagielski     // enables extended options to be set to the view after import
1283*b1cdbd2cSJim Jagielski     GetExtDocOptions().SetChanged( true );
1284*b1cdbd2cSJim Jagielski 
1285*b1cdbd2cSJim Jagielski     // root data owns the extended document options -> create a new object
1286*b1cdbd2cSJim Jagielski     GetDoc().SetExtDocOptions( new ScExtDocOptions( GetExtDocOptions() ) );
1287*b1cdbd2cSJim Jagielski 
1288*b1cdbd2cSJim Jagielski 	const SCTAB		nLast = pD->GetTableCount();
1289*b1cdbd2cSJim Jagielski 	const ScRange*		p;
1290*b1cdbd2cSJim Jagielski 
1291*b1cdbd2cSJim Jagielski     if( pExcRoot->pPrintRanges->HasRanges() )
1292*b1cdbd2cSJim Jagielski 	{
1293*b1cdbd2cSJim Jagielski 		for( SCTAB n = 0 ; n < nLast ; n++ )
1294*b1cdbd2cSJim Jagielski 		{
1295*b1cdbd2cSJim Jagielski             p = pExcRoot->pPrintRanges->First( static_cast<sal_uInt16>(n) );
1296*b1cdbd2cSJim Jagielski 			if( p )
1297*b1cdbd2cSJim Jagielski 			{
1298*b1cdbd2cSJim Jagielski                 DBG_ASSERT( pExcRoot->pPrintRanges->GetActList(),
1299*b1cdbd2cSJim Jagielski 							"-ImportExcel::PostDocLoad(): Imaginaere Tabelle gefunden!" );
1300*b1cdbd2cSJim Jagielski 
1301*b1cdbd2cSJim Jagielski                 pD->ClearPrintRanges( n );
1302*b1cdbd2cSJim Jagielski 				while( p )
1303*b1cdbd2cSJim Jagielski 				{
1304*b1cdbd2cSJim Jagielski                     pD->AddPrintRange( n, *p );
1305*b1cdbd2cSJim Jagielski                     p = pExcRoot->pPrintRanges->Next();
1306*b1cdbd2cSJim Jagielski 				}
1307*b1cdbd2cSJim Jagielski 			}
1308*b1cdbd2cSJim Jagielski             else
1309*b1cdbd2cSJim Jagielski             {
1310*b1cdbd2cSJim Jagielski                 // #i4063# no print ranges -> print entire sheet
1311*b1cdbd2cSJim Jagielski                 pD->SetPrintEntireSheet( n );
1312*b1cdbd2cSJim Jagielski             }
1313*b1cdbd2cSJim Jagielski 		}
1314*b1cdbd2cSJim Jagielski         GetTracer().TracePrintRange();
1315*b1cdbd2cSJim Jagielski 	}
1316*b1cdbd2cSJim Jagielski 
1317*b1cdbd2cSJim Jagielski     if( pExcRoot->pPrintTitles->HasRanges() )
1318*b1cdbd2cSJim Jagielski 	{
1319*b1cdbd2cSJim Jagielski 		for( SCTAB n = 0 ; n < nLast ; n++ )
1320*b1cdbd2cSJim Jagielski 		{
1321*b1cdbd2cSJim Jagielski             p = pExcRoot->pPrintTitles->First( static_cast<sal_uInt16>(n) );
1322*b1cdbd2cSJim Jagielski 			if( p )
1323*b1cdbd2cSJim Jagielski 			{
1324*b1cdbd2cSJim Jagielski                 DBG_ASSERT( pExcRoot->pPrintTitles->GetActList(),
1325*b1cdbd2cSJim Jagielski 					"-ImportExcel::PostDocLoad(): Imaginaere Tabelle gefunden!" );
1326*b1cdbd2cSJim Jagielski 
1327*b1cdbd2cSJim Jagielski 				sal_Bool	bRowVirgin = sal_True;
1328*b1cdbd2cSJim Jagielski 				sal_Bool	bColVirgin = sal_True;
1329*b1cdbd2cSJim Jagielski 
1330*b1cdbd2cSJim Jagielski 				while( p )
1331*b1cdbd2cSJim Jagielski 				{
1332*b1cdbd2cSJim Jagielski 					if( p->aStart.Col() == 0 && p->aEnd.Col() == MAXCOL && bRowVirgin )
1333*b1cdbd2cSJim Jagielski 					{
1334*b1cdbd2cSJim Jagielski 						pD->SetRepeatRowRange( n, p );
1335*b1cdbd2cSJim Jagielski 						bRowVirgin = sal_False;
1336*b1cdbd2cSJim Jagielski 					}
1337*b1cdbd2cSJim Jagielski 
1338*b1cdbd2cSJim Jagielski 					if( p->aStart.Row() == 0 && p->aEnd.Row() == MAXROW && bColVirgin )
1339*b1cdbd2cSJim Jagielski 					{
1340*b1cdbd2cSJim Jagielski 						pD->SetRepeatColRange( n, p );
1341*b1cdbd2cSJim Jagielski 						bColVirgin = sal_False;
1342*b1cdbd2cSJim Jagielski 					}
1343*b1cdbd2cSJim Jagielski 
1344*b1cdbd2cSJim Jagielski                     p = pExcRoot->pPrintTitles->Next();
1345*b1cdbd2cSJim Jagielski 				}
1346*b1cdbd2cSJim Jagielski 			}
1347*b1cdbd2cSJim Jagielski 		}
1348*b1cdbd2cSJim Jagielski 	}
1349*b1cdbd2cSJim Jagielski }
1350*b1cdbd2cSJim Jagielski 
XclImpOutlineDataBuffer(const XclImpRoot & rRoot,SCTAB nScTab)1351*b1cdbd2cSJim Jagielski XclImpOutlineDataBuffer::XclImpOutlineDataBuffer( const XclImpRoot& rRoot, SCTAB nScTab ) :
1352*b1cdbd2cSJim Jagielski     XclImpRoot( rRoot ),
1353*b1cdbd2cSJim Jagielski     mxColOutlineBuff( new XclImpOutlineBuffer( rRoot.GetXclMaxPos().Col() + 1 ) ),
1354*b1cdbd2cSJim Jagielski     mxRowOutlineBuff( new XclImpOutlineBuffer( rRoot.GetXclMaxPos().Row() + 1 ) ),
1355*b1cdbd2cSJim Jagielski     mxColRowBuff( new XclImpColRowSettings( rRoot ) ),
1356*b1cdbd2cSJim Jagielski     mnScTab( nScTab )
1357*b1cdbd2cSJim Jagielski {
1358*b1cdbd2cSJim Jagielski }
1359*b1cdbd2cSJim Jagielski 
~XclImpOutlineDataBuffer()1360*b1cdbd2cSJim Jagielski XclImpOutlineDataBuffer::~XclImpOutlineDataBuffer()
1361*b1cdbd2cSJim Jagielski {
1362*b1cdbd2cSJim Jagielski }
1363*b1cdbd2cSJim Jagielski 
Convert()1364*b1cdbd2cSJim Jagielski void XclImpOutlineDataBuffer::Convert()
1365*b1cdbd2cSJim Jagielski {
1366*b1cdbd2cSJim Jagielski     mxColOutlineBuff->SetOutlineArray( GetDoc().GetOutlineTable( mnScTab, sal_True )->GetColArray() );
1367*b1cdbd2cSJim Jagielski     mxColOutlineBuff->MakeScOutline();
1368*b1cdbd2cSJim Jagielski 
1369*b1cdbd2cSJim Jagielski     mxRowOutlineBuff->SetOutlineArray( GetDoc().GetOutlineTable( mnScTab, sal_True )->GetRowArray() );
1370*b1cdbd2cSJim Jagielski     mxRowOutlineBuff->MakeScOutline();
1371*b1cdbd2cSJim Jagielski 
1372*b1cdbd2cSJim Jagielski     mxColRowBuff->ConvertHiddenFlags( mnScTab );
1373*b1cdbd2cSJim Jagielski }
1374