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