Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <stdlib.h>
21 : #include <stdio.h>
22 :
23 : #include "document.hxx"
24 : #include "scerrors.hxx"
25 : #include "fprogressbar.hxx"
26 : #include "xltracer.hxx"
27 : #include "xltable.hxx"
28 : #include "xihelper.hxx"
29 : #include "xipage.hxx"
30 : #include "xiview.hxx"
31 : #include "xilink.hxx"
32 : #include "xiname.hxx"
33 : #include "xicontent.hxx"
34 : #include "xiescher.hxx"
35 : #include "xipivot.hxx"
36 : #include "XclImpChangeTrack.hxx"
37 : #include "documentimport.hxx"
38 :
39 : #include "root.hxx"
40 : #include "imp_op.hxx"
41 : #include "excimp8.hxx"
42 :
43 : #include <boost/scoped_ptr.hpp>
44 :
45 0 : FltError ImportExcel::Read( void )
46 : {
47 0 : XclImpPageSettings& rPageSett = GetPageSettings();
48 0 : XclImpTabViewSettings& rTabViewSett = GetTabViewSettings();
49 0 : XclImpPalette& rPal = GetPalette();
50 0 : XclImpFontBuffer& rFontBfr = GetFontBuffer();
51 0 : XclImpNumFmtBuffer& rNumFmtBfr = GetNumFmtBuffer();
52 0 : XclImpXFBuffer& rXFBfr = GetXFBuffer();
53 0 : XclImpNameManager& rNameMgr = GetNameManager();
54 0 : XclImpObjectManager& rObjMgr = GetObjectManager();
55 : (void)rObjMgr;
56 : // call to GetCurrSheetDrawing() cannot be cached (changes in new sheets)
57 :
58 : enum Zustand {
59 : Z_BiffNull, // Nicht in gueltigem Biff-Format
60 : Z_Biff2, // Biff2: nur eine Tabelle
61 :
62 : Z_Biff3, // Biff3: nur eine Tabelle
63 :
64 : Z_Biff4, // Biff4: nur eine Tabelle
65 : Z_Biff4W, // Biff4 Workbook: Globals
66 : Z_Biff4T, // Biff4 Workbook: eine Tabelle selbst
67 : Z_Biff4E, // Biff4 Workbook: zwischen den Tabellen
68 :
69 : Z_Biff5WPre,// Biff5: Prefetch Workbook
70 : Z_Biff5W, // Biff5: Globals
71 : Z_Biff5TPre,// Biff5: Prefetch fuer Shrfmla/Array Formula
72 : Z_Biff5T, // Biff5: eine Tabelle selbst
73 : Z_Biff5E, // Biff5: zwischen den Tabellen
74 : Z_Biffn0, // Alle Biffs: Tabelle bis naechstesss EOF ueberlesen
75 : Z_Ende };
76 :
77 0 : Zustand eAkt = Z_BiffNull, ePrev = Z_BiffNull;
78 :
79 0 : FltError eLastErr = eERR_OK;
80 : sal_uInt16 nOpcode;
81 0 : sal_uInt16 nBofLevel = 0;
82 :
83 : OSL_ENSURE( &aIn != NULL, "-ImportExcel::Read(): No Stream - what happened?!" );
84 :
85 : boost::scoped_ptr< ScfSimpleProgressBar > pProgress( new ScfSimpleProgressBar(
86 0 : aIn.GetSvStreamSize(), GetDocShell(), STR_LOAD_DOC ) );
87 :
88 : /* #i104057# Need to track a base position for progress bar calculation,
89 : because sheet substreams may not be in order of sheets. */
90 0 : sal_Size nProgressBasePos = 0;
91 0 : sal_Size nProgressBaseSize = 0;
92 :
93 0 : while( eAkt != Z_Ende )
94 : {
95 0 : if( eAkt == Z_Biff5E )
96 : {
97 0 : sal_uInt16 nScTab = GetCurrScTab();
98 0 : if( nScTab < maSheetOffsets.size() )
99 : {
100 0 : nProgressBaseSize += (aIn.GetSvStreamPos() - nProgressBasePos);
101 0 : nProgressBasePos = maSheetOffsets[ nScTab ];
102 0 : aIn.StartNextRecord( nProgressBasePos );
103 : }
104 : else
105 0 : eAkt = Z_Ende;
106 : }
107 : else
108 0 : aIn.StartNextRecord();
109 :
110 0 : nOpcode = aIn.GetRecId();
111 :
112 0 : if( !aIn.IsValid() )
113 : {
114 : // finalize table if EOF is missing
115 0 : switch( eAkt )
116 : {
117 : case Z_Biff2:
118 : case Z_Biff3:
119 : case Z_Biff4:
120 : case Z_Biff4T:
121 : case Z_Biff5TPre:
122 : case Z_Biff5T:
123 0 : rNumFmtBfr.CreateScFormats();
124 0 : Eof();
125 0 : break;
126 : default:;
127 : };
128 0 : eAkt = Z_Ende;
129 0 : break;
130 : }
131 :
132 0 : if( eAkt == Z_Ende )
133 0 : break;
134 :
135 0 : if( eAkt != Z_Biff5TPre && eAkt != Z_Biff5WPre )
136 0 : pProgress->ProgressAbs( nProgressBaseSize + aIn.GetSvStreamPos() - nProgressBasePos );
137 :
138 0 : switch( eAkt )
139 : {
140 :
141 : case Z_BiffNull: // ------------------------------- Z_BiffNull -
142 : {
143 0 : switch( nOpcode )
144 : {
145 : case EXC_ID2_BOF:
146 : case EXC_ID3_BOF:
147 : case EXC_ID4_BOF:
148 : case EXC_ID5_BOF:
149 : {
150 : // #i23425# don't rely on the record ID, but on the detected BIFF version
151 0 : switch( GetBiff() )
152 : {
153 : case EXC_BIFF2:
154 0 : Bof2();
155 0 : if( pExcRoot->eDateiTyp == Biff2 )
156 : {
157 0 : eAkt = Z_Biff2;
158 0 : NewTable();
159 : }
160 0 : break;
161 : case EXC_BIFF3:
162 0 : Bof3();
163 0 : if( pExcRoot->eDateiTyp == Biff3 )
164 : {
165 0 : eAkt = Z_Biff3;
166 0 : NewTable();
167 : }
168 0 : break;
169 : case EXC_BIFF4:
170 0 : Bof4();
171 0 : if( pExcRoot->eDateiTyp == Biff4 )
172 : {
173 0 : eAkt = Z_Biff4;
174 0 : NewTable();
175 : }
176 0 : else if( pExcRoot->eDateiTyp == Biff4W )
177 0 : eAkt = Z_Biff4W;
178 0 : break;
179 : case EXC_BIFF5:
180 0 : Bof5();
181 0 : if( pExcRoot->eDateiTyp == Biff5W )
182 : {
183 0 : eAkt = Z_Biff5WPre;
184 :
185 0 : nBdshtTab = 0;
186 :
187 0 : aIn.StoreGlobalPosition(); // und Position merken
188 : }
189 0 : else if( pExcRoot->eDateiTyp == Biff5 )
190 : {
191 : // #i62752# possible to have BIFF5 sheet without globals
192 0 : NewTable();
193 0 : eAkt = Z_Biff5TPre; // Shrfmla Prefetch, Row-Prefetch
194 0 : nBofLevel = 0;
195 0 : aIn.StoreGlobalPosition(); // und Position merken
196 : }
197 0 : break;
198 : default:
199 : DBG_ERROR_BIFF();
200 : }
201 : }
202 0 : break;
203 : }
204 : }
205 0 : break;
206 :
207 : case Z_Biff2: // ---------------------------------- Z_Biff2 -
208 : {
209 0 : switch( nOpcode )
210 : {
211 : case EXC_ID2_DIMENSIONS:
212 0 : case EXC_ID3_DIMENSIONS: ReadDimensions(); break;
213 : case EXC_ID2_BLANK:
214 0 : case EXC_ID3_BLANK: ReadBlank(); break;
215 0 : case EXC_ID2_INTEGER: ReadInteger(); break;
216 : case EXC_ID2_NUMBER:
217 0 : case EXC_ID3_NUMBER: ReadNumber(); break;
218 : case EXC_ID2_LABEL:
219 0 : case EXC_ID3_LABEL: ReadLabel(); break;
220 : case EXC_ID2_BOOLERR:
221 0 : case EXC_ID3_BOOLERR: ReadBoolErr(); break;
222 0 : case EXC_ID_RK: ReadRk(); break;
223 :
224 0 : case 0x06: Formula25(); break; // FORMULA [ 2 5]
225 0 : case 0x08: Row25(); break; // ROW [ 2 5]
226 : case 0x0A: // EOF [ 2345]
227 0 : rNumFmtBfr.CreateScFormats();
228 0 : rNameMgr.ConvertAllTokens();
229 0 : Eof();
230 0 : eAkt = Z_Ende;
231 0 : break;
232 : case 0x14:
233 0 : case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break;
234 0 : case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345]
235 0 : case 0x18: rNameMgr.ReadName( maStrm ); break;
236 0 : case 0x1C: GetCurrSheetDrawing().ReadNote( maStrm );break;
237 0 : case 0x1D: rTabViewSett.ReadSelection( maStrm ); break;
238 0 : case 0x1E: rNumFmtBfr.ReadFormat( maStrm ); break;
239 0 : case 0x20: Columndefault(); break; // COLUMNDEFAULT[ 2 ]
240 0 : case 0x21: Array25(); break; // ARRAY [ 2 5]
241 0 : case 0x23: Externname25(); break; // EXTERNNAME [ 2 5]
242 0 : case 0x24: Colwidth(); break; // COLWIDTH [ 2 ]
243 0 : case 0x25: Defrowheight2(); break; // DEFAULTROWHEI[ 2 ]
244 : case 0x26:
245 : case 0x27:
246 : case 0x28:
247 0 : case 0x29: rPageSett.ReadMargin( maStrm ); break;
248 0 : case 0x2A: rPageSett.ReadPrintHeaders( maStrm ); break;
249 0 : case 0x2B: rPageSett.ReadPrintGridLines( maStrm ); break;
250 : case 0x2F: // FILEPASS [ 2345]
251 0 : eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
252 0 : if( eLastErr != ERRCODE_NONE )
253 0 : eAkt = Z_Ende;
254 0 : break;
255 0 : case EXC_ID2_FONT: rFontBfr.ReadFont( maStrm ); break;
256 0 : case EXC_ID_EFONT: rFontBfr.ReadEfont( maStrm ); break;
257 0 : case 0x3E: rTabViewSett.ReadWindow2( maStrm, false );break;
258 0 : case 0x41: rTabViewSett.ReadPane( maStrm ); break;
259 0 : case 0x42: Codepage(); break; // CODEPAGE [ 2345]
260 0 : case 0x43: rXFBfr.ReadXF( maStrm ); break;
261 0 : case 0x44: Ixfe(); break; // IXFE [ 2 ]
262 : }
263 : }
264 0 : break;
265 :
266 : case Z_Biff3: // ---------------------------------- Z_Biff3 -
267 : {
268 0 : switch( nOpcode )
269 : {
270 : // skip chart substream
271 : case EXC_ID2_BOF:
272 : case EXC_ID3_BOF:
273 : case EXC_ID4_BOF:
274 0 : case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break;
275 :
276 : case EXC_ID2_DIMENSIONS:
277 0 : case EXC_ID3_DIMENSIONS: ReadDimensions(); break;
278 : case EXC_ID2_BLANK:
279 0 : case EXC_ID3_BLANK: ReadBlank(); break;
280 0 : case EXC_ID2_INTEGER: ReadInteger(); break;
281 : case EXC_ID2_NUMBER:
282 0 : case EXC_ID3_NUMBER: ReadNumber(); break;
283 : case EXC_ID2_LABEL:
284 0 : case EXC_ID3_LABEL: ReadLabel(); break;
285 : case EXC_ID2_BOOLERR:
286 0 : case EXC_ID3_BOOLERR: ReadBoolErr(); break;
287 0 : case EXC_ID_RK: ReadRk(); break;
288 :
289 : case 0x0A: // EOF [ 2345]
290 0 : rNumFmtBfr.CreateScFormats();
291 0 : rNameMgr.ConvertAllTokens();
292 0 : Eof();
293 0 : eAkt = Z_Ende;
294 0 : break;
295 : case 0x14:
296 0 : case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break;
297 0 : case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345]
298 : case 0x1A:
299 0 : case 0x1B: rPageSett.ReadPageBreaks( maStrm ); break;
300 0 : case 0x1C: GetCurrSheetDrawing().ReadNote( maStrm );break;
301 0 : case 0x1D: rTabViewSett.ReadSelection( maStrm ); break;
302 0 : case 0x1E: rNumFmtBfr.ReadFormat( maStrm ); break;
303 0 : case 0x22: Rec1904(); break; // 1904 [ 2345]
304 : case 0x26:
305 : case 0x27:
306 : case 0x28:
307 0 : case 0x29: rPageSett.ReadMargin( maStrm ); break;
308 0 : case 0x2A: rPageSett.ReadPrintHeaders( maStrm ); break;
309 0 : case 0x2B: rPageSett.ReadPrintGridLines( maStrm ); break;
310 : case 0x2F: // FILEPASS [ 2345]
311 0 : eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
312 0 : if( eLastErr != ERRCODE_NONE )
313 0 : eAkt = Z_Ende;
314 0 : break;
315 0 : case EXC_ID_FILESHARING: ReadFileSharing(); break;
316 0 : case 0x41: rTabViewSett.ReadPane( maStrm ); break;
317 0 : case 0x42: Codepage(); break; // CODEPAGE [ 2345]
318 0 : case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ]
319 0 : case 0x5D: GetCurrSheetDrawing().ReadObj( maStrm );break;
320 0 : case 0x7D: Colinfo(); break; // COLINFO [ 345]
321 0 : case 0x8C: Country(); break; // COUNTRY [ 345]
322 0 : case 0x92: rPal.ReadPalette( maStrm ); break;
323 0 : case 0x0206: Formula3(); break; // FORMULA [ 3 ]
324 0 : case 0x0208: Row34(); break; // ROW [ 34 ]
325 0 : case 0x0218: rNameMgr.ReadName( maStrm ); break;
326 0 : case 0x0221: Array34(); break; // ARRAY [ 34 ]
327 0 : case 0x0223: Externname34(); break; // EXTERNNAME [ 34 ]
328 0 : case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345]
329 0 : case 0x0231: rFontBfr.ReadFont( maStrm ); break;
330 0 : case 0x023E: rTabViewSett.ReadWindow2( maStrm, false );break;
331 0 : case 0x0243: rXFBfr.ReadXF( maStrm ); break;
332 0 : case 0x0293: rXFBfr.ReadStyle( maStrm ); break;
333 : }
334 : }
335 0 : break;
336 :
337 : case Z_Biff4: // ---------------------------------- Z_Biff4 -
338 : {
339 0 : switch( nOpcode )
340 : {
341 : // skip chart substream
342 : case EXC_ID2_BOF:
343 : case EXC_ID3_BOF:
344 : case EXC_ID4_BOF:
345 0 : case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break;
346 :
347 : case EXC_ID2_DIMENSIONS:
348 0 : case EXC_ID3_DIMENSIONS: ReadDimensions(); break;
349 : case EXC_ID2_BLANK:
350 0 : case EXC_ID3_BLANK: ReadBlank(); break;
351 0 : case EXC_ID2_INTEGER: ReadInteger(); break;
352 : case EXC_ID2_NUMBER:
353 0 : case EXC_ID3_NUMBER: ReadNumber(); break;
354 : case EXC_ID2_LABEL:
355 0 : case EXC_ID3_LABEL: ReadLabel(); break;
356 : case EXC_ID2_BOOLERR:
357 0 : case EXC_ID3_BOOLERR: ReadBoolErr(); break;
358 0 : case EXC_ID_RK: ReadRk(); break;
359 :
360 : case 0x0A: // EOF [ 2345]
361 0 : rNumFmtBfr.CreateScFormats();
362 0 : rNameMgr.ConvertAllTokens();
363 0 : Eof();
364 0 : eAkt = Z_Ende;
365 0 : break;
366 0 : case 0x12: SheetProtect(); break; // SHEET PROTECTION
367 : case 0x14:
368 0 : case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break;
369 0 : case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345]
370 : case 0x1A:
371 0 : case 0x1B: rPageSett.ReadPageBreaks( maStrm ); break;
372 0 : case 0x1C: GetCurrSheetDrawing().ReadNote( maStrm );break;
373 0 : case 0x1D: rTabViewSett.ReadSelection( maStrm ); break;
374 0 : case 0x22: Rec1904(); break; // 1904 [ 2345]
375 : case 0x26:
376 : case 0x27:
377 : case 0x28:
378 0 : case 0x29: rPageSett.ReadMargin( maStrm ); break;
379 0 : case 0x2A: rPageSett.ReadPrintHeaders( maStrm ); break;
380 0 : case 0x2B: rPageSett.ReadPrintGridLines( maStrm ); break;
381 : case 0x2F: // FILEPASS [ 2345]
382 0 : eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
383 0 : if( eLastErr != ERRCODE_NONE )
384 0 : eAkt = Z_Ende;
385 0 : break;
386 0 : case EXC_ID_FILESHARING: ReadFileSharing(); break;
387 0 : case 0x41: rTabViewSett.ReadPane( maStrm ); break;
388 0 : case 0x42: Codepage(); break; // CODEPAGE [ 2345]
389 0 : case 0x55: DefColWidth(); break;
390 0 : case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ]
391 0 : case 0x5D: GetCurrSheetDrawing().ReadObj( maStrm );break;
392 0 : case 0x7D: Colinfo(); break; // COLINFO [ 345]
393 0 : case 0x8C: Country(); break; // COUNTRY [ 345]
394 0 : case 0x92: rPal.ReadPalette( maStrm ); break;
395 0 : case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45]
396 0 : case 0xA1: rPageSett.ReadSetup( maStrm ); break;
397 0 : case 0x0208: Row34(); break; // ROW [ 34 ]
398 0 : case 0x0218: rNameMgr.ReadName( maStrm ); break;
399 0 : case 0x0221: Array34(); break; // ARRAY [ 34 ]
400 0 : case 0x0223: Externname34(); break; // EXTERNNAME [ 34 ]
401 0 : case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345]
402 0 : case 0x0231: rFontBfr.ReadFont( maStrm ); break;
403 0 : case 0x023E: rTabViewSett.ReadWindow2( maStrm, false );break;
404 0 : case 0x0406: Formula4(); break; // FORMULA [ 4 ]
405 0 : case 0x041E: rNumFmtBfr.ReadFormat( maStrm ); break;
406 0 : case 0x0443: rXFBfr.ReadXF( maStrm ); break;
407 0 : case 0x0293: rXFBfr.ReadStyle( maStrm ); break;
408 : }
409 : }
410 0 : break;
411 :
412 : case Z_Biff4W: // --------------------------------- Z_Biff4W -
413 : {
414 0 : switch( nOpcode )
415 : {
416 : case 0x0A: // EOF [ 2345]
417 0 : rNameMgr.ConvertAllTokens();
418 0 : eAkt = Z_Ende;
419 0 : break;
420 0 : case 0x12: DocProtect(); break; // PROTECT [ 5]
421 : case 0x2F: // FILEPASS [ 2345]
422 0 : eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
423 0 : if( eLastErr != ERRCODE_NONE )
424 0 : eAkt = Z_Ende;
425 0 : break;
426 0 : case EXC_ID_FILESHARING: ReadFileSharing(); break;
427 0 : case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345]
428 0 : case 0x42: Codepage(); break; // CODEPAGE [ 2345]
429 0 : case 0x55: DefColWidth(); break;
430 0 : case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ]
431 0 : case 0x8C: Country(); break; // COUNTRY [ 345]
432 0 : case 0x8F: Bundleheader(); break; // BUNDLEHEADER [ 4 ]
433 0 : case 0x92: rPal.ReadPalette( maStrm ); break;
434 0 : case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45]
435 0 : case 0x0218: rNameMgr.ReadName( maStrm ); break;
436 0 : case 0x0223: Externname34(); break; // EXTERNNAME [ 34 ]
437 0 : case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345]
438 0 : case 0x0231: rFontBfr.ReadFont( maStrm ); break;
439 : case 0x0409: // BOF [ 4 ]
440 0 : Bof4();
441 0 : if( pExcRoot->eDateiTyp == Biff4 )
442 : {
443 0 : eAkt = Z_Biff4T;
444 0 : NewTable();
445 : }
446 : else
447 0 : eAkt = Z_Ende;
448 0 : break;
449 0 : case 0x041E: rNumFmtBfr.ReadFormat( maStrm ); break;
450 0 : case 0x0443: rXFBfr.ReadXF( maStrm ); break;
451 0 : case 0x0293: rXFBfr.ReadStyle( maStrm ); break;
452 : }
453 :
454 : }
455 0 : break;
456 :
457 : case Z_Biff4T: // --------------------------------- Z_Biff4T -
458 : {
459 0 : switch( nOpcode )
460 : {
461 : // skip chart substream
462 : case EXC_ID2_BOF:
463 : case EXC_ID3_BOF:
464 : case EXC_ID4_BOF:
465 0 : case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break;
466 :
467 : case EXC_ID2_DIMENSIONS:
468 0 : case EXC_ID3_DIMENSIONS: ReadDimensions(); break;
469 : case EXC_ID2_BLANK:
470 0 : case EXC_ID3_BLANK: ReadBlank(); break;
471 0 : case EXC_ID2_INTEGER: ReadInteger(); break;
472 : case EXC_ID2_NUMBER:
473 0 : case EXC_ID3_NUMBER: ReadNumber(); break;
474 : case EXC_ID2_LABEL:
475 0 : case EXC_ID3_LABEL: ReadLabel(); break;
476 : case EXC_ID2_BOOLERR:
477 0 : case EXC_ID3_BOOLERR: ReadBoolErr(); break;
478 0 : case EXC_ID_RK: ReadRk(); break;
479 :
480 : case 0x0A: // EOF [ 2345]
481 0 : rNameMgr.ConvertAllTokens();
482 0 : Eof();
483 0 : eAkt = Z_Biff4E;
484 0 : break;
485 0 : case 0x12: SheetProtect(); break; // SHEET PROTECTION
486 : case 0x14:
487 0 : case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break;
488 : case 0x1A:
489 0 : case 0x1B: rPageSett.ReadPageBreaks( maStrm ); break;
490 0 : case 0x1C: GetCurrSheetDrawing().ReadNote( maStrm );break;
491 0 : case 0x1D: rTabViewSett.ReadSelection( maStrm ); break;
492 : case 0x2F: // FILEPASS [ 2345]
493 0 : eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
494 0 : if( eLastErr != ERRCODE_NONE )
495 0 : eAkt = Z_Ende;
496 0 : break;
497 0 : case 0x41: rTabViewSett.ReadPane( maStrm ); break;
498 0 : case 0x42: Codepage(); break; // CODEPAGE [ 2345]
499 0 : case 0x55: DefColWidth(); break;
500 0 : case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ]
501 0 : case 0x5D: GetCurrSheetDrawing().ReadObj( maStrm );break;
502 0 : case 0x7D: Colinfo(); break; // COLINFO [ 345]
503 0 : case 0x8C: Country(); break; // COUNTRY [ 345]
504 0 : case 0x8F: Bundleheader(); break; // BUNDLEHEADER [ 4 ]
505 0 : case 0x92: rPal.ReadPalette( maStrm ); break;
506 0 : case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45]
507 0 : case 0xA1: rPageSett.ReadSetup( maStrm ); break;
508 0 : case 0x0208: Row34(); break; // ROW [ 34 ]
509 0 : case 0x0218: rNameMgr.ReadName( maStrm ); break;
510 0 : case 0x0221: Array34(); break;
511 0 : case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345]
512 0 : case 0x0231: rFontBfr.ReadFont( maStrm ); break;
513 0 : case 0x023E: rTabViewSett.ReadWindow2( maStrm, false );break;
514 0 : case 0x0406: Formula4(); break;
515 0 : case 0x041E: rNumFmtBfr.ReadFormat( maStrm ); break;
516 0 : case 0x0443: rXFBfr.ReadXF( maStrm ); break;
517 0 : case 0x0293: rXFBfr.ReadStyle( maStrm ); break;
518 : }
519 :
520 : }
521 0 : break;
522 :
523 : case Z_Biff4E: // --------------------------------- Z_Biff4E -
524 : {
525 0 : switch( nOpcode )
526 : {
527 : case 0x0A: // EOF [ 2345]
528 0 : eAkt = Z_Ende;
529 0 : break;
530 0 : case 0x8F: break; // BUNDLEHEADER [ 4 ]
531 : case 0x0409: // BOF [ 4 ]
532 0 : Bof4();
533 0 : NewTable();
534 0 : if( pExcRoot->eDateiTyp == Biff4 )
535 : {
536 0 : eAkt = Z_Biff4T;
537 : }
538 : else
539 : {
540 0 : ePrev = eAkt;
541 0 : eAkt = Z_Biffn0;
542 : }
543 0 : break;
544 : }
545 :
546 : }
547 0 : break;
548 : case Z_Biff5WPre: // ------------------------------ Z_Biff5WPre -
549 : {
550 0 : switch( nOpcode )
551 : {
552 : case 0x0A: // EOF [ 2345]
553 0 : eAkt = Z_Biff5W;
554 0 : aIn.SeekGlobalPosition(); // und zurueck an alte Position
555 0 : break;
556 0 : case 0x12: DocProtect(); break; // PROTECT [ 5]
557 : case 0x2F: // FILEPASS [ 2345]
558 0 : eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
559 0 : if( eLastErr != ERRCODE_NONE )
560 0 : eAkt = Z_Ende;
561 0 : break;
562 0 : case EXC_ID_FILESHARING: ReadFileSharing(); break;
563 0 : case 0x3D: Window1(); break;
564 0 : case 0x42: Codepage(); break; // CODEPAGE [ 2345]
565 0 : case 0x85: Boundsheet(); break; // BOUNDSHEET [ 5]
566 0 : case 0x8C: Country(); break; // COUNTRY [ 345]
567 : // PALETTE follows XFs, but already needed while reading the XFs
568 0 : case 0x92: rPal.ReadPalette( maStrm ); break;
569 : }
570 : }
571 0 : break;
572 : case Z_Biff5W: // --------------------------------- Z_Biff5W -
573 : {
574 0 : switch( nOpcode )
575 : {
576 : case 0x0A: // EOF [ 2345]
577 0 : rNumFmtBfr.CreateScFormats();
578 0 : rXFBfr.CreateUserStyles();
579 0 : rNameMgr.ConvertAllTokens();
580 0 : eAkt = Z_Biff5E;
581 0 : break;
582 0 : case 0x18: rNameMgr.ReadName( maStrm ); break;
583 0 : case 0x1E: rNumFmtBfr.ReadFormat( maStrm ); break;
584 0 : case 0x22: Rec1904(); break; // 1904 [ 2345]
585 0 : case 0x31: rFontBfr.ReadFont( maStrm ); break;
586 0 : case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ]
587 0 : case 0x8D: Hideobj(); break; // HIDEOBJ [ 345]
588 0 : case 0xDE: Olesize(); break;
589 0 : case 0xE0: rXFBfr.ReadXF( maStrm ); break;
590 0 : case 0x0293: rXFBfr.ReadStyle( maStrm ); break;
591 0 : case 0x041E: rNumFmtBfr.ReadFormat( maStrm ); break;
592 : }
593 :
594 : }
595 0 : break;
596 :
597 : case Z_Biff5TPre: // ------------------------------- Z_Biff5Pre -
598 : {
599 0 : if( nOpcode == 0x0809 )
600 0 : nBofLevel++;
601 0 : else if( (nOpcode == 0x000A) && nBofLevel )
602 0 : nBofLevel--;
603 0 : else if( !nBofLevel ) // don't read chart records
604 : {
605 0 : switch( nOpcode )
606 : {
607 : case EXC_ID2_DIMENSIONS:
608 0 : case EXC_ID3_DIMENSIONS: ReadDimensions(); break;
609 0 : case 0x08: Row25(); break; // ROW [ 2 5]
610 : case 0x0A: // EOF [ 2345]
611 0 : eAkt = Z_Biff5T;
612 0 : aIn.SeekGlobalPosition(); // und zurueck an alte Position
613 0 : break;
614 0 : case 0x12: SheetProtect(); break; // SHEET PROTECTION
615 : case 0x1A:
616 0 : case 0x1B: rPageSett.ReadPageBreaks( maStrm ); break;
617 0 : case 0x1D: rTabViewSett.ReadSelection( maStrm ); break;
618 0 : case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345]
619 0 : case 0x21: Array25(); break; // ARRAY [ 2 5]
620 0 : case 0x23: Externname25(); break; // EXTERNNAME [ 2 5]
621 0 : case 0x41: rTabViewSett.ReadPane( maStrm ); break;
622 0 : case 0x42: Codepage(); break; // CODEPAGE [ 2345]
623 0 : case 0x55: DefColWidth(); break;
624 0 : case 0x7D: Colinfo(); break; // COLINFO [ 345]
625 0 : case 0x81: Wsbool(); break; // WSBOOL [ 2345]
626 0 : case 0x8C: Country(); break; // COUNTRY [ 345]
627 0 : case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45]
628 0 : case 0x0208: Row34(); break; // ROW [ 34 ]
629 0 : case 0x0221: Array34(); break; // ARRAY [ 34 ]
630 0 : case 0x0223: Externname34(); break; // EXTERNNAME [ 34 ]
631 0 : case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345]
632 0 : case 0x023E: rTabViewSett.ReadWindow2( maStrm, false );break;
633 : }
634 : }
635 : }
636 0 : break;
637 :
638 : case Z_Biff5T: // --------------------------------- Z_Biff5T -
639 : {
640 0 : switch( nOpcode )
641 : {
642 : case EXC_ID2_BLANK:
643 0 : case EXC_ID3_BLANK: ReadBlank(); break;
644 0 : case EXC_ID2_INTEGER: ReadInteger(); break;
645 : case EXC_ID2_NUMBER:
646 0 : case EXC_ID3_NUMBER: ReadNumber(); break;
647 : case EXC_ID2_LABEL:
648 0 : case EXC_ID3_LABEL: ReadLabel(); break;
649 : case EXC_ID2_BOOLERR:
650 0 : case EXC_ID3_BOOLERR: ReadBoolErr(); break;
651 0 : case EXC_ID_RK: ReadRk(); break;
652 :
653 : case EXC_ID2_FORMULA:
654 : case EXC_ID3_FORMULA:
655 0 : case EXC_ID4_FORMULA: Formula25(); break;
656 0 : case EXC_ID_SHRFMLA: Shrfmla(); break;
657 0 : case 0x0A: Eof(); eAkt = Z_Biff5E; break;
658 : case 0x14:
659 0 : case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break;
660 0 : case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345]
661 0 : case 0x1C: GetCurrSheetDrawing().ReadNote( maStrm );break;
662 0 : case 0x1D: rTabViewSett.ReadSelection( maStrm ); break;
663 0 : case 0x23: Externname25(); break; // EXTERNNAME [ 2 5]
664 : case 0x26:
665 : case 0x27:
666 : case 0x28:
667 0 : case 0x29: rPageSett.ReadMargin( maStrm ); break;
668 0 : case 0x2A: rPageSett.ReadPrintHeaders( maStrm ); break;
669 0 : case 0x2B: rPageSett.ReadPrintGridLines( maStrm ); break;
670 : case 0x2F: // FILEPASS [ 2345]
671 0 : eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
672 0 : if( eLastErr != ERRCODE_NONE )
673 0 : eAkt = Z_Ende;
674 0 : break;
675 0 : case 0x5D: GetCurrSheetDrawing().ReadObj( maStrm );break;
676 : case 0x83:
677 0 : case 0x84: rPageSett.ReadCenter( maStrm ); break;
678 0 : case 0xA0: rTabViewSett.ReadScl( maStrm ); break;
679 0 : case 0xA1: rPageSett.ReadSetup( maStrm ); break;
680 0 : case 0xBD: Mulrk(); break; // MULRK [ 5]
681 0 : case 0xBE: Mulblank(); break; // MULBLANK [ 5]
682 0 : case 0xD6: Rstring(); break; // RSTRING [ 5]
683 0 : case 0x00E5: Cellmerging(); break; // #i62300#
684 0 : case 0x0236: TableOp(); break; // TABLE [ 5]
685 : case 0x0809: // BOF [ 5]
686 0 : XclTools::SkipSubStream( maStrm );
687 0 : break;
688 : }
689 :
690 : }
691 0 : break;
692 :
693 : case Z_Biff5E: // --------------------------------- Z_Biff5E -
694 : {
695 0 : switch( nOpcode )
696 : {
697 : case 0x0809: // BOF [ 5]
698 0 : Bof5();
699 0 : NewTable();
700 0 : switch( pExcRoot->eDateiTyp )
701 : {
702 : case Biff5:
703 : case Biff5M4:
704 0 : eAkt = Z_Biff5TPre; // Shrfmla Prefetch, Row-Prefetch
705 0 : nBofLevel = 0;
706 0 : aIn.StoreGlobalPosition(); // und Position merken
707 0 : break;
708 : case Biff5C: // chart sheet
709 0 : GetCurrSheetDrawing().ReadTabChart( maStrm );
710 0 : Eof();
711 0 : GetTracer().TraceChartOnlySheet();
712 0 : break;
713 : case Biff5V:
714 : default:
715 0 : pD->SetVisible( GetCurrScTab(), false );
716 0 : ePrev = eAkt;
717 0 : eAkt = Z_Biffn0;
718 : }
719 : OSL_ENSURE( pExcRoot->eDateiTyp != Biff5W,
720 : "+ImportExcel::Read(): Doppel-Whopper-Workbook!" );
721 :
722 0 : break;
723 : }
724 :
725 : }
726 0 : break;
727 : case Z_Biffn0: // --------------------------------- Z_Biffn0 -
728 : {
729 0 : switch( nOpcode )
730 : {
731 : case 0x0A: // EOF [ 2345]
732 0 : eAkt = ePrev;
733 0 : IncCurrScTab();
734 0 : break;
735 : }
736 :
737 : }
738 0 : break;
739 :
740 : case Z_Ende: // ----------------------------------- Z_Ende -
741 : OSL_FAIL( "*ImportExcel::Read(): Not possible state!" );
742 0 : break;
743 : default: OSL_FAIL( "-ImportExcel::Read(): state forgotten!" );
744 : }
745 : }
746 :
747 0 : if( eLastErr == eERR_OK )
748 : {
749 0 : pProgress.reset();
750 :
751 0 : GetDocImport().finalize();
752 0 : AdjustRowHeight();
753 0 : PostDocLoad();
754 :
755 0 : pD->CalcAfterLoad();
756 :
757 0 : const XclImpAddressConverter& rAddrConv = GetAddressConverter();
758 0 : if( rAddrConv.IsTabTruncated() )
759 0 : eLastErr = SCWARN_IMPORT_SHEET_OVERFLOW;
760 0 : else if( bTabTruncated || rAddrConv.IsRowTruncated() )
761 0 : eLastErr = SCWARN_IMPORT_ROW_OVERFLOW;
762 0 : else if( rAddrConv.IsColTruncated() )
763 0 : eLastErr = SCWARN_IMPORT_COLUMN_OVERFLOW;
764 : }
765 :
766 0 : return eLastErr;
767 : }
768 :
769 :
770 0 : FltError ImportExcel8::Read( void )
771 : {
772 : #ifdef EXC_INCL_DUMPER
773 : {
774 : Biff8RecDumper aDumper( GetRoot(), sal_True );
775 : if( aDumper.Dump( aIn ) )
776 : return ERRCODE_ABORT;
777 : }
778 : #endif
779 : // read the entire BIFF8 stream
780 : // don't look too close - this stuff seriously needs to be reworked
781 :
782 0 : XclImpPageSettings& rPageSett = GetPageSettings();
783 0 : XclImpTabViewSettings& rTabViewSett = GetTabViewSettings();
784 0 : XclImpPalette& rPal = GetPalette();
785 0 : XclImpFontBuffer& rFontBfr = GetFontBuffer();
786 0 : XclImpNumFmtBuffer& rNumFmtBfr = GetNumFmtBuffer();
787 0 : XclImpXFBuffer& rXFBfr = GetXFBuffer();
788 0 : XclImpSst& rSst = GetSst();
789 0 : XclImpTabInfo& rTabInfo = GetTabInfo();
790 0 : XclImpNameManager& rNameMgr = GetNameManager();
791 0 : XclImpLinkManager& rLinkMgr = GetLinkManager();
792 0 : XclImpObjectManager& rObjMgr = GetObjectManager();
793 : // call to GetCurrSheetDrawing() cannot be cached (changes in new sheets)
794 0 : XclImpCondFormatManager& rCondFmtMgr = GetCondFormatManager();
795 0 : XclImpValidationManager& rValidMgr = GetValidationManager();
796 0 : XclImpPivotTableManager& rPTableMgr = GetPivotTableManager();
797 0 : XclImpWebQueryBuffer& rWQBfr = GetWebQueryBuffer();
798 :
799 0 : bool bInUserView = false; // true = In USERSVIEW(BEGIN|END) record block.
800 :
801 : enum XclImpReadState
802 : {
803 : EXC_STATE_BEFORE_GLOBALS, /// Before workbook globals (wait for initial BOF).
804 : EXC_STATE_GLOBALS_PRE, /// Prefetch for workbook globals.
805 : EXC_STATE_GLOBALS, /// Workbook globals.
806 : EXC_STATE_BEFORE_SHEET, /// Before worksheet (wait for new worksheet BOF).
807 : EXC_STATE_SHEET_PRE, /// Prefetch for worksheet.
808 : EXC_STATE_SHEET, /// Worksheet.
809 : EXC_STATE_END /// Stop reading.
810 : };
811 :
812 0 : XclImpReadState eAkt = EXC_STATE_BEFORE_GLOBALS;
813 :
814 0 : FltError eLastErr = eERR_OK;
815 :
816 : boost::scoped_ptr< ScfSimpleProgressBar > pProgress( new ScfSimpleProgressBar(
817 0 : aIn.GetSvStreamSize(), GetDocShell(), STR_LOAD_DOC ) );
818 :
819 : /* #i104057# Need to track a base position for progress bar calculation,
820 : because sheet substreams may not be in order of sheets. */
821 0 : sal_Size nProgressBasePos = 0;
822 0 : sal_Size nProgressBaseSize = 0;
823 :
824 0 : bool bSheetHasCodeName = false;
825 :
826 0 : std::vector<OUString> aCodeNames;
827 0 : std::vector < SCTAB > nTabsWithNoCodeName;
828 :
829 0 : sal_uInt16 nRecId = 0;
830 :
831 0 : for (; eAkt != EXC_STATE_END; mnLastRecId = nRecId)
832 : {
833 0 : if( eAkt == EXC_STATE_BEFORE_SHEET )
834 : {
835 0 : sal_uInt16 nScTab = GetCurrScTab();
836 0 : if( nScTab < maSheetOffsets.size() )
837 : {
838 0 : nProgressBaseSize += (maStrm.GetSvStreamPos() - nProgressBasePos);
839 0 : nProgressBasePos = maSheetOffsets[ nScTab ];
840 :
841 : // i#115255 fdo#40304 BOUNDSHEET doesn't point to a valid
842 : // BOF record position. Scan the records manually (from
843 : // the BOUNDSHEET position) until we find a BOF. Some 3rd
844 : // party Russian programs generate invalid xls docs with
845 : // this kind of silliness.
846 0 : if (aIn.PeekRecId(nProgressBasePos) == EXC_ID5_BOF)
847 : // BOUNDSHEET points to a valid BOF record. Good.
848 0 : aIn.StartNextRecord(nProgressBasePos);
849 : else
850 : {
851 0 : bool bValid = true;
852 0 : while (bValid && aIn.GetRecId() != EXC_ID5_BOF)
853 0 : bValid = aIn.StartNextRecord();
854 :
855 0 : if (!bValid)
856 : // Safeguard ourselves from potential infinite loop.
857 0 : eAkt = EXC_STATE_END;
858 : }
859 :
860 : // import only 256 sheets
861 0 : if( nScTab > GetScMaxPos().Tab() )
862 : {
863 0 : if( maStrm.GetRecId() != EXC_ID_EOF )
864 0 : XclTools::SkipSubStream( maStrm );
865 : // #i29930# show warning box
866 0 : GetAddressConverter().CheckScTab( nScTab, true );
867 0 : eAkt = EXC_STATE_END;
868 : }
869 : else
870 : {
871 : // #i109800# SHEET record may point to any record inside the
872 : // sheet substream
873 0 : bool bIsBof = maStrm.GetRecId() == EXC_ID5_BOF;
874 0 : if( bIsBof )
875 0 : Bof5(); // read the BOF record
876 : else
877 0 : pExcRoot->eDateiTyp = Biff8; // on missing BOF, assume a standard worksheet
878 0 : NewTable();
879 0 : switch( pExcRoot->eDateiTyp )
880 : {
881 : case Biff8: // worksheet
882 : case Biff8M4: // macro sheet
883 0 : eAkt = EXC_STATE_SHEET_PRE; // Shrfmla Prefetch, Row-Prefetch
884 : // go to next record
885 0 : if( bIsBof ) maStrm.StartNextRecord();
886 0 : maStrm.StoreGlobalPosition();
887 0 : break;
888 : case Biff8C: // chart sheet
889 0 : GetCurrSheetDrawing().ReadTabChart( maStrm );
890 0 : Eof();
891 0 : GetTracer().TraceChartOnlySheet();
892 0 : break;
893 : case Biff8W: // workbook
894 : OSL_FAIL( "ImportExcel8::Read - double workbook globals" );
895 : // run through
896 : case Biff8V: // VB module
897 : default:
898 : // TODO: do not create a sheet in the Calc document
899 0 : pD->SetVisible( nScTab, false );
900 0 : XclTools::SkipSubStream( maStrm );
901 0 : IncCurrScTab();
902 : }
903 : }
904 : }
905 : else
906 0 : eAkt = EXC_STATE_END;
907 : }
908 : else
909 0 : aIn.StartNextRecord();
910 :
911 0 : if( !aIn.IsValid() )
912 : {
913 : // #i63591# finalize table if EOF is missing
914 0 : switch( eAkt )
915 : {
916 : case EXC_STATE_SHEET_PRE:
917 0 : eAkt = EXC_STATE_SHEET;
918 0 : aIn.SeekGlobalPosition();
919 0 : continue; // next iteration in while loop
920 : case EXC_STATE_SHEET:
921 0 : Eof();
922 0 : eAkt = EXC_STATE_END;
923 0 : break;
924 : default:
925 0 : eAkt = EXC_STATE_END;
926 : }
927 : }
928 :
929 0 : if( eAkt == EXC_STATE_END )
930 0 : break;
931 :
932 0 : if( eAkt != EXC_STATE_SHEET_PRE && eAkt != EXC_STATE_GLOBALS_PRE )
933 0 : pProgress->ProgressAbs( nProgressBaseSize + aIn.GetSvStreamPos() - nProgressBasePos );
934 :
935 0 : nRecId = aIn.GetRecId();
936 :
937 : /* #i39464# Ignore records between USERSVIEWBEGIN and USERSVIEWEND
938 : completely (user specific view settings). Otherwise view settings
939 : and filters are loaded multiple times, which at least causes
940 : problems in auto-filters. */
941 0 : switch( nRecId )
942 : {
943 : case EXC_ID_USERSVIEWBEGIN:
944 : OSL_ENSURE( !bInUserView, "ImportExcel8::Read - nested user view settings" );
945 0 : bInUserView = true;
946 0 : break;
947 : case EXC_ID_USERSVIEWEND:
948 : OSL_ENSURE( bInUserView, "ImportExcel8::Read - not in user view settings" );
949 0 : bInUserView = false;
950 0 : break;
951 : }
952 :
953 0 : if( !bInUserView ) switch( eAkt )
954 : {
955 :
956 : // before workbook globals: wait for initial workbook globals BOF
957 : case EXC_STATE_BEFORE_GLOBALS:
958 : {
959 0 : if( nRecId == EXC_ID5_BOF )
960 : {
961 : OSL_ENSURE( GetBiff() == EXC_BIFF8, "ImportExcel8::Read - wrong BIFF version" );
962 0 : Bof5();
963 0 : if( pExcRoot->eDateiTyp == Biff8W )
964 : {
965 0 : eAkt = EXC_STATE_GLOBALS_PRE;
966 0 : maStrm.StoreGlobalPosition();
967 0 : nBdshtTab = 0;
968 : }
969 0 : else if( pExcRoot->eDateiTyp == Biff8 )
970 : {
971 : // #i62752# possible to have BIFF8 sheet without globals
972 0 : NewTable();
973 0 : eAkt = EXC_STATE_SHEET_PRE; // Shrfmla Prefetch, Row-Prefetch
974 0 : bSheetHasCodeName = false; // reset
975 0 : aIn.StoreGlobalPosition();
976 : }
977 : }
978 : }
979 0 : break;
980 :
981 :
982 : // prefetch for workbook globals
983 : case EXC_STATE_GLOBALS_PRE:
984 : {
985 0 : switch( nRecId )
986 : {
987 : case EXC_ID_EOF:
988 : case EXC_ID_EXTSST:
989 : /* #i56376# evil hack: if EOF for globals is missing,
990 : simulate it. This hack works only for the bugdoc
991 : given in the issue, where the sheet substreams
992 : start directly after the EXTSST record. A future
993 : implementation should be more robust against
994 : missing EOFs. */
995 0 : if( (nRecId == EXC_ID_EOF) ||
996 0 : ((nRecId == EXC_ID_EXTSST) && (maStrm.GetNextRecId() == EXC_ID5_BOF)) )
997 : {
998 0 : eAkt = EXC_STATE_GLOBALS;
999 0 : aIn.SeekGlobalPosition();
1000 : }
1001 0 : break;
1002 0 : case 0x12: DocProtect(); break; // PROTECT [ 5678]
1003 0 : case 0x13: DocPasssword(); break;
1004 0 : case 0x19: WinProtection(); break;
1005 : case 0x2F: // FILEPASS [ 2345 ]
1006 0 : eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
1007 0 : if( eLastErr != ERRCODE_NONE )
1008 0 : eAkt = EXC_STATE_END;
1009 0 : break;
1010 0 : case EXC_ID_FILESHARING: ReadFileSharing(); break;
1011 0 : case 0x3D: Window1(); break;
1012 0 : case 0x42: Codepage(); break; // CODEPAGE [ 2345 ]
1013 0 : case 0x85: Boundsheet(); break; // BOUNDSHEET [ 5 ]
1014 0 : case 0x8C: Country(); break; // COUNTRY [ 345 ]
1015 :
1016 : // PALETTE follows XFs, but already needed while reading the XFs
1017 0 : case EXC_ID_PALETTE: rPal.ReadPalette( maStrm ); break;
1018 : }
1019 : }
1020 0 : break;
1021 :
1022 :
1023 : // workbook globals
1024 : case EXC_STATE_GLOBALS:
1025 : {
1026 0 : switch( nRecId )
1027 : {
1028 : case EXC_ID_EOF:
1029 : case EXC_ID_EXTSST:
1030 : /* #i56376# evil hack: if EOF for globals is missing,
1031 : simulate it. This hack works only for the bugdoc
1032 : given in the issue, where the sheet substreams
1033 : start directly after the EXTSST record. A future
1034 : implementation should be more robust against
1035 : missing EOFs. */
1036 0 : if( (nRecId == EXC_ID_EOF) ||
1037 0 : ((nRecId == EXC_ID_EXTSST) && (maStrm.GetNextRecId() == EXC_ID5_BOF)) )
1038 : {
1039 0 : rNumFmtBfr.CreateScFormats();
1040 0 : rXFBfr.CreateUserStyles();
1041 0 : rPTableMgr.ReadPivotCaches( maStrm );
1042 0 : rNameMgr.ConvertAllTokens();
1043 0 : eAkt = EXC_STATE_BEFORE_SHEET;
1044 : }
1045 0 : break;
1046 0 : case 0x0E: Precision(); break; // PRECISION
1047 0 : case 0x22: Rec1904(); break; // 1904 [ 2345 ]
1048 0 : case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ]
1049 0 : case 0x8D: Hideobj(); break; // HIDEOBJ [ 345 ]
1050 0 : case 0xD3: SetHasBasic(); break;
1051 0 : case 0xDE: Olesize(); break;
1052 :
1053 0 : case EXC_ID_CODENAME: ReadCodeName( aIn, true ); break;
1054 0 : case EXC_ID_USESELFS: ReadUsesElfs(); break;
1055 :
1056 0 : case EXC_ID2_FONT: rFontBfr.ReadFont( maStrm ); break;
1057 0 : case EXC_ID4_FORMAT: rNumFmtBfr.ReadFormat( maStrm ); break;
1058 0 : case EXC_ID5_XF: rXFBfr.ReadXF( maStrm ); break;
1059 0 : case EXC_ID_STYLE: rXFBfr.ReadStyle( maStrm ); break;
1060 :
1061 0 : case EXC_ID_SST: rSst.ReadSst( maStrm ); break;
1062 0 : case EXC_ID_TABID: rTabInfo.ReadTabid( maStrm ); break;
1063 0 : case EXC_ID_NAME: rNameMgr.ReadName( maStrm ); break;
1064 :
1065 0 : case EXC_ID_EXTERNSHEET: rLinkMgr.ReadExternsheet( maStrm ); break;
1066 0 : case EXC_ID_SUPBOOK: rLinkMgr.ReadSupbook( maStrm ); break;
1067 0 : case EXC_ID_XCT: rLinkMgr.ReadXct( maStrm ); break;
1068 0 : case EXC_ID_CRN: rLinkMgr.ReadCrn( maStrm ); break;
1069 0 : case EXC_ID_EXTERNNAME: rLinkMgr.ReadExternname( maStrm, pFormConv ); break;
1070 :
1071 0 : case EXC_ID_MSODRAWINGGROUP:rObjMgr.ReadMsoDrawingGroup( maStrm ); break;
1072 :
1073 0 : case EXC_ID_SXIDSTM: rPTableMgr.ReadSxidstm( maStrm ); break;
1074 0 : case EXC_ID_SXVS: rPTableMgr.ReadSxvs( maStrm ); break;
1075 0 : case EXC_ID_DCONREF: rPTableMgr.ReadDconref( maStrm ); break;
1076 0 : case EXC_ID_DCONNAME: rPTableMgr.ReadDConName( maStrm ); break;
1077 : }
1078 :
1079 : }
1080 0 : break;
1081 :
1082 :
1083 : // prefetch for worksheet
1084 : case EXC_STATE_SHEET_PRE:
1085 : {
1086 0 : switch( nRecId )
1087 : {
1088 : // skip chart substream
1089 : case EXC_ID2_BOF:
1090 : case EXC_ID3_BOF:
1091 : case EXC_ID4_BOF:
1092 0 : case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break;
1093 :
1094 0 : case EXC_ID_WINDOW2: rTabViewSett.ReadWindow2( maStrm, false );break;
1095 0 : case EXC_ID_SCL: rTabViewSett.ReadScl( maStrm ); break;
1096 0 : case EXC_ID_PANE: rTabViewSett.ReadPane( maStrm ); break;
1097 0 : case EXC_ID_SELECTION: rTabViewSett.ReadSelection( maStrm ); break;
1098 :
1099 : case EXC_ID2_DIMENSIONS:
1100 0 : case EXC_ID3_DIMENSIONS: ReadDimensions(); break;
1101 :
1102 0 : case EXC_ID_CODENAME: ReadCodeName( aIn, false ); bSheetHasCodeName = true; break;
1103 :
1104 : case 0x0A: // EOF [ 2345 ]
1105 : {
1106 0 : eAkt = EXC_STATE_SHEET;
1107 0 : OUString sName;
1108 0 : GetDoc().GetName( GetCurrScTab(), sName );
1109 0 : if ( !bSheetHasCodeName )
1110 : {
1111 0 : nTabsWithNoCodeName.push_back( GetCurrScTab() );
1112 : OSL_TRACE("No Codename for %d", GetCurrScTab() );
1113 : }
1114 : else
1115 : {
1116 0 : OUString sCodeName;
1117 0 : GetDoc().GetCodeName( GetCurrScTab(), sCodeName );
1118 : OSL_TRACE("Have CodeName %s for SheetName %s",
1119 : OUStringToOString( sCodeName, RTL_TEXTENCODING_UTF8 ).getStr(), OUStringToOString( sName, RTL_TEXTENCODING_UTF8 ).getStr() );
1120 0 : aCodeNames.push_back( sCodeName );
1121 : }
1122 :
1123 0 : bSheetHasCodeName = false; // reset
1124 :
1125 0 : aIn.SeekGlobalPosition(); // und zurueck an alte Position
1126 0 : break;
1127 : }
1128 0 : case 0x12: SheetProtect(); break;
1129 0 : case 0x13: SheetPassword(); break;
1130 0 : case 0x42: Codepage(); break; // CODEPAGE [ 2345 ]
1131 0 : case 0x55: DefColWidth(); break;
1132 0 : case 0x7D: Colinfo(); break; // COLINFO [ 345 ]
1133 0 : case 0x81: Wsbool(); break; // WSBOOL [ 2345 ]
1134 0 : case 0x8C: Country(); break; // COUNTRY [ 345 ]
1135 0 : case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45 ]
1136 0 : case 0x9B: FilterMode(); break; // FILTERMODE
1137 0 : case EXC_ID_AUTOFILTERINFO: AutoFilterInfo(); break;// AUTOFILTERINFO
1138 0 : case EXC_ID_AUTOFILTER: AutoFilter(); break; // AUTOFILTER
1139 0 : case 0x0208: Row34(); break; // ROW [ 34 ]
1140 : case EXC_ID2_ARRAY:
1141 0 : case EXC_ID3_ARRAY: Array34(); break; // ARRAY [ 34 ]
1142 0 : case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345 ]
1143 0 : case 0x0867: FeatHdr(); break; // FEATHDR
1144 0 : case 0x0868: Feat(); break; // FEAT
1145 : }
1146 : }
1147 0 : break;
1148 :
1149 :
1150 : // worksheet
1151 : case EXC_STATE_SHEET:
1152 : {
1153 0 : switch( nRecId )
1154 : {
1155 : // skip unknown substreams
1156 : case EXC_ID2_BOF:
1157 : case EXC_ID3_BOF:
1158 : case EXC_ID4_BOF:
1159 0 : case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break;
1160 :
1161 0 : case EXC_ID_EOF: Eof(); eAkt = EXC_STATE_BEFORE_SHEET; break;
1162 :
1163 : case EXC_ID2_BLANK:
1164 0 : case EXC_ID3_BLANK: ReadBlank(); break;
1165 0 : case EXC_ID2_INTEGER: ReadInteger(); break;
1166 : case EXC_ID2_NUMBER:
1167 0 : case EXC_ID3_NUMBER: ReadNumber(); break;
1168 : case EXC_ID2_LABEL:
1169 0 : case EXC_ID3_LABEL: ReadLabel(); break;
1170 : case EXC_ID2_BOOLERR:
1171 0 : case EXC_ID3_BOOLERR: ReadBoolErr(); break;
1172 0 : case EXC_ID_RK: ReadRk(); break;
1173 :
1174 : case EXC_ID2_FORMULA:
1175 : case EXC_ID3_FORMULA:
1176 0 : case EXC_ID4_FORMULA: Formula25(); break;
1177 0 : case EXC_ID_SHRFMLA: Shrfmla(); break;
1178 0 : case 0x000C: Calccount(); break; // CALCCOUNT
1179 0 : case 0x0010: Delta(); break; // DELTA
1180 0 : case 0x0011: Iteration(); break; // ITERATION
1181 : case 0x007E:
1182 0 : case 0x00AE: Scenman(); break; // SCENMAN
1183 0 : case 0x00AF: Scenario(); break; // SCENARIO
1184 0 : case 0x00BD: Mulrk(); break; // MULRK [ 5 ]
1185 0 : case 0x00BE: Mulblank(); break; // MULBLANK [ 5 ]
1186 0 : case 0x00D6: Rstring(); break; // RSTRING [ 5 ]
1187 0 : case 0x00E5: Cellmerging(); break; // CELLMERGING
1188 0 : case 0x00FD: Labelsst(); break; // LABELSST [ 8 ]
1189 0 : case 0x0236: TableOp(); break; // TABLE
1190 :
1191 : case EXC_ID_HORPAGEBREAKS:
1192 0 : case EXC_ID_VERPAGEBREAKS: rPageSett.ReadPageBreaks( maStrm ); break;
1193 : case EXC_ID_HEADER:
1194 0 : case EXC_ID_FOOTER: rPageSett.ReadHeaderFooter( maStrm ); break;
1195 : case EXC_ID_LEFTMARGIN:
1196 : case EXC_ID_RIGHTMARGIN:
1197 : case EXC_ID_TOPMARGIN:
1198 0 : case EXC_ID_BOTTOMMARGIN: rPageSett.ReadMargin( maStrm ); break;
1199 0 : case EXC_ID_PRINTHEADERS: rPageSett.ReadPrintHeaders( maStrm ); break;
1200 0 : case EXC_ID_PRINTGRIDLINES: rPageSett.ReadPrintGridLines( maStrm ); break;
1201 : case EXC_ID_HCENTER:
1202 0 : case EXC_ID_VCENTER: rPageSett.ReadCenter( maStrm ); break;
1203 0 : case EXC_ID_SETUP: rPageSett.ReadSetup( maStrm ); break;
1204 0 : case EXC_ID8_IMGDATA: rPageSett.ReadImgData( maStrm ); break;
1205 :
1206 0 : case EXC_ID_MSODRAWING: GetCurrSheetDrawing().ReadMsoDrawing( maStrm ); break;
1207 : // #i61786# weird documents: OBJ without MSODRAWING -> read in BIFF5 format
1208 0 : case EXC_ID_OBJ: GetCurrSheetDrawing().ReadObj( maStrm ); break;
1209 0 : case EXC_ID_NOTE: GetCurrSheetDrawing().ReadNote( maStrm ); break;
1210 :
1211 0 : case EXC_ID_HLINK: XclImpHyperlink::ReadHlink( maStrm ); break;
1212 0 : case EXC_ID_LABELRANGES: XclImpLabelranges::ReadLabelranges( maStrm ); break;
1213 :
1214 0 : case EXC_ID_CONDFMT: rCondFmtMgr.ReadCondfmt( maStrm ); break;
1215 0 : case EXC_ID_CF: rCondFmtMgr.ReadCF( maStrm ); break;
1216 :
1217 0 : case EXC_ID_DVAL: rValidMgr.ReadDval( maStrm ); break;
1218 0 : case EXC_ID_DV: rValidMgr.ReadDV( maStrm ); break;
1219 :
1220 0 : case EXC_ID_QSI: rWQBfr.ReadQsi( maStrm ); break;
1221 0 : case EXC_ID_WQSTRING: rWQBfr.ReadWqstring( maStrm ); break;
1222 0 : case EXC_ID_PQRY: rWQBfr.ReadParamqry( maStrm ); break;
1223 0 : case EXC_ID_WQSETT: rWQBfr.ReadWqsettings( maStrm ); break;
1224 0 : case EXC_ID_WQTABLES: rWQBfr.ReadWqtables( maStrm ); break;
1225 :
1226 0 : case EXC_ID_SXVIEW: rPTableMgr.ReadSxview( maStrm ); break;
1227 0 : case EXC_ID_SXVD: rPTableMgr.ReadSxvd( maStrm ); break;
1228 0 : case EXC_ID_SXVI: rPTableMgr.ReadSxvi( maStrm ); break;
1229 0 : case EXC_ID_SXIVD: rPTableMgr.ReadSxivd( maStrm ); break;
1230 0 : case EXC_ID_SXPI: rPTableMgr.ReadSxpi( maStrm ); break;
1231 0 : case EXC_ID_SXDI: rPTableMgr.ReadSxdi( maStrm ); break;
1232 0 : case EXC_ID_SXVDEX: rPTableMgr.ReadSxvdex( maStrm ); break;
1233 0 : case EXC_ID_SXEX: rPTableMgr.ReadSxex( maStrm ); break;
1234 0 : case EXC_ID_SHEETEXT: rTabViewSett.ReadTabBgColor( maStrm, rPal ); break;
1235 0 : case EXC_ID_SXVIEWEX9: rPTableMgr.ReadSxViewEx9( maStrm ); break;
1236 : }
1237 : }
1238 0 : break;
1239 :
1240 :
1241 : default:;
1242 : }
1243 : }
1244 :
1245 0 : if( eLastErr == eERR_OK )
1246 : {
1247 : // In some strange circumstances a the codename might be missing
1248 : // # Create any missing Sheet CodeNames
1249 0 : std::vector < SCTAB >::iterator it_end = nTabsWithNoCodeName.end();
1250 0 : for ( std::vector < SCTAB >::iterator it = nTabsWithNoCodeName.begin(); it != it_end; ++it )
1251 : {
1252 0 : SCTAB nTab = 1;
1253 : OSL_TRACE("Trying to find suitable codename for %d", *it );
1254 : while ( true )
1255 : {
1256 0 : OUStringBuffer aBuf;
1257 0 : aBuf.appendAscii("Sheet");
1258 0 : aBuf.append(static_cast<sal_Int32>(nTab++));
1259 0 : OUString sTmpName = aBuf.makeStringAndClear();
1260 0 : std::vector<OUString>::iterator codeName_It = aCodeNames.begin();
1261 0 : std::vector<OUString>::iterator codeName_It_end = aCodeNames.end();
1262 : // search for codename
1263 0 : for ( ; codeName_It != codeName_It_end; ++codeName_It )
1264 : {
1265 0 : if ( *codeName_It == sTmpName )
1266 0 : break;
1267 : }
1268 :
1269 0 : if ( codeName_It == codeName_It_end ) // generated codename not found
1270 : {
1271 : OSL_TRACE("Using generated codename %s", OUStringToOString( sTmpName, RTL_TEXTENCODING_UTF8 ).getStr() );
1272 : // Set new codename
1273 0 : GetDoc().SetCodeName( *it, sTmpName );
1274 : // Record newly used codename
1275 0 : aCodeNames.push_back(sTmpName);
1276 : // Record those we have created so they can be created in
1277 : // basic
1278 0 : maAutoGeneratedCodeNames.push_back( sTmpName );
1279 0 : break;
1280 : }
1281 0 : }
1282 0 : }
1283 : // #i45843# Convert pivot tables before calculation, so they are available
1284 : // for the GETPIVOTDATA function.
1285 0 : if( GetBiff() == EXC_BIFF8 )
1286 0 : GetPivotTableManager().ConvertPivotTables();
1287 :
1288 0 : ScDocumentImport& rDoc = GetDocImport();
1289 0 : rDoc.finalize();
1290 0 : pProgress.reset();
1291 : #if 0
1292 : // Excel documents look much better without this call; better in the
1293 : // sense that the row heights are identical to the original heights in
1294 : // Excel.
1295 : if (pD->IsAdjustHeightEnabled())
1296 : AdjustRowHeight();
1297 : #endif
1298 0 : PostDocLoad();
1299 :
1300 0 : pD->CalcAfterLoad();
1301 :
1302 : // import change tracking data
1303 0 : XclImpChangeTrack aImpChTr( GetRoot(), maStrm );
1304 0 : aImpChTr.Apply();
1305 :
1306 0 : const XclImpAddressConverter& rAddrConv = GetAddressConverter();
1307 0 : if( rAddrConv.IsTabTruncated() )
1308 0 : eLastErr = SCWARN_IMPORT_SHEET_OVERFLOW;
1309 0 : else if( bTabTruncated || rAddrConv.IsRowTruncated() )
1310 0 : eLastErr = SCWARN_IMPORT_ROW_OVERFLOW;
1311 0 : else if( rAddrConv.IsColTruncated() )
1312 0 : eLastErr = SCWARN_IMPORT_COLUMN_OVERFLOW;
1313 :
1314 0 : if( GetBiff() == EXC_BIFF8 )
1315 0 : GetPivotTableManager().MaybeRefreshPivotTables();
1316 : }
1317 :
1318 0 : return eLastErr;
1319 0 : }
1320 :
1321 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|