update ooo310-m15
[ooovba.git] / sc / source / filter / excel / read.cxx
blobf8f76a566c72f9a0415568adbe0ecedb5f402c24
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: read.cxx,v $
10 * $Revision: 1.70.88.4 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sc.hxx"
36 //------------------------------------------------------------------------
38 #include <stdlib.h>
39 #include <stdio.h>
41 #include "document.hxx"
42 #include "scerrors.hxx"
43 #include "fprogressbar.hxx"
44 #include "xltracer.hxx"
45 #include "xltable.hxx"
46 #include "xihelper.hxx"
47 #include "xipage.hxx"
48 #include "xiview.hxx"
49 #include "xilink.hxx"
50 #include "xiname.hxx"
51 #include "xicontent.hxx"
52 #include "xiescher.hxx"
53 #include "xipivot.hxx"
54 #include "XclImpChangeTrack.hxx"
56 #include "root.hxx"
57 #include "biffdump.hxx"
58 #include "imp_op.hxx"
59 #include "excimp8.hxx"
61 FltError ImportExcel::Read( void )
63 #if EXC_INCL_DUMPER
65 Biff8RecDumper aDumper( GetRoot(), FALSE );
66 if( aDumper.Dump( aIn ) )
67 return ERRCODE_ABORT;
69 #endif
71 XclImpPageSettings& rPageSett = GetPageSettings();
72 XclImpTabViewSettings& rTabViewSett = GetTabViewSettings();
73 XclImpPalette& rPal = GetPalette();
74 XclImpFontBuffer& rFontBfr = GetFontBuffer();
75 XclImpNumFmtBuffer& rNumFmtBfr = GetNumFmtBuffer();
76 XclImpXFBuffer& rXFBfr = GetXFBuffer();
77 XclImpNameManager& rNameMgr = GetNameManager();
78 XclImpObjectManager& rObjMgr = GetObjectManager();
80 enum Zustand {
81 Z_BiffNull, // Nicht in gueltigem Biff-Format
82 Z_Biff2, // Biff2: nur eine Tabelle
84 Z_Biff3, // Biff3: nur eine Tabelle
86 Z_Biff4, // Biff4: nur eine Tabelle
87 Z_Biff4W, // Biff4 Workbook: Globals
88 Z_Biff4T, // Biff4 Workbook: eine Tabelle selbst
89 Z_Biff4E, // Biff4 Workbook: zwischen den Tabellen
91 Z_Biff5WPre,// Biff5: Prefetch Workbook
92 Z_Biff5W, // Biff5: Globals
93 Z_Biff5TPre,// Biff5: Prefetch fuer Shrfmla/Array Formula
94 Z_Biff5T, // Biff5: eine Tabelle selbst
95 Z_Biff5E, // Biff5: zwischen den Tabellen
96 Z_Biffn0, // Alle Biffs: Tabelle bis naechstesss EOF ueberlesen
97 Z_Ende };
99 Zustand eAkt = Z_BiffNull, ePrev = Z_BiffNull;
101 FltError eLastErr = eERR_OK;
102 UINT16 nOpcode;
103 UINT16 nBofLevel = 0;
104 BOOL bBiff4Workbook = FALSE;
106 DBG_ASSERT( &aIn != NULL, "-ImportExcel::Read(): Kein Stream - wie dass?!" );
108 ::std::auto_ptr< ScfSimpleProgressBar > pProgress( new ScfSimpleProgressBar(
109 aIn.GetSvStreamSize(), GetDocShell(), STR_LOAD_DOC ) );
111 while( eAkt != Z_Ende )
113 aIn.StartNextRecord();
114 nOpcode = aIn.GetRecId();
116 if( !aIn.IsValid() )
118 // #124240# finalize table if EOF is missing
119 switch( eAkt )
121 case Z_Biff2:
122 case Z_Biff3:
123 case Z_Biff4:
124 case Z_Biff4T:
125 case Z_Biff5TPre:
126 case Z_Biff5T:
127 rNumFmtBfr.CreateScFormats();
128 Eof();
129 break;
130 default:;
132 eAkt = Z_Ende;
133 break;
136 if( eAkt != Z_Biff5TPre && eAkt != Z_Biff5WPre )
137 pProgress->ProgressAbs( aIn.GetSvStreamPos() );
139 switch( eAkt )
141 // ----------------------------------------------------------------
142 case Z_BiffNull: // ------------------------------- Z_BiffNull -
144 switch( nOpcode )
146 case EXC_ID2_BOF:
147 case EXC_ID3_BOF:
148 case EXC_ID4_BOF:
149 case EXC_ID5_BOF:
151 // #i23425# don't rely on the record ID, but on the detected BIFF version
152 switch( GetBiff() )
154 case EXC_BIFF2:
155 Bof2();
156 if( pExcRoot->eDateiTyp == Biff2 )
158 eAkt = Z_Biff2;
159 NeueTabelle();
161 break;
162 case EXC_BIFF3:
163 Bof3();
164 if( pExcRoot->eDateiTyp == Biff3 )
166 eAkt = Z_Biff3;
167 NeueTabelle();
169 break;
170 case EXC_BIFF4:
171 Bof4();
172 if( pExcRoot->eDateiTyp == Biff4 )
174 eAkt = Z_Biff4;
175 NeueTabelle();
177 else if( pExcRoot->eDateiTyp == Biff4W )
179 eAkt = Z_Biff4W;
180 bBiff4Workbook = TRUE;
182 break;
183 case EXC_BIFF5:
184 Bof5();
185 if( pExcRoot->eDateiTyp == Biff5W )
187 eAkt = Z_Biff5WPre;
189 nBdshtTab = 0;
191 aIn.StoreGlobalPosition(); // und Position merken
193 else if( pExcRoot->eDateiTyp == Biff5 )
195 // #i62752# possible to have BIFF5 sheet without globals
196 NeueTabelle();
197 eAkt = Z_Biff5TPre; // Shrfmla Prefetch, Row-Prefetch
198 nBofLevel = 0;
199 aIn.StoreGlobalPosition(); // und Position merken
201 break;
202 default:
203 DBG_ERROR_BIFF();
206 break;
209 break;
210 // ----------------------------------------------------------------
211 case Z_Biff2: // ---------------------------------- Z_Biff2 -
213 switch( nOpcode )
215 case EXC_ID2_DIMENSIONS:
216 case EXC_ID3_DIMENSIONS: ReadDimensions(); break;
217 case EXC_ID2_BLANK:
218 case EXC_ID3_BLANK: ReadBlank(); break;
219 case EXC_ID2_INTEGER: ReadInteger(); break;
220 case EXC_ID2_NUMBER:
221 case EXC_ID3_NUMBER: ReadNumber(); break;
222 case EXC_ID2_LABEL:
223 case EXC_ID3_LABEL: ReadLabel(); break;
224 case EXC_ID2_BOOLERR:
225 case EXC_ID3_BOOLERR: ReadBoolErr(); break;
226 case EXC_ID_RK: ReadRk(); break;
228 case 0x06: Formula25(); break; // FORMULA [ 2 5]
229 case 0x08: Row25(); break; // ROW [ 2 5]
230 case 0x0A: // EOF [ 2345]
231 rNumFmtBfr.CreateScFormats();
232 Eof();
233 eAkt = Z_Ende;
234 break;
235 case 0x14:
236 case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break;
237 case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345]
238 case 0x18: rNameMgr.ReadName( maStrm ); break;
239 case 0x1C: rObjMgr.ReadNote( maStrm ); break;
240 case 0x1D: rTabViewSett.ReadSelection( maStrm ); break;
241 case 0x1E: rNumFmtBfr.ReadFormat( maStrm ); break;
242 case 0x20: Columndefault(); break; // COLUMNDEFAULT[ 2 ]
243 case 0x21: Array25(); break; // ARRAY [ 2 5]
244 case 0x23: Externname25(); break; // EXTERNNAME [ 2 5]
245 case 0x24: Colwidth(); break; // COLWIDTH [ 2 ]
246 case 0x25: Defrowheight2(); break; // DEFAULTROWHEI[ 2 ]
247 case 0x26:
248 case 0x27:
249 case 0x28:
250 case 0x29: rPageSett.ReadMargin( maStrm ); break;
251 case 0x2A: rPageSett.ReadPrintHeaders( maStrm ); break;
252 case 0x2B: rPageSett.ReadPrintGridLines( maStrm ); break;
253 case 0x2F: // FILEPASS [ 2345]
254 eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
255 if( eLastErr != ERRCODE_NONE )
256 eAkt = Z_Ende;
257 break;
258 case EXC_ID2_FONT: rFontBfr.ReadFont( maStrm ); break;
259 case EXC_ID_EFONT: rFontBfr.ReadEfont( maStrm ); break;
260 case 0x3E: rTabViewSett.ReadWindow2( maStrm, false );break;
261 case 0x41: rTabViewSett.ReadPane( maStrm ); break;
262 case 0x42: Codepage(); break; // CODEPAGE [ 2345]
263 case 0x43: rXFBfr.ReadXF( maStrm ); break;
264 case 0x44: Ixfe(); break; // IXFE [ 2 ]
267 break;
268 // ----------------------------------------------------------------
269 case Z_Biff3: // ---------------------------------- Z_Biff3 -
271 switch( nOpcode )
273 // skip chart substream
274 case EXC_ID2_BOF:
275 case EXC_ID3_BOF:
276 case EXC_ID4_BOF:
277 case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break;
279 case EXC_ID2_DIMENSIONS:
280 case EXC_ID3_DIMENSIONS: ReadDimensions(); break;
281 case EXC_ID2_BLANK:
282 case EXC_ID3_BLANK: ReadBlank(); break;
283 case EXC_ID2_INTEGER: ReadInteger(); break;
284 case EXC_ID2_NUMBER:
285 case EXC_ID3_NUMBER: ReadNumber(); break;
286 case EXC_ID2_LABEL:
287 case EXC_ID3_LABEL: ReadLabel(); break;
288 case EXC_ID2_BOOLERR:
289 case EXC_ID3_BOOLERR: ReadBoolErr(); break;
290 case EXC_ID_RK: ReadRk(); break;
292 case 0x0A: // EOF [ 2345]
293 rNumFmtBfr.CreateScFormats();
294 Eof();
295 eAkt = Z_Ende;
296 break;
297 case 0x14:
298 case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break;
299 case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345]
300 case 0x1A:
301 case 0x1B: rPageSett.ReadPageBreaks( maStrm ); break;
302 case 0x1C: rObjMgr.ReadNote( maStrm ); break;
303 case 0x1D: rTabViewSett.ReadSelection( maStrm ); break;
304 case 0x1E: rNumFmtBfr.ReadFormat( maStrm ); break;
305 case 0x22: Rec1904(); break; // 1904 [ 2345]
306 case 0x26:
307 case 0x27:
308 case 0x28:
309 case 0x29: rPageSett.ReadMargin( maStrm ); break;
310 case 0x2A: rPageSett.ReadPrintHeaders( maStrm ); break;
311 case 0x2B: rPageSett.ReadPrintGridLines( maStrm ); break;
312 case 0x2F: // FILEPASS [ 2345]
313 eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
314 if( eLastErr != ERRCODE_NONE )
315 eAkt = Z_Ende;
316 break;
317 case 0x41: rTabViewSett.ReadPane( maStrm ); break;
318 case 0x42: Codepage(); break; // CODEPAGE [ 2345]
319 case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ]
320 case 0x5D: rObjMgr.ReadObj( maStrm ); break;
321 case 0x7D: Colinfo(); break; // COLINFO [ 345]
322 case 0x8C: Country(); break; // COUNTRY [ 345]
323 case 0x92: rPal.ReadPalette( maStrm ); break;
324 case 0x0206: Formula3(); break; // FORMULA [ 3 ]
325 case 0x0208: Row34(); break; // ROW [ 34 ]
326 case 0x0218: rNameMgr.ReadName( maStrm ); break;
327 case 0x0221: Array34(); break; // ARRAY [ 34 ]
328 case 0x0223: Externname34(); break; // EXTERNNAME [ 34 ]
329 case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345]
330 case 0x0231: rFontBfr.ReadFont( maStrm ); break;
331 case 0x023E: rTabViewSett.ReadWindow2( maStrm, false );break;
332 case 0x0243: rXFBfr.ReadXF( maStrm ); break;
333 case 0x0293: rXFBfr.ReadStyle( maStrm ); break;
336 break;
337 // ----------------------------------------------------------------
338 case Z_Biff4: // ---------------------------------- Z_Biff4 -
340 switch( nOpcode )
342 // skip chart substream
343 case EXC_ID2_BOF:
344 case EXC_ID3_BOF:
345 case EXC_ID4_BOF:
346 case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break;
348 case EXC_ID2_DIMENSIONS:
349 case EXC_ID3_DIMENSIONS: ReadDimensions(); break;
350 case EXC_ID2_BLANK:
351 case EXC_ID3_BLANK: ReadBlank(); break;
352 case EXC_ID2_INTEGER: ReadInteger(); break;
353 case EXC_ID2_NUMBER:
354 case EXC_ID3_NUMBER: ReadNumber(); break;
355 case EXC_ID2_LABEL:
356 case EXC_ID3_LABEL: ReadLabel(); break;
357 case EXC_ID2_BOOLERR:
358 case EXC_ID3_BOOLERR: ReadBoolErr(); break;
359 case EXC_ID_RK: ReadRk(); break;
361 case 0x0A: // EOF [ 2345]
362 rNumFmtBfr.CreateScFormats();
363 Eof();
364 eAkt = Z_Ende;
365 break;
366 case 0x12: SheetProtect(); break; // SHEET PROTECTION
367 case 0x14:
368 case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break;
369 case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345]
370 case 0x1A:
371 case 0x1B: rPageSett.ReadPageBreaks( maStrm ); break;
372 case 0x1C: rObjMgr.ReadNote( maStrm ); break;
373 case 0x1D: rTabViewSett.ReadSelection( maStrm ); break;
374 case 0x22: Rec1904(); break; // 1904 [ 2345]
375 case 0x26:
376 case 0x27:
377 case 0x28:
378 case 0x29: rPageSett.ReadMargin( maStrm ); break;
379 case 0x2A: rPageSett.ReadPrintHeaders( maStrm ); break;
380 case 0x2B: rPageSett.ReadPrintGridLines( maStrm ); break;
381 case 0x2F: // FILEPASS [ 2345]
382 eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
383 if( eLastErr != ERRCODE_NONE )
384 eAkt = Z_Ende;
385 break;
386 case 0x41: rTabViewSett.ReadPane( maStrm ); break;
387 case 0x42: Codepage(); break; // CODEPAGE [ 2345]
388 case 0x55: DefColWidth(); break;
389 case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ]
390 case 0x5D: rObjMgr.ReadObj( maStrm ); break;
391 case 0x7D: Colinfo(); break; // COLINFO [ 345]
392 case 0x8C: Country(); break; // COUNTRY [ 345]
393 case 0x92: rPal.ReadPalette( maStrm ); break;
394 case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45]
395 case 0xA1: rPageSett.ReadSetup( maStrm ); break;
396 case 0x0208: Row34(); break; // ROW [ 34 ]
397 case 0x0218: rNameMgr.ReadName( maStrm ); break;
398 case 0x0221: Array34(); break; // ARRAY [ 34 ]
399 case 0x0223: Externname34(); break; // EXTERNNAME [ 34 ]
400 case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345]
401 case 0x0231: rFontBfr.ReadFont( maStrm ); break;
402 case 0x023E: rTabViewSett.ReadWindow2( maStrm, false );break;
403 case 0x0406: Formula4(); break; // FORMULA [ 4 ]
404 case 0x041E: rNumFmtBfr.ReadFormat( maStrm ); break;
405 case 0x0443: rXFBfr.ReadXF( maStrm ); break;
406 case 0x0293: rXFBfr.ReadStyle( maStrm ); break;
409 break;
410 // ----------------------------------------------------------------
411 case Z_Biff4W: // --------------------------------- Z_Biff4W -
413 switch( nOpcode )
415 case 0x0A: // EOF [ 2345]
416 eAkt = Z_Ende;
417 break;
418 case 0x12: DocProtect(); break; // PROTECT [ 5]
419 case 0x2F: // FILEPASS [ 2345]
420 eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
421 if( eLastErr != ERRCODE_NONE )
422 eAkt = Z_Ende;
423 break;
424 case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345]
425 case 0x42: Codepage(); break; // CODEPAGE [ 2345]
426 case 0x55: DefColWidth(); break;
427 case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ]
428 case 0x8C: Country(); break; // COUNTRY [ 345]
429 case 0x8F: Bundleheader(); break; // BUNDLEHEADER [ 4 ]
430 case 0x92: rPal.ReadPalette( maStrm ); break;
431 case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45]
432 case 0x0218: rNameMgr.ReadName( maStrm ); break;
433 case 0x0223: Externname34(); break; // EXTERNNAME [ 34 ]
434 case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345]
435 case 0x0231: rFontBfr.ReadFont( maStrm ); break;
436 case 0x0409: // BOF [ 4 ]
437 Bof4();
438 if( pExcRoot->eDateiTyp == Biff4 )
440 eAkt = Z_Biff4T;
441 NeueTabelle();
443 else
444 eAkt = Z_Ende;
445 break;
446 case 0x041E: rNumFmtBfr.ReadFormat( maStrm ); break;
447 case 0x0443: rXFBfr.ReadXF( maStrm ); break;
448 case 0x0293: rXFBfr.ReadStyle( maStrm ); break;
452 break;
453 // ----------------------------------------------------------------
454 case Z_Biff4T: // --------------------------------- Z_Biff4T -
456 switch( nOpcode )
458 // skip chart substream
459 case EXC_ID2_BOF:
460 case EXC_ID3_BOF:
461 case EXC_ID4_BOF:
462 case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break;
464 case EXC_ID2_DIMENSIONS:
465 case EXC_ID3_DIMENSIONS: ReadDimensions(); break;
466 case EXC_ID2_BLANK:
467 case EXC_ID3_BLANK: ReadBlank(); break;
468 case EXC_ID2_INTEGER: ReadInteger(); break;
469 case EXC_ID2_NUMBER:
470 case EXC_ID3_NUMBER: ReadNumber(); break;
471 case EXC_ID2_LABEL:
472 case EXC_ID3_LABEL: ReadLabel(); break;
473 case EXC_ID2_BOOLERR:
474 case EXC_ID3_BOOLERR: ReadBoolErr(); break;
475 case EXC_ID_RK: ReadRk(); break;
477 case 0x0A: // EOF [ 2345]
478 Eof();
479 eAkt = Z_Biff4E;
480 break;
481 case 0x12: SheetProtect(); break; // SHEET PROTECTION
482 case 0x14:
483 case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break;
484 case 0x1A:
485 case 0x1B: rPageSett.ReadPageBreaks( maStrm ); break;
486 case 0x1C: rObjMgr.ReadNote( maStrm ); break;
487 case 0x1D: rTabViewSett.ReadSelection( maStrm ); break;
488 case 0x2F: // FILEPASS [ 2345]
489 eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
490 if( eLastErr != ERRCODE_NONE )
491 eAkt = Z_Ende;
492 break;
493 case 0x41: rTabViewSett.ReadPane( maStrm ); break;
494 case 0x42: Codepage(); break; // CODEPAGE [ 2345]
495 case 0x55: DefColWidth(); break;
496 case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ]
497 case 0x5D: rObjMgr.ReadObj( maStrm ); break;
498 case 0x7D: Colinfo(); break; // COLINFO [ 345]
499 case 0x8C: Country(); break; // COUNTRY [ 345]
500 case 0x8F: Bundleheader(); break; // BUNDLEHEADER [ 4 ]
501 case 0x92: rPal.ReadPalette( maStrm ); break;
502 case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45]
503 case 0xA1: rPageSett.ReadSetup( maStrm ); break;
504 case 0x0208: Row34(); break; // ROW [ 34 ]
505 case 0x0218: rNameMgr.ReadName( maStrm ); break;
506 case 0x0221: Array34(); break;
507 case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345]
508 case 0x0231: rFontBfr.ReadFont( maStrm ); break;
509 case 0x023E: rTabViewSett.ReadWindow2( maStrm, false );break;
510 case 0x0406: Formula4(); break;
511 case 0x041E: rNumFmtBfr.ReadFormat( maStrm ); break;
512 case 0x0443: rXFBfr.ReadXF( maStrm ); break;
513 case 0x0293: rXFBfr.ReadStyle( maStrm ); break;
517 break;
518 // ----------------------------------------------------------------
519 case Z_Biff4E: // --------------------------------- Z_Biff4E -
521 switch( nOpcode )
523 case 0x0A: // EOF [ 2345]
524 eAkt = Z_Ende;
525 break;
526 case 0x8F: break; // BUNDLEHEADER [ 4 ]
527 case 0x0409: // BOF [ 4 ]
528 Bof4();
529 NeueTabelle();
530 if( pExcRoot->eDateiTyp == Biff4 )
532 eAkt = Z_Biff4T;
534 else
536 ePrev = eAkt;
537 eAkt = Z_Biffn0;
539 break;
543 break;
544 case Z_Biff5WPre: // ------------------------------ Z_Biff5WPre -
546 switch( nOpcode )
548 case 0x0A: // EOF [ 2345]
549 eAkt = Z_Biff5W;
550 aIn.SeekGlobalPosition(); // und zurueck an alte Position
551 break;
552 case 0x12: DocProtect(); break; // PROTECT [ 5]
553 case 0x2F: // FILEPASS [ 2345]
554 eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
555 if( eLastErr != ERRCODE_NONE )
556 eAkt = Z_Ende;
557 break;
558 case 0x3D: Window1(); break;
559 case 0x42: Codepage(); break; // CODEPAGE [ 2345]
560 case 0x85: Boundsheet(); break; // BOUNDSHEET [ 5]
561 case 0x8C: Country(); break; // COUNTRY [ 345]
562 // PALETTE follows XFs, but already needed while reading the XFs
563 case 0x92: rPal.ReadPalette( maStrm ); break;
566 break;
567 case Z_Biff5W: // --------------------------------- Z_Biff5W -
569 switch( nOpcode )
571 case 0x0A: // EOF [ 2345]
572 rNumFmtBfr.CreateScFormats();
573 rXFBfr.CreateUserStyles();
574 eAkt = Z_Biff5E;
575 break;
576 case 0x18: rNameMgr.ReadName( maStrm ); break;
577 case 0x1E: rNumFmtBfr.ReadFormat( maStrm ); break;
578 case 0x22: Rec1904(); break; // 1904 [ 2345]
579 case 0x31: rFontBfr.ReadFont( maStrm ); break;
580 case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ]
581 case 0x8D: Hideobj(); break; // HIDEOBJ [ 345]
582 case 0xDE: Olesize(); break;
583 case 0xE0: rXFBfr.ReadXF( maStrm ); break;
584 case 0x0293: rXFBfr.ReadStyle( maStrm ); break;
585 case 0x041E: rNumFmtBfr.ReadFormat( maStrm ); break;
589 break;
590 // ----------------------------------------------------------------
591 case Z_Biff5TPre: // ------------------------------- Z_Biff5Pre -
593 if( nOpcode == 0x0809 )
594 nBofLevel++;
595 else if( (nOpcode == 0x000A) && nBofLevel )
596 nBofLevel--;
597 else if( !nBofLevel ) // don't read chart records
599 switch( nOpcode )
601 case EXC_ID2_DIMENSIONS:
602 case EXC_ID3_DIMENSIONS: ReadDimensions(); break;
603 case 0x08: Row25(); break; // ROW [ 2 5]
604 case 0x0A: // EOF [ 2345]
605 eAkt = Z_Biff5T;
606 aIn.SeekGlobalPosition(); // und zurueck an alte Position
607 break;
608 case 0x12: SheetProtect(); break; // SHEET PROTECTION
609 case 0x1A:
610 case 0x1B: rPageSett.ReadPageBreaks( maStrm ); break;
611 case 0x1D: rTabViewSett.ReadSelection( maStrm ); break;
612 case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345]
613 case 0x21: Array25(); break; // ARRAY [ 2 5]
614 case 0x23: Externname25(); break; // EXTERNNAME [ 2 5]
615 case 0x41: rTabViewSett.ReadPane( maStrm ); break;
616 case 0x42: Codepage(); break; // CODEPAGE [ 2345]
617 case 0x55: DefColWidth(); break;
618 case 0x7D: Colinfo(); break; // COLINFO [ 345]
619 case 0x81: Wsbool(); break; // WSBOOL [ 2345]
620 case 0x8C: Country(); break; // COUNTRY [ 345]
621 case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45]
622 case 0x0208: Row34(); break; // ROW [ 34 ]
623 case 0x0221: Array34(); break; // ARRAY [ 34 ]
624 case 0x0223: Externname34(); break; // EXTERNNAME [ 34 ]
625 case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345]
626 case 0x023E: rTabViewSett.ReadWindow2( maStrm, false );break;
627 case 0x04BC: Shrfmla(); break; // SHRFMLA [ 5]
631 break;
632 // ----------------------------------------------------------------
633 case Z_Biff5T: // --------------------------------- Z_Biff5T -
635 switch( nOpcode )
637 case EXC_ID2_BLANK:
638 case EXC_ID3_BLANK: ReadBlank(); break;
639 case EXC_ID2_INTEGER: ReadInteger(); break;
640 case EXC_ID2_NUMBER:
641 case EXC_ID3_NUMBER: ReadNumber(); break;
642 case EXC_ID2_LABEL:
643 case EXC_ID3_LABEL: ReadLabel(); break;
644 case EXC_ID2_BOOLERR:
645 case EXC_ID3_BOOLERR: ReadBoolErr(); break;
646 case EXC_ID_RK: ReadRk(); break;
648 case 0x0006:
649 case 0x0206:
650 case 0x0406: Formula25(); break;
651 case 0x0A: Eof(); eAkt = Z_Biff5E; break;
652 case 0x14:
653 case 0x15: rPageSett.ReadHeaderFooter( maStrm ); break;
654 case 0x17: Externsheet(); break; // EXTERNSHEET [ 2345]
655 case 0x1C: rObjMgr.ReadNote( maStrm ); break;
656 case 0x1D: rTabViewSett.ReadSelection( maStrm ); break;
657 case 0x23: Externname25(); break; // EXTERNNAME [ 2 5]
658 case 0x26:
659 case 0x27:
660 case 0x28:
661 case 0x29: rPageSett.ReadMargin( maStrm ); break;
662 case 0x2A: rPageSett.ReadPrintHeaders( maStrm ); break;
663 case 0x2B: rPageSett.ReadPrintGridLines( maStrm ); break;
664 case 0x2F: // FILEPASS [ 2345]
665 eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
666 if( eLastErr != ERRCODE_NONE )
667 eAkt = Z_Ende;
668 break;
669 case 0x5D: rObjMgr.ReadObj( maStrm ); break;
670 case 0x83:
671 case 0x84: rPageSett.ReadCenter( maStrm ); break;
672 case 0xA0: rTabViewSett.ReadScl( maStrm ); break;
673 case 0xA1: rPageSett.ReadSetup( maStrm ); break;
674 case 0xBD: Mulrk(); break; // MULRK [ 5]
675 case 0xBE: Mulblank(); break; // MULBLANK [ 5]
676 case 0xD6: Rstring(); break; // RSTRING [ 5]
677 case 0x00E5: Cellmerging(); break; // #i62300#
678 case 0x0236: TableOp(); break; // TABLE [ 5]
679 case 0x0809: // BOF [ 5]
680 XclTools::SkipSubStream( maStrm );
681 break;
685 break;
686 // ----------------------------------------------------------------
687 case Z_Biff5E: // --------------------------------- Z_Biff5E -
689 switch( nOpcode )
691 case 0x0809: // BOF [ 5]
692 Bof5();
693 NeueTabelle();
694 switch( pExcRoot->eDateiTyp )
696 case Biff5:
697 case Biff5M4:
698 eAkt = Z_Biff5TPre; // Shrfmla Prefetch, Row-Prefetch
699 nBofLevel = 0;
700 aIn.StoreGlobalPosition(); // und Position merken
701 break;
702 case Biff5C: // chart sheet
703 GetObjectManager().ReadTabChart( maStrm );
704 Eof();
705 GetTracer().TraceChartOnlySheet();
706 break;
707 case Biff5V:
708 default:
709 pD->SetVisible( GetCurrScTab(), FALSE );
710 ePrev = eAkt;
711 eAkt = Z_Biffn0;
713 DBG_ASSERT( pExcRoot->eDateiTyp != Biff5W,
714 "+ImportExcel::Read(): Doppel-Whopper-Workbook!" );
716 break;
720 break;
721 case Z_Biffn0: // --------------------------------- Z_Biffn0 -
723 switch( nOpcode )
725 case 0x0A: // EOF [ 2345]
726 eAkt = ePrev;
727 IncCurrScTab();
728 break;
732 break;
733 // ----------------------------------------------------------------
734 case Z_Ende: // ----------------------------------- Z_Ende -
735 DBG_ERROR( "*ImportExcel::Read(): Not possible state!" );
736 break;
737 default: DBG_ERROR( "-ImportExcel::Read(): Zustand vergessen!" );
741 if( eLastErr == eERR_OK )
743 pProgress.reset();
745 AdjustRowHeight();
746 PostDocLoad();
748 pD->CalcAfterLoad();
750 const XclImpAddressConverter& rAddrConv = GetAddressConverter();
751 if( rAddrConv.IsTabTruncated() )
752 eLastErr = SCWARN_IMPORT_SHEET_OVERFLOW;
753 else if( bTabTruncated || rAddrConv.IsRowTruncated() )
754 eLastErr = SCWARN_IMPORT_ROW_OVERFLOW;
755 else if( rAddrConv.IsColTruncated() )
756 eLastErr = SCWARN_IMPORT_COLUMN_OVERFLOW;
759 return eLastErr;
763 //___________________________________________________________________
765 FltError ImportExcel8::Read( void )
767 #if EXC_INCL_DUMPER
769 Biff8RecDumper aDumper( GetRoot(), TRUE );
770 if( aDumper.Dump( aIn ) )
771 return ERRCODE_ABORT;
773 #endif
774 // read the entire BIFF8 stream
775 // don't look too close - this stuff seriously needs to be reworked
777 XclImpPageSettings& rPageSett = GetPageSettings();
778 XclImpTabViewSettings& rTabViewSett = GetTabViewSettings();
779 XclImpPalette& rPal = GetPalette();
780 XclImpFontBuffer& rFontBfr = GetFontBuffer();
781 XclImpNumFmtBuffer& rNumFmtBfr = GetNumFmtBuffer();
782 XclImpXFBuffer& rXFBfr = GetXFBuffer();
783 XclImpSst& rSst = GetSst();
784 XclImpTabInfo& rTabInfo = GetTabInfo();
785 XclImpNameManager& rNameMgr = GetNameManager();
786 XclImpLinkManager& rLinkMgr = GetLinkManager();
787 XclImpObjectManager& rObjMgr = GetObjectManager();
788 XclImpCondFormatManager& rCondFmtMgr = GetCondFormatManager();
789 XclImpPivotTableManager& rPTableMgr = GetPivotTableManager();
790 XclImpWebQueryBuffer& rWQBfr = GetWebQueryBuffer();
792 bool bInUserView = false; // true = In USERSVIEW(BEGIN|END) record block.
794 enum XclImpReadState
796 EXC_STATE_BEFORE_GLOBALS, /// Before workbook globals (wait for initial BOF).
797 EXC_STATE_GLOBALS_PRE, /// Prefetch for workbook globals.
798 EXC_STATE_GLOBALS, /// Workbook globals.
799 EXC_STATE_BEFORE_SHEET, /// Before worksheet (wait for new worksheet BOF).
800 EXC_STATE_SHEET_PRE, /// Prefetch for worksheet.
801 EXC_STATE_SHEET, /// Worksheet.
802 EXC_STATE_END /// Stop reading.
805 XclImpReadState eAkt = EXC_STATE_BEFORE_GLOBALS;
807 FltError eLastErr = eERR_OK;
809 ::std::auto_ptr< ScfSimpleProgressBar > pProgress( new ScfSimpleProgressBar(
810 aIn.GetSvStreamSize(), GetDocShell(), STR_LOAD_DOC ) );
812 bool bSheetHasCodeName = false;
814 std::vector< String > CodeNames;
816 std::vector < SCTAB > nTabsWithNoCodeName;
818 while( eAkt != EXC_STATE_END )
820 aIn.StartNextRecord();
821 if( !aIn.IsValid() )
823 // #124240# #i63591# finalize table if EOF is missing
824 switch( eAkt )
826 case EXC_STATE_SHEET_PRE:
827 eAkt = EXC_STATE_SHEET;
828 aIn.SeekGlobalPosition();
829 continue; // next iteration in while loop
830 // break; // unxsols warning: statement unreachable
831 case EXC_STATE_SHEET:
832 Eof();
833 eAkt = EXC_STATE_END;
834 break;
835 default:
836 eAkt = EXC_STATE_END;
840 if( eAkt == EXC_STATE_END )
841 break;
843 if( eAkt != EXC_STATE_SHEET_PRE && eAkt != EXC_STATE_GLOBALS_PRE )
844 pProgress->ProgressAbs( aIn.GetSvStreamPos() );
846 sal_uInt16 nRecId = aIn.GetRecId();
848 /* #i39464# Ignore records between USERSVIEWBEGIN and USERSVIEWEND
849 completely (user specific view settings). Otherwise view settings
850 and filters are loaded multiple times, which at least causes
851 problems in auto-filters. */
852 switch( nRecId )
854 case EXC_ID_USERSVIEWBEGIN:
855 DBG_ASSERT( !bInUserView, "ImportExcel8::Read - nested user view settings" );
856 bInUserView = true;
857 break;
858 case EXC_ID_USERSVIEWEND:
859 DBG_ASSERT( bInUserView, "ImportExcel8::Read - not in user view settings" );
860 bInUserView = false;
861 break;
864 if( !bInUserView ) switch( eAkt )
866 // ----------------------------------------------------------------
867 // before workbook globals: wait for initial workbook globals BOF
868 case EXC_STATE_BEFORE_GLOBALS:
870 if( nRecId == EXC_ID5_BOF )
872 DBG_ASSERT( GetBiff() == EXC_BIFF8, "ImportExcel8::Read - wrong BIFF version" );
873 Bof5();
874 if( pExcRoot->eDateiTyp == Biff8W )
876 eAkt = EXC_STATE_GLOBALS_PRE;
877 maStrm.StoreGlobalPosition();
878 nBdshtTab = 0;
880 else if( pExcRoot->eDateiTyp == Biff8 )
882 // #i62752# possible to have BIFF8 sheet without globals
883 NeueTabelle();
884 eAkt = EXC_STATE_SHEET_PRE; // Shrfmla Prefetch, Row-Prefetch
885 bSheetHasCodeName = false; // reset
886 aIn.StoreGlobalPosition();
890 break;
892 // ----------------------------------------------------------------
893 // prefetch for workbook globals
894 case EXC_STATE_GLOBALS_PRE:
896 switch( nRecId )
898 case EXC_ID_EOF:
899 case EXC_ID_EXTSST:
900 /* #i56376# evil hack: if EOF for globals is missing,
901 simulate it. This hack works only for the bugdoc
902 given in the issue, where the sheet substreams
903 start directly after the EXTSST record. A future
904 implementation should be more robust against
905 missing EOFs. */
906 if( (nRecId == EXC_ID_EOF) ||
907 ((nRecId == EXC_ID_EXTSST) && (maStrm.GetNextRecId() == EXC_ID5_BOF)) )
909 eAkt = EXC_STATE_GLOBALS;
910 aIn.SeekGlobalPosition();
912 break;
913 case 0x12: DocProtect(); break; // PROTECT [ 5678]
914 case 0x13: DocPasssword(); break;
915 case 0x19: WinProtection(); break;
916 case 0x2F: // FILEPASS [ 2345 ]
917 eLastErr = XclImpDecryptHelper::ReadFilepass( maStrm );
918 if( eLastErr != ERRCODE_NONE )
919 eAkt = EXC_STATE_END;
920 break;
921 case 0x3D: Window1(); break;
922 case 0x42: Codepage(); break; // CODEPAGE [ 2345 ]
923 case 0x85: Boundsheet(); break; // BOUNDSHEET [ 5 ]
924 case 0x8C: Country(); break; // COUNTRY [ 345 ]
926 // PALETTE follows XFs, but already needed while reading the XFs
927 case EXC_ID_PALETTE: rPal.ReadPalette( maStrm ); break;
930 break;
932 // ----------------------------------------------------------------
933 // workbook globals
934 case EXC_STATE_GLOBALS:
936 switch( nRecId )
938 case EXC_ID_EOF:
939 case EXC_ID_EXTSST:
940 /* #i56376# evil hack: if EOF for globals is missing,
941 simulate it. This hack works only for the bugdoc
942 given in the issue, where the sheet substreams
943 start directly after the EXTSST record. A future
944 implementation should be more robust against
945 missing EOFs. */
946 if( (nRecId == EXC_ID_EOF) ||
947 ((nRecId == EXC_ID_EXTSST) && (maStrm.GetNextRecId() == EXC_ID5_BOF)) )
949 rNumFmtBfr.CreateScFormats();
950 rXFBfr.CreateUserStyles();
951 rPTableMgr.ReadPivotCaches( maStrm );
952 eAkt = EXC_STATE_BEFORE_SHEET;
954 break;
955 case 0x0E: Precision(); break; // PRECISION
956 case 0x22: Rec1904(); break; // 1904 [ 2345 ]
957 case 0x56: Builtinfmtcnt(); break; // BUILTINFMTCNT[ 34 ]
958 case 0x8D: Hideobj(); break; // HIDEOBJ [ 345 ]
959 case 0xD3: /*ReadBasic()*/bHasBasic = true; break;
960 // case 0xD3: ReadBasic(); break;
961 case 0xDE: Olesize(); break;
962 case 0x01BA: Codename( TRUE ); break;
964 case EXC_ID_USESELFS: ReadUsesElfs(); break;
966 case EXC_ID2_FONT: rFontBfr.ReadFont( maStrm ); break;
967 case EXC_ID4_FORMAT: rNumFmtBfr.ReadFormat( maStrm ); break;
968 case EXC_ID5_XF: rXFBfr.ReadXF( maStrm ); break;
969 case EXC_ID_STYLE: rXFBfr.ReadStyle( maStrm ); break;
971 case EXC_ID_SST: rSst.ReadSst( maStrm ); break;
972 case EXC_ID_TABID: rTabInfo.ReadTabid( maStrm ); break;
973 case EXC_ID_NAME: rNameMgr.ReadName( maStrm ); break;
975 case EXC_ID_EXTERNSHEET: rLinkMgr.ReadExternsheet( maStrm ); break;
976 case EXC_ID_SUPBOOK: rLinkMgr.ReadSupbook( maStrm ); break;
977 case EXC_ID_XCT: rLinkMgr.ReadXct( maStrm ); break;
978 case EXC_ID_CRN: rLinkMgr.ReadCrn( maStrm ); break;
979 case EXC_ID_EXTERNNAME: rLinkMgr.ReadExternname( maStrm, pFormConv ); break;
981 case EXC_ID_MSODRAWINGGROUP:rObjMgr.ReadMsoDrawingGroup( maStrm ); break;
983 case EXC_ID_SXIDSTM: rPTableMgr.ReadSxidstm( maStrm ); break;
984 case EXC_ID_SXVS: rPTableMgr.ReadSxvs( maStrm ); break;
985 case EXC_ID_DCONREF: rPTableMgr.ReadDconref( maStrm ); break;
989 break;
991 // ----------------------------------------------------------------
992 // before worksheet: wait for new worksheet BOF
993 case EXC_STATE_BEFORE_SHEET:
995 if( nRecId == EXC_ID5_BOF )
997 // #94191# import only 256 sheets
998 if( GetCurrScTab() > GetScMaxPos().Tab() )
1000 XclTools::SkipSubStream( maStrm );
1001 // #i29930# show warning box
1002 GetAddressConverter().CheckScTab( GetCurrScTab(), true );
1003 eAkt = EXC_STATE_END;
1005 else
1007 Bof5();
1008 NeueTabelle();
1009 switch( pExcRoot->eDateiTyp )
1011 case Biff8: // worksheet
1012 case Biff8M4: // macro sheet
1013 eAkt = EXC_STATE_SHEET_PRE; // Shrfmla Prefetch, Row-Prefetch
1014 aIn.StoreGlobalPosition();
1015 break;
1016 case Biff8C: // chart sheet
1017 rObjMgr.ReadTabChart( maStrm );
1018 Eof();
1019 GetTracer().TraceChartOnlySheet();
1020 break;
1021 case Biff8W: // workbook
1022 DBG_ERRORFILE( "ImportExcel8::Read - double workbook globals" );
1023 // run through
1024 case Biff8V: // VB module
1025 default:
1026 // TODO: do not create a sheet in the Calc document
1027 pD->SetVisible( GetCurrScTab(), FALSE );
1028 XclTools::SkipSubStream( maStrm );
1029 IncCurrScTab();
1034 break;
1036 // ----------------------------------------------------------------
1037 // prefetch for worksheet
1038 case EXC_STATE_SHEET_PRE:
1040 switch( nRecId )
1042 // skip chart substream
1043 case EXC_ID2_BOF:
1044 case EXC_ID3_BOF:
1045 case EXC_ID4_BOF:
1046 case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break;
1048 case EXC_ID_WINDOW2: rTabViewSett.ReadWindow2( maStrm, false );break;
1049 case EXC_ID_SCL: rTabViewSett.ReadScl( maStrm ); break;
1050 case EXC_ID_PANE: rTabViewSett.ReadPane( maStrm ); break;
1051 case EXC_ID_SELECTION: rTabViewSett.ReadSelection( maStrm ); break;
1053 case EXC_ID2_DIMENSIONS:
1054 case EXC_ID3_DIMENSIONS: ReadDimensions(); break;
1056 case 0x0A: // EOF [ 2345 ]
1058 eAkt = EXC_STATE_SHEET;
1059 String sName;
1060 GetDoc().GetName( GetCurrScTab(), sName );
1061 if ( !bSheetHasCodeName )
1063 nTabsWithNoCodeName.push_back( GetCurrScTab() );
1064 OSL_TRACE("No Codename for %d", GetCurrScTab() );
1066 else
1068 String sCodeName;
1069 GetDoc().GetCodeName( GetCurrScTab(), sCodeName );
1070 OSL_TRACE("Have CodeName %s for SheetName %s",
1071 rtl::OUStringToOString( sCodeName, RTL_TEXTENCODING_UTF8 ).getStr(), rtl::OUStringToOString( sName, RTL_TEXTENCODING_UTF8 ).getStr() );
1072 CodeNames.push_back( sCodeName );
1075 bSheetHasCodeName = false; // reset
1078 aIn.SeekGlobalPosition(); // und zurueck an alte Position
1079 break;
1081 case 0x12: SheetProtect(); break;
1082 case 0x13: SheetPassword(); break;
1083 case 0x42: Codepage(); break; // CODEPAGE [ 2345 ]
1084 case 0x55: DefColWidth(); break;
1085 case 0x7D: Colinfo(); break; // COLINFO [ 345 ]
1086 case 0x81: Wsbool(); break; // WSBOOL [ 2345 ]
1087 case 0x8C: Country(); break; // COUNTRY [ 345 ]
1088 case 0x99: Standardwidth(); break; // STANDARDWIDTH[ 45 ]
1089 case 0x9B: FilterMode(); break; // FILTERMODE
1090 case 0x9D: AutoFilterInfo(); break;// AUTOFILTERINFO
1091 case 0x9E: AutoFilter(); break; // AUTOFILTER
1092 case 0x01BA: Codename( FALSE ); bSheetHasCodeName = true; break;
1093 case 0x0208: Row34(); break; // ROW [ 34 ]
1094 case 0x0021:
1095 case 0x0221: Array34(); break; // ARRAY [ 34 ]
1096 case 0x0225: Defrowheight345();break;//DEFAULTROWHEI[ 345 ]
1097 case 0x04BC: Shrfmla(); break; // SHRFMLA [ 5 ]
1098 case 0x0867: SheetProtection(); break; // SHEETPROTECTION
1101 break;
1103 // ----------------------------------------------------------------
1104 // worksheet
1105 case EXC_STATE_SHEET:
1107 switch( nRecId )
1109 // skip unknown substreams
1110 case EXC_ID2_BOF:
1111 case EXC_ID3_BOF:
1112 case EXC_ID4_BOF:
1113 case EXC_ID5_BOF: XclTools::SkipSubStream( maStrm ); break;
1115 case EXC_ID_EOF: Eof(); eAkt = EXC_STATE_BEFORE_SHEET; break;
1117 case EXC_ID2_BLANK:
1118 case EXC_ID3_BLANK: ReadBlank(); break;
1119 case EXC_ID2_INTEGER: ReadInteger(); break;
1120 case EXC_ID2_NUMBER:
1121 case EXC_ID3_NUMBER: ReadNumber(); break;
1122 case EXC_ID2_LABEL:
1123 case EXC_ID3_LABEL: ReadLabel(); break;
1124 case EXC_ID2_BOOLERR:
1125 case EXC_ID3_BOOLERR: ReadBoolErr(); break;
1126 case EXC_ID_RK: ReadRk(); break;
1128 case 0x0006:
1129 case 0x0206:
1130 case 0x0406: Formula25(); break; // FORMULA [ 2 5 ]
1131 case 0x000C: Calccount(); break; // CALCCOUNT
1132 case 0x0010: Delta(); break; // DELTA
1133 case 0x0011: Iteration(); break; // ITERATION
1134 case 0x007E:
1135 case 0x00AE: Scenman(); break; // SCENMAN
1136 case 0x00AF: Scenario(); break; // SCENARIO
1137 case 0x00BD: Mulrk(); break; // MULRK [ 5 ]
1138 case 0x00BE: Mulblank(); break; // MULBLANK [ 5 ]
1139 case 0x00D6: Rstring(); break; // RSTRING [ 5 ]
1140 case 0x00E5: Cellmerging(); break; // CELLMERGING
1141 case 0x00FD: Labelsst(); break; // LABELSST [ 8 ]
1142 case 0x0236: TableOp(); break; // TABLE
1144 case EXC_ID_HORPAGEBREAKS:
1145 case EXC_ID_VERPAGEBREAKS: rPageSett.ReadPageBreaks( maStrm ); break;
1146 case EXC_ID_HEADER:
1147 case EXC_ID_FOOTER: rPageSett.ReadHeaderFooter( maStrm ); break;
1148 case EXC_ID_LEFTMARGIN:
1149 case EXC_ID_RIGHTMARGIN:
1150 case EXC_ID_TOPMARGIN:
1151 case EXC_ID_BOTTOMMARGIN: rPageSett.ReadMargin( maStrm ); break;
1152 case EXC_ID_PRINTHEADERS: rPageSett.ReadPrintHeaders( maStrm ); break;
1153 case EXC_ID_PRINTGRIDLINES: rPageSett.ReadPrintGridLines( maStrm ); break;
1154 case EXC_ID_HCENTER:
1155 case EXC_ID_VCENTER: rPageSett.ReadCenter( maStrm ); break;
1156 case EXC_ID_SETUP: rPageSett.ReadSetup( maStrm ); break;
1157 case EXC_ID8_IMGDATA: rPageSett.ReadImgData( maStrm ); break;
1159 case EXC_ID_MSODRAWING: rObjMgr.ReadMsoDrawing( maStrm ); break;
1160 // #i61786# weird documents: OBJ without MSODRAWING -> read in BIFF5 format
1161 case EXC_ID_OBJ: rObjMgr.ReadObj( maStrm ); break;
1162 case EXC_ID_NOTE: rObjMgr.ReadNote( maStrm ); break;
1164 case EXC_ID_HLINK: XclImpHyperlink::ReadHlink( maStrm ); break;
1165 case EXC_ID_LABELRANGES: XclImpLabelranges::ReadLabelranges( maStrm ); break;
1167 case EXC_ID_CONDFMT: rCondFmtMgr.ReadCondfmt( maStrm ); break;
1168 case EXC_ID_CF: rCondFmtMgr.ReadCF( maStrm ); break;
1170 case EXC_ID_DVAL: XclImpValidation::ReadDval( maStrm ); break;
1171 case EXC_ID_DV: XclImpValidation::ReadDV( maStrm ); break;
1173 case EXC_ID_QSI: rWQBfr.ReadQsi( maStrm ); break;
1174 case EXC_ID_WQSTRING: rWQBfr.ReadWqstring( maStrm ); break;
1175 case EXC_ID_PQRY: rWQBfr.ReadParamqry( maStrm ); break;
1176 case EXC_ID_WQSETT: rWQBfr.ReadWqsettings( maStrm ); break;
1177 case EXC_ID_WQTABLES: rWQBfr.ReadWqtables( maStrm ); break;
1179 case EXC_ID_SXVIEW: rPTableMgr.ReadSxview( maStrm ); break;
1180 case EXC_ID_SXVD: rPTableMgr.ReadSxvd( maStrm ); break;
1181 case EXC_ID_SXVI: rPTableMgr.ReadSxvi( maStrm ); break;
1182 case EXC_ID_SXIVD: rPTableMgr.ReadSxivd( maStrm ); break;
1183 case EXC_ID_SXPI: rPTableMgr.ReadSxpi( maStrm ); break;
1184 case EXC_ID_SXDI: rPTableMgr.ReadSxdi( maStrm ); break;
1185 case EXC_ID_SXVDEX: rPTableMgr.ReadSxvdex( maStrm ); break;
1186 case EXC_ID_SXEX: rPTableMgr.ReadSxex( maStrm ); break;
1187 case EXC_ID_SXVIEWEX9: rPTableMgr.ReadSxViewEx9( maStrm ); break;
1189 // 0x0862 (SHEETEXT)
1190 case EXC_ID_SHEETEXT: rTabViewSett.ReadTabBgColor( maStrm, rPal ); break;
1193 break;
1195 // ----------------------------------------------------------------
1196 default:;
1200 if( eLastErr == eERR_OK )
1202 // In some strange circumstances a the codename might be missing
1203 // # Create any missing Sheet CodeNames
1204 std::vector < SCTAB >::iterator it_end = nTabsWithNoCodeName.end();
1205 for ( std::vector < SCTAB >::iterator it = nTabsWithNoCodeName.begin(); it != it_end; ++it )
1207 bool bGotCodeName = false;
1208 SCTAB nTab = 1;
1209 OSL_TRACE("Trying to find suitable codename for %d", *it );
1210 while ( true )
1212 String sTmpName( RTL_CONSTASCII_USTRINGPARAM("Sheet" ) );
1213 sTmpName += String::CreateFromInt32( sal_Int32(nTab++) );
1214 std::vector< String >::iterator codeName_It = CodeNames.begin();
1215 std::vector< String >::iterator codeName_It_end = CodeNames.end();
1216 // search for codename
1217 for ( ; codeName_It != codeName_It_end; ++codeName_It )
1219 if ( *codeName_It == sTmpName )
1220 break;
1223 if ( codeName_It == codeName_It_end ) // generated codename not found
1225 OSL_TRACE("Using generated codename %s", rtl::OUStringToOString( sTmpName, RTL_TEXTENCODING_UTF8 ).getStr() );
1226 // Set new codename
1227 GetDoc().SetCodeName( *it, sTmpName );
1228 // Record newly used codename
1229 CodeNames.push_back( sTmpName );
1230 // Record those we have created so they can be created in
1231 // basic
1232 AutoGeneratedCodeNames.push_back( sTmpName );
1233 break;
1238 // #i45843# Convert pivot tables before calculation, so they are available
1239 // for the GETPIVOTDATA function.
1240 if( GetBiff() == EXC_BIFF8 )
1241 GetPivotTableManager().ConvertPivotTables();
1243 pProgress.reset();
1245 #if 0
1246 // Excel documents look much better without this call; better in the
1247 // sense that the row heights are identical to the original heights in
1248 // Excel.
1249 AdjustRowHeight();
1250 #endif
1251 PostDocLoad();
1253 pD->CalcAfterLoad();
1255 // import change tracking data
1256 XclImpChangeTrack aImpChTr( GetRoot(), maStrm );
1257 aImpChTr.Apply();
1259 const XclImpAddressConverter& rAddrConv = GetAddressConverter();
1260 if( rAddrConv.IsTabTruncated() )
1261 eLastErr = SCWARN_IMPORT_SHEET_OVERFLOW;
1262 else if( bTabTruncated || rAddrConv.IsRowTruncated() )
1263 eLastErr = SCWARN_IMPORT_ROW_OVERFLOW;
1264 else if( rAddrConv.IsColTruncated() )
1265 eLastErr = SCWARN_IMPORT_COLUMN_OVERFLOW;
1267 if( GetBiff() == EXC_BIFF8 )
1268 GetPivotTableManager().MaybeRefreshPivotTables();
1271 return eLastErr;
1274 //___________________________________________________________________