LibreOffice Module sc (master) 1
excdoc.cxx
Go to the documentation of this file.
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 <sfx2/objsh.hxx>
21#include <rtl/ustring.hxx>
22
23#include <document.hxx>
24#include <scextopt.hxx>
25#include <docoptio.hxx>
26#include <tabprotection.hxx>
27#include <postit.hxx>
28#include <root.hxx>
29
30#include <excdoc.hxx>
31#include <xeextlst.hxx>
32#include <biffhelper.hxx>
33
34#include <xcl97rec.hxx>
35#include <xetable.hxx>
36#include <xelink.hxx>
37#include <xepage.hxx>
38#include <xeview.hxx>
39#include <xecontent.hxx>
40#include <xeescher.hxx>
41#include <xepivot.hxx>
43#include <XclExpChangeTrack.hxx>
44#include <xepivotxml.hxx>
45#include <xedbdata.hxx>
46#include <xlcontent.hxx>
47#include <xlname.hxx>
48#include <xllink.hxx>
49#include <xltools.hxx>
50
51#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
52#include <com/sun/star/frame/XModel.hpp>
53#include <o3tl/safeint.hxx>
54#include <oox/token/tokens.hxx>
55#include <oox/token/namespaces.hxx>
59#include <svx/svdpage.hxx>
60#include <memory>
61
62using namespace oox;
63
64static OUString lcl_GetVbaTabName( SCTAB n )
65{
66 OUString aRet = "__VBA__" + OUString::number( static_cast<sal_uInt16>(n) );
67 return aRet;
68}
69
70static void lcl_AddBookviews( XclExpRecordList<>& aRecList, const ExcTable& self )
71{
72 aRecList.AppendNewRecord( new XclExpXmlStartElementRecord( XML_bookViews ) );
73 aRecList.AppendNewRecord( new XclExpWindow1( self.GetRoot() ) );
74 aRecList.AppendNewRecord( new XclExpXmlEndElementRecord( XML_bookViews ) );
75}
76
77static void lcl_AddCalcPr( XclExpRecordList<>& aRecList, const ExcTable& self )
78{
79 ScDocument& rDoc = self.GetDoc();
80
81 aRecList.AppendNewRecord( new XclExpXmlStartSingleElementRecord( XML_calcPr ) );
82 // OOXTODO: calcCompleted, calcId, calcMode, calcOnSave,
83 // concurrentCalc, concurrentManualCount,
84 // forceFullCalc, fullCalcOnLoad, fullPrecision
85 aRecList.AppendNewRecord( new XclCalccount( rDoc ) );
86 aRecList.AppendNewRecord( new XclRefmode( rDoc ) );
87 aRecList.AppendNewRecord( new XclIteration( rDoc ) );
88 aRecList.AppendNewRecord( new XclDelta( rDoc ) );
90 aRecList.AppendNewRecord( new XclExpXmlEndSingleElementRecord() ); // XML_calcPr
91}
92
93static void lcl_AddWorkbookProtection( XclExpRecordList<>& aRecList, const ExcTable& self )
94{
95 aRecList.AppendNewRecord( new XclExpXmlStartSingleElementRecord( XML_workbookProtection ) );
96
97 const ScDocProtection* pProtect = self.GetDoc().GetDocProtection();
98 if (pProtect && pProtect->isProtected())
99 {
102 aRecList.AppendNewRecord( new XclExpPassHash(pProtect->getPasswordHash(PASSHASH_XL)) );
103 }
104
105 aRecList.AppendNewRecord( new XclExpXmlEndSingleElementRecord() ); // XML_workbookProtection
106}
107
108static void lcl_AddScenariosAndFilters( XclExpRecordList<>& aRecList, const XclExpRoot& rRoot, SCTAB nScTab )
109{
110 // Scenarios
111 aRecList.AppendNewRecord( new ExcEScenarioManager( rRoot, nScTab ) );
112 // filter
113 aRecList.AppendRecord( rRoot.GetFilterManager().CreateRecord( nScTab ) );
114}
115
117 XclExpRoot( rRoot ),
118 mnScTab( SCTAB_GLOBAL ),
119 nExcTab( EXC_NOTAB ),
120 mxNoteList( new XclExpNoteList )
121{
122}
123
124ExcTable::ExcTable( const XclExpRoot& rRoot, SCTAB nScTab ) :
125 XclExpRoot( rRoot ),
126 mnScTab( nScTab ),
127 nExcTab( rRoot.GetTabInfo().GetXclTab( nScTab ) ),
128 mxNoteList( new XclExpNoteList )
129{
130}
131
133{
134}
135
137{
138 OSL_ENSURE( pRec, "-ExcTable::Add(): pRec is NULL!" );
140}
141
143{
145
146 RootData& rR = GetOldRoot();
147 ScDocument& rDoc = GetDoc();
148 XclExpTabInfo& rTabInfo = GetTabInfo();
149
150 if ( GetBiff() <= EXC_BIFF5 )
151 Add( new ExcBofW );
152 else
153 Add( new ExcBofW8 );
154
155 sal_uInt16 nExcTabCount = rTabInfo.GetXclTabCount();
156 sal_uInt16 nCodenames = static_cast< sal_uInt16 >( GetExtDocOptions().GetCodeNameCount() );
157
158 SfxObjectShell* pShell = GetDocShell();
159 sal_uInt16 nWriteProtHash = pShell ? pShell->GetModifyPasswordHash() : 0;
160 bool bRecommendReadOnly = pShell && pShell->IsLoadReadonly();
161
162 if( (nWriteProtHash > 0) || bRecommendReadOnly )
164
165 // TODO: correct codepage for BIFF5?
166 sal_uInt16 nCodePage = XclTools::GetXclCodePage( (GetBiff() <= EXC_BIFF5) ? RTL_TEXTENCODING_MS_1252 : RTL_TEXTENCODING_UNICODE );
167
168 if( GetBiff() <= EXC_BIFF5 )
169 {
171 Add( new XclExpUInt16Record( EXC_ID_MMS, 0 ) );
175 Add( new ExcDummy_00 );
176 }
177 else
178 {
179 if( IsDocumentEncrypted() )
180 Add( new XclExpFileEncryption( GetRoot() ) );
181 Add( new XclExpInterfaceHdr( nCodePage ) );
182 Add( new XclExpUInt16Record( EXC_ID_MMS, 0 ) );
183 Add( new XclExpInterfaceEnd );
184 Add( new XclExpWriteAccess );
185 }
186
187 Add( new XclExpFileSharing( GetRoot(), nWriteProtHash, bRecommendReadOnly ) );
188 Add( new XclExpUInt16Record( EXC_ID_CODEPAGE, nCodePage ) );
189
190 if( GetBiff() == EXC_BIFF8 )
191 {
192 Add( new XclExpBoolRecord( EXC_ID_DSF, false ) );
194 rR.pTabId = new XclExpChTrTabId( std::max( nExcTabCount, nCodenames ) );
195 Add( rR.pTabId );
196 if( HasVbaStorage() )
197 {
198 Add( new XclObproj );
199 const OUString& rCodeName = GetExtDocOptions().GetDocSettings().maGlobCodeName;
200 if( !rCodeName.isEmpty() )
201 Add( new XclCodename( rCodeName ) );
202 }
203 }
204
206
207 if ( GetBiff() <= EXC_BIFF5 )
208 {
209 // global link table: EXTERNCOUNT, EXTERNSHEET, NAME
212 }
213
214 // document protection options
216
217 if( GetBiff() == EXC_BIFF8 )
218 {
219 Add( new XclExpProt4Rev );
220 Add( new XclExpProt4RevPass );
221 }
222
223 lcl_AddBookviews( aRecList, *this );
224
225 Add( new XclExpXmlStartSingleElementRecord( XML_workbookPr ) );
226 if ( GetBiff() == EXC_BIFF8 && GetOutput() != EXC_OUTPUT_BINARY )
227 {
228 Add( new XclExpBoolRecord(0x0040, false, XML_backupFile ) ); // BACKUP
229 Add( new XclExpBoolRecord(0x008D, false, XML_showObjects ) ); // HIDEOBJ
230 }
231
232 if ( GetBiff() == EXC_BIFF8 )
233 {
234 Add( new XclExpBoolRecord(0x0040, false) ); // BACKUP
235 Add( new XclExpBoolRecord(0x008D, false) ); // HIDEOBJ
236 }
237
238 if( GetBiff() <= EXC_BIFF5 )
239 {
240 Add( new ExcDummy_040 );
241 Add( new Exc1904( rDoc ) );
242 Add( new ExcDummy_041 );
243 }
244 else
245 {
246 // BIFF8
247 Add( new Exc1904( rDoc ) );
248 Add( new XclExpBoolRecord( 0x000E, !rDoc.GetDocOptions().IsCalcAsShown() ) );
249 Add( new XclExpBoolRecord(0x01B7, false) ); // REFRESHALL
250 Add( new XclExpBoolRecord(0x00DA, false) ); // BOOKBOOL
251 }
252
253 // Formatting: FONT, FORMAT, XF, STYLE, PALETTE
258
259 SCTAB nC;
260 SCTAB nScTabCount = rTabInfo.GetScTabCount();
261 if( GetBiff() <= EXC_BIFF5 )
262 {
263 // Bundlesheet
264 for( nC = 0 ; nC < nScTabCount ; nC++ )
265 if( rTabInfo.IsExportTab( nC ) )
266 {
267 ExcBoundsheetList::RecordRefType xBoundsheet = new ExcBundlesheet( rR, nC );
268 aRecList.AppendRecord( xBoundsheet );
269 rBoundsheetList.AppendRecord( xBoundsheet );
270 }
271 }
272 else
273 {
274 // Pivot Cache
276 aRecList.AppendRecord( GetPivotTableManager().CreatePivotCachesRecord() );
277
278 // Change tracking
279 if( rDoc.GetChangeTrack() )
280 {
282 Add( rR.pUserBViewList );
283 }
284
285 // Natural Language Formulas Flag
286 aRecList.AppendNewRecord( new XclExpBoolRecord( EXC_ID_USESELFS, GetDoc().GetDocOptions().IsLookUpColRowNames() ) );
287
288 // Bundlesheet
289 for( nC = 0 ; nC < nScTabCount ; nC++ )
290 if( rTabInfo.IsExportTab( nC ) )
291 {
292 ExcBoundsheetList::RecordRefType xBoundsheet = new ExcBundlesheet8( rR, nC );
293 aRecList.AppendRecord( xBoundsheet );
294 rBoundsheetList.AppendRecord( xBoundsheet );
295 }
296
297 OUString aTmpString;
298 for( SCTAB nAdd = 0; nC < static_cast<SCTAB>(nCodenames) ; nC++, nAdd++ )
299 {
300 aTmpString = lcl_GetVbaTabName( nAdd );
301 ExcBoundsheetList::RecordRefType xBoundsheet = new ExcBundlesheet8( aTmpString );
302 aRecList.AppendRecord( xBoundsheet );
303 rBoundsheetList.AppendRecord( xBoundsheet );
304 }
305
306 // COUNTRY - in BIFF8 in workbook globals
307 Add( new XclExpCountry( GetRoot() ) );
308
309 // link table: SUPBOOK, XCT, CRN, EXTERNNAME, EXTERNSHEET, NAME
312
313 Add( new XclExpRecalcId );
314
315 // MSODRAWINGGROUP per-document data
316 aRecList.AppendRecord( GetObjectManager().CreateDrawingGroup() );
317 // Shared string table: SST, EXTSST
319
320 Add( new XclExpBookExt );
321 }
322
323 Add( new ExcEof );
324}
325
327{
329
330 RootData& rR = GetOldRoot();
331 ScDocument& rDoc = GetDoc();
332 XclExpTabInfo& rTabInfo = GetTabInfo();
333
334 sal_uInt16 nExcTabCount = rTabInfo.GetXclTabCount();
335 sal_uInt16 nCodenames = static_cast< sal_uInt16 >( GetExtDocOptions().GetCodeNameCount() );
336
337 rR.pTabId = new XclExpChTrTabId( std::max( nExcTabCount, nCodenames ) );
338 Add( rR.pTabId );
339
340 Add( new XclExpXmlStartSingleElementRecord( XML_workbookPr ) );
341 Add( new XclExpBoolRecord(0x0040, false, XML_backupFile ) ); // BACKUP
342 Add( new XclExpBoolRecord(0x008D, false, XML_showObjects ) ); // HIDEOBJ
343
344 Add( new Exc1904( rDoc ) );
345 // OOXTODO: The following /workbook/workbookPr attributes are mapped
346 // to various BIFF records that are not currently supported:
347 //
348 // XML_allowRefreshQuery: QSISTAG 802h: fEnableRefresh
349 // XML_autoCompressPictures: COMPRESSPICTURES 89Bh: fAutoCompressPictures
350 // XML_checkCompatibility: COMPAT12 88Ch: fNoCompatChk
351 // XML_codeName: "Calc"
352 // XML_defaultThemeVersion: ???
353 // XML_filterPrivacy: BOOKEXT 863h: fFilterPrivacy
354 // XML_hidePivotFieldList: BOOKBOOL DAh: fHidePivotTableFList
355 // XML_promptedSolutions: BOOKEXT 863h: fBuggedUserAboutSolution
356 // XML_publishItems: NAMEPUBLISH 893h: fPublished
357 // XML_saveExternalLinkValues: BOOKBOOL DAh: fNoSavSupp
358 // XML_showBorderUnselectedTables: BOOKBOOL DAh: fHideBorderUnsels
359 // XML_showInkAnnotation: BOOKEXT 863h: fShowInkAnnotation
360 // XML_showPivotChart: PIVOTCHARTBITS 859h: fGXHide??
361 // XML_updateLinks: BOOKBOOL DAh: grbitUpdateLinks
362 Add( new XclExpXmlEndSingleElementRecord() ); // XML_workbookPr
363
364 // Formatting: FONT, FORMAT, XF, STYLE, PALETTE
366
367 // Change tracking
368 if( rDoc.GetChangeTrack() )
369 {
371 Add( rR.pUserBViewList );
372 }
373
375 lcl_AddBookviews( aRecList, *this );
376
377 // Bundlesheet
378 SCTAB nC;
379 SCTAB nScTabCount = rTabInfo.GetScTabCount();
381 for( nC = 0 ; nC < nScTabCount ; nC++ )
382 if( rTabInfo.IsExportTab( nC ) )
383 {
384 ExcBoundsheetList::RecordRefType xBoundsheet = new ExcBundlesheet8( rR, nC );
385 aRecList.AppendRecord( xBoundsheet );
386 rBoundsheetList.AppendRecord( xBoundsheet );
387 }
389
390 OUString aTmpString;
391 for( SCTAB nAdd = 0; nC < static_cast<SCTAB>(nCodenames) ; nC++, nAdd++ )
392 {
393 aTmpString = lcl_GetVbaTabName( nAdd );
394 ExcBoundsheetList::RecordRefType xBoundsheet = new ExcBundlesheet8( aTmpString );
395 aRecList.AppendRecord( xBoundsheet );
396 rBoundsheetList.AppendRecord( xBoundsheet );
397 }
398
399 // link table: SUPBOOK, XCT, CRN, EXTERNNAME, EXTERNSHEET, NAME
402
403 lcl_AddCalcPr( aRecList, *this );
404
405 // MSODRAWINGGROUP per-document data
406 aRecList.AppendRecord( GetObjectManager().CreateDrawingGroup() );
407 // Shared string table: SST, EXTSST
409}
410
412{
414
415 RootData& rR = GetOldRoot();
416 XclBiff eBiff = GetBiff();
417 ScDocument& rDoc = GetDoc();
418
419 OSL_ENSURE( (mnScTab >= 0) && (mnScTab <= MAXTAB), "-ExcTable::Table(): mnScTab - no ordinary table!" );
420 OSL_ENSURE( nExcTab <= o3tl::make_unsigned(MAXTAB), "-ExcTable::Table(): nExcTab - no ordinary table!" );
421
422 // create a new OBJ list for this sheet (may be used by notes, autofilter, data validation)
423 if( eBiff == EXC_BIFF8 )
425
426 // cell table: DEFROWHEIGHT, DEFCOLWIDTH, COLINFO, DIMENSIONS, ROW, cell records
428
429 //export cell notes
430 std::vector<sc::NoteEntry> aNotes;
431 rDoc.GetAllNoteEntries(aNotes);
432 for (const auto& rNote : aNotes)
433 {
434 if (rNote.maPos.Tab() != mnScTab)
435 continue;
436
437 mxNoteList->AppendNewRecord(new XclExpNote(GetRoot(), rNote.maPos, rNote.mpNote, u""));
438 }
439
440 // WSBOOL needs data from page settings, create it here, add it later
442 bool bFitToPages = xPageSett->GetPageData().mbFitToPages;
443
444 if( eBiff <= EXC_BIFF5 )
445 {
446 Add( new ExcBof );
447 Add( new ExcDummy_02a );
448 }
449 else
450 {
451 Add( new ExcBof8 );
452 lcl_AddCalcPr( aRecList, *this );
453 }
454
455 // GUTS (count & size of outline icons)
456 aRecList.AppendRecord( mxCellTable->CreateRecord( EXC_ID_GUTS ) );
457 // DEFROWHEIGHT, created by the cell table
459
460 // COUNTRY - in BIFF5/7 in every worksheet
461 if( eBiff <= EXC_BIFF5 )
462 Add( new XclExpCountry( GetRoot() ) );
463
464 Add( new XclExpWsbool( bFitToPages ) );
465
466 // page settings (SETUP and various other records)
467 aRecList.AppendRecord( xPageSett );
468
469 const ScTableProtection* pTabProtect = rDoc.GetTabProtection(mnScTab);
470 if (pTabProtect && pTabProtect->isProtected())
471 {
472 Add( new XclExpProtection(true) );
476 Add( new XclExpPassHash(pTabProtect->getPasswordHash(PASSHASH_XL)) );
477 }
478
479 // local link table: EXTERNCOUNT, EXTERNSHEET
480 if( eBiff <= EXC_BIFF5 )
482
483 if ( eBiff == EXC_BIFF8 )
485
486 // cell table: DEFCOLWIDTH, COLINFO, DIMENSIONS, ROW, cell records
488
489 // MERGEDCELLS record, generated by the cell table
491 // label ranges
492 if( eBiff == EXC_BIFF8 )
493 Add( new XclExpLabelranges( GetRoot() ) );
494 // data validation (DVAL and list of DV records), generated by the cell table
495 aRecList.AppendRecord( mxCellTable->CreateRecord( EXC_ID_DVAL ) );
496
497 if( eBiff == EXC_BIFF8 )
498 {
499 // all MSODRAWING and OBJ stuff of this sheet goes here
500 aRecList.AppendRecord( GetObjectManager().ProcessDrawing( GetSdrPage( mnScTab ) ) );
501 // pivot tables
502 aRecList.AppendRecord( GetPivotTableManager().CreatePivotTablesRecord( mnScTab ) );
503 }
504
505 // list of NOTE records, generated by the cell table
507
508 // sheet view settings: WINDOW2, SCL, PANE, SELECTION
510
511 if( eBiff == EXC_BIFF8 )
512 {
513 // sheet protection options
515
516 // enhanced protections if there are
517 if (pTabProtect)
518 {
519 const ::std::vector<ScEnhancedProtection>& rProts( pTabProtect->getEnhancedProtection());
520 for (const auto& rProt : rProts)
521 {
523 }
524 }
525
526 // web queries
527 Add( new XclExpWebQueryBuffer( GetRoot() ) );
528
529 // conditional formats
531
532 if( HasVbaStorage() )
533 if( nCodeNameIdx < GetExtDocOptions().GetCodeNameCount() )
534 Add( new XclCodename( GetExtDocOptions().GetCodeName( nCodeNameIdx ) ) );
535 }
536
537 // list of HLINK records, generated by the cell table
538 aRecList.AppendRecord( mxCellTable->CreateRecord( EXC_ID_HLINK ) );
539
540 // change tracking
541 if( rR.pUserBViewList )
542 {
544 for ( iter = rR.pUserBViewList->cbegin(); iter != rR.pUserBViewList->cend(); ++iter)
545 {
546 Add( new XclExpUsersViewBegin( (*iter).GetGUID(), nExcTab ) );
547 Add( new XclExpUsersViewEnd );
548 }
549 }
550
551 // EOF
552 Add( new ExcEof );
553}
554
556{
558
559 ScDocument& rDoc = GetDoc();
560
561 OSL_ENSURE( (mnScTab >= 0) && (mnScTab <= MAXTAB), "-ExcTable::Table(): mnScTab - no ordinary table!" );
562 OSL_ENSURE( nExcTab <= o3tl::make_unsigned(MAXTAB), "-ExcTable::Table(): nExcTab - no ordinary table!" );
563
564 // create a new OBJ list for this sheet (may be used by notes, autofilter, data validation)
566
567 // cell table: DEFROWHEIGHT, DEFCOLWIDTH, COLINFO, DIMENSIONS, ROW, cell records
569
570 //export cell notes
571 std::vector<sc::NoteEntry> aNotes;
572 rDoc.GetAllNoteEntries(aNotes);
573 for (const auto& rNote : aNotes)
574 {
575 if (rNote.maPos.Tab() != mnScTab)
576 continue;
577
578 mxNoteList->AppendNewRecord(new XclExpNote(GetRoot(), rNote.maPos, rNote.mpNote, u""));
579 }
580
581 // WSBOOL needs data from page settings, create it here, add it later
583 XclExtLstRef xExtLst = new XclExtLst( GetRoot() );
584 bool bFitToPages = xPageSett->GetPageData().mbFitToPages;
585
586 Color aTabColor = GetRoot().GetDoc().GetTabBgColor(mnScTab);
587 Add(new XclExpXmlSheetPr(bFitToPages, mnScTab, aTabColor, &GetFilterManager()));
588
589 // GUTS (count & size of outline icons)
590 aRecList.AppendRecord( mxCellTable->CreateRecord( EXC_ID_GUTS ) );
591 // DEFROWHEIGHT, created by the cell table
593
595
596 // sheet view settings: WINDOW2, SCL, PANE, SELECTION
598
599 // cell table: DEFCOLWIDTH, COLINFO, DIMENSIONS, ROW, cell records
601
602 // list of NOTE records, generated by the cell table
603 // not in the worksheet file
604 if( mxNoteList != nullptr && !mxNoteList->IsEmpty() )
606
607 const ScTableProtection* pTabProtect = rDoc.GetTabProtection(mnScTab);
608 if (pTabProtect && pTabProtect->isProtected())
609 Add( new XclExpSheetProtection(true, mnScTab) );
610
612
613 // MERGEDCELLS record, generated by the cell table
615
616 // conditional formats
617 Add( new XclExpCondFormatBuffer( GetRoot(), xExtLst ) );
618
619 Add(new xcl::exp::SparklineBuffer(GetRoot(), xExtLst));
620
621 // data validation (DVAL and list of DV records), generated by the cell table
622 aRecList.AppendRecord( mxCellTable->CreateRecord( EXC_ID_DVAL ) );
623
624 // list of HLINK records, generated by the cell table
625 XclExpRecordRef xHyperlinks = mxCellTable->CreateRecord( EXC_ID_HLINK );
626 XclExpHyperlinkList* pHyperlinkList = dynamic_cast<XclExpHyperlinkList*>(xHyperlinks.get());
627 if( pHyperlinkList != nullptr && !pHyperlinkList->IsEmpty() )
628 {
630 aRecList.AppendRecord( xHyperlinks );
631 aRecList.AppendNewRecord( new XclExpXmlEndElementRecord( XML_hyperlinks ) );
632 }
633
634 aRecList.AppendRecord( xPageSett );
635
636 // all MSODRAWING and OBJ stuff of this sheet goes here
638
639 XclExpImgData* pImgData = xPageSett->getGraphicExport();
640 if (pImgData)
641 aRecList.AppendRecord(pImgData);
642
643 // <tableParts> after <drawing> and before <extLst>
645
646 aRecList.AppendRecord( xExtLst );
647}
648
650{
652
653 if( !(HasVbaStorage() && (nCodeNameIdx < GetExtDocOptions().GetCodeNameCount())) )
654 return;
655
656 if( GetBiff() <= EXC_BIFF5 )
657 {
658 Add( new ExcBof );
659 }
660 else
661 {
662 Add( new ExcBof8 );
663 Add( new XclCodename( GetExtDocOptions().GetCodeName( nCodeNameIdx ) ) );
664 }
665 // sheet view settings: WINDOW2, SCL, PANE, SELECTION
667 Add( new ExcEof );
668}
669
671{
673 if( mxCellTable )
674 mxCellTable->Finalize(true);
676}
677
679{
680 if (!GetTabInfo().IsExportTab(mnScTab))
681 {
682 // header export.
684 if (mxCellTable)
685 mxCellTable->Finalize(false);
687
688 return;
689 }
690
691 // worksheet export
692 OUString sSheetName = XclXmlUtils::GetStreamName( "xl/", "worksheets/sheet", mnScTab+1 );
693
694 sax_fastparser::FSHelperPtr pWorksheet = rStrm.GetStreamForPath( sSheetName );
695
696 rStrm.PushStream( pWorksheet );
697
698 pWorksheet->startElement( XML_worksheet,
699 XML_xmlns, rStrm.getNamespaceURL(OOX_NS(xls)),
700 FSNS(XML_xmlns, XML_r), rStrm.getNamespaceURL(OOX_NS(officeRel)),
701 FSNS(XML_xmlns, XML_xdr), "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing", // rStrm.getNamespaceURL(OOX_NS(xm)) -> "http://schemas.microsoft.com/office/excel/2006/main",
702 FSNS(XML_xmlns, XML_x14), rStrm.getNamespaceURL(OOX_NS(xls14Lst)),
703 FSNS(XML_xmlns, XML_xr2), rStrm.getNamespaceURL(OOX_NS(xr2)),
704 FSNS(XML_xmlns, XML_mc), rStrm.getNamespaceURL(OOX_NS(mce)));
705
707 if (mxCellTable)
708 mxCellTable->Finalize(false);
710
712 if (pPT)
713 pPT->SaveXml(rStrm);
714
715 rStrm.GetCurrentStream()->endElement( XML_worksheet );
716 rStrm.PopStream();
717}
718
720 XclExpRoot( rRoot ),
721 aHeader( rRoot )
722{
723}
724
726{
727 maTableList.RemoveAllRecords(); // for the following assertion!
728}
729
731{
733
736 else
737 {
740 GetTablesManager().Initialize(); // Move outside conditions if we wanted to support BIFF.
741 }
742
743 SCTAB nScTab = 0, nScTabCount = GetTabInfo().GetScTabCount();
744 SCTAB nCodeNameIdx = 0, nCodeNameCount = GetExtDocOptions().GetCodeNameCount();
745
746 for( ; nScTab < nScTabCount; ++nScTab )
747 {
748 if( GetTabInfo().IsExportTab( nScTab ) )
749 {
750 ExcTableList::RecordRefType xTab = new ExcTable( GetRoot(), nScTab );
753 xTab->FillAsTableBinary(nCodeNameIdx);
754 else
755 xTab->FillAsTableXml();
756
757 ++nCodeNameIdx;
758 }
759 }
760 for( ; nCodeNameIdx < nCodeNameCount; ++nScTab, ++nCodeNameIdx )
761 {
762 ExcTableList::RecordRefType xTab = new ExcTable( GetRoot(), nScTab );
764 xTab->FillAsEmptyTable( nCodeNameIdx );
765 }
766
767 if ( GetBiff() == EXC_BIFF8 )
768 {
769 // complete temporary Escher stream
771
772 // change tracking
773 if ( GetDoc().GetChangeTrack() )
775 }
776}
777
779{
780 if( !maTableList.IsEmpty() )
781 {
783
784 XclExpStream aXclStrm( rSvStrm, GetRoot() );
785
786 aHeader.Write( aXclStrm );
787
788 OSL_ENSURE( maTableList.GetSize() == maBoundsheetList.GetSize(),
789 "ExcDocument::Write - different number of sheets and BOUNDSHEET records" );
790
791 for( size_t nTab = 0, nTabCount = maTableList.GetSize(); nTab < nTabCount; ++nTab )
792 {
793 // set current stream position in BOUNDSHEET record
794 ExcBoundsheetRef xBoundsheet = maBoundsheetList.GetRecord( nTab );
795 if( xBoundsheet )
796 xBoundsheet->SetStreamPos( aXclStrm.GetSvStreamPos() );
797 // write the table
798 maTableList.GetRecord( nTab )->Write( aXclStrm );
799 }
800
801 // write the table stream positions into the BOUNDSHEET records
802 for( size_t nBSheet = 0, nBSheetCount = maBoundsheetList.GetSize(); nBSheet < nBSheetCount; ++nBSheet )
803 maBoundsheetList.GetRecord( nBSheet )->UpdateStreamPos( aXclStrm );
804 }
806 m_xExpChangeTrack->Write();
807}
808
810{
811 SfxObjectShell* pDocShell = GetDocShell();
812
813 using namespace ::com::sun::star;
814 uno::Reference<document::XDocumentPropertiesSupplier> xDPS( pDocShell->GetModel(), uno::UNO_QUERY_THROW );
815 uno::Reference<document::XDocumentProperties> xDocProps = xDPS->getDocumentProperties();
816
817 OUString sUserName = GetUserName();
818 sal_uInt32 nWriteProtHash = pDocShell->GetModifyPasswordHash();
819 bool bHasPasswordHash = nWriteProtHash && !sUserName.isEmpty();
820 const uno::Sequence<beans::PropertyValue> aInfo = pDocShell->GetModifyPasswordInfo();
821 OUString sAlgorithm, sSalt, sHash;
822 sal_Int32 nCount = 0;
823 for (const auto& prop : aInfo)
824 {
825 if (prop.Name == "algorithm-name")
826 prop.Value >>= sAlgorithm;
827 else if (prop.Name == "salt")
828 prop.Value >>= sSalt;
829 else if (prop.Name == "iteration-count")
830 prop.Value >>= nCount;
831 else if (prop.Name == "hash")
832 prop.Value >>= sHash;
833 }
834 bool bHasPasswordInfo
835 = sAlgorithm != "PBKDF2" && !sSalt.isEmpty() && !sHash.isEmpty() && !sUserName.isEmpty();
836 rStrm.exportDocumentProperties(xDocProps, pDocShell->IsSecurityOptOpenReadOnly()
837 && !bHasPasswordHash && !bHasPasswordInfo);
838 rStrm.exportCustomFragments();
839
840 sax_fastparser::FSHelperPtr& rWorkbook = rStrm.GetCurrentStream();
841 rWorkbook->startElement( XML_workbook,
842 XML_xmlns, rStrm.getNamespaceURL(OOX_NS(xls)),
843 FSNS(XML_xmlns, XML_r), rStrm.getNamespaceURL(OOX_NS(officeRel)) );
844 rWorkbook->singleElement( XML_fileVersion,
845 XML_appName, "Calc"
846 // OOXTODO: XML_codeName
847 // OOXTODO: XML_lastEdited
848 // OOXTODO: XML_lowestEdited
849 // OOXTODO: XML_rupBuild
850 );
851
852 if (bHasPasswordHash)
853 rWorkbook->singleElement(XML_fileSharing,
854 XML_userName, sUserName,
855 XML_reservationPassword, OString::number(nWriteProtHash, 16));
856 else if (bHasPasswordInfo)
857 rWorkbook->singleElement(XML_fileSharing,
858 XML_userName, sUserName,
859 XML_algorithmName, sAlgorithm,
860 XML_hashValue, sHash,
861 XML_saltValue, sSalt,
862 XML_spinCount, OString::number(nCount));
863
864 if( !maTableList.IsEmpty() )
865 {
867
868 auto* pDrawLayer = GetDoc().GetDrawLayer();
869 if (pDrawLayer)
870 {
871 SdrPage* pPage = pDrawLayer->GetPage(0);
872 if (pPage)
873 {
874 std::shared_ptr<model::Theme> pTheme = pPage->getSdrPageProperties().GetTheme();
875 if (pTheme)
876 {
877 OUString sThemeRelationshipPath = "theme/theme1.xml";
878 OUString sThemeDocumentPath = "xl/" + sThemeRelationshipPath;
879
881 aThemeExport.write(sThemeDocumentPath, *pTheme);
882
883 rStrm.addRelation(rStrm.GetCurrentStream()->getOutputStream(),
884 oox::getRelationship(Relationship::THEME),
885 sThemeRelationshipPath);
886 }
887 }
888 }
889
891
892 for( size_t nTab = 0, nTabCount = maTableList.GetSize(); nTab < nTabCount; ++nTab )
893 {
894 // write the table
896 }
897 }
898
900 m_xExpChangeTrack->WriteXml( rStrm );
901
903 if (rCaches.HasCaches())
904 rCaches.SaveXml(rStrm);
905
906 const ScCalcConfig& rCalcConfig = GetDoc().GetCalcConfig();
908
909 // don't save "unspecified" string ref syntax ... query formula grammar
910 // and save that instead
912 {
913 eConv = GetDoc().GetAddressConvention();
914 }
915
916 // write if it has been read|imported or explicitly changed
917 // or if ref syntax isn't what would be native for our file format
918 // i.e. ExcelA1 in this case
919 if ( rCalcConfig.mbHasStringRefSyntax ||
921 {
922 XclExtLstRef xExtLst = new XclExtLst( GetRoot() );
923 xExtLst->AddRecord( new XclExpExtCalcPr( GetRoot(), eConv ) );
924 xExtLst->SaveXml(rStrm);
925 }
926
927 rWorkbook->endElement( XML_workbook );
928 rWorkbook.reset();
929}
930
931/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
const SCTAB MAXTAB
Definition: address.hxx:70
void UpdateStreamPos(XclExpStream &rStrm)
Definition: excrecds.cxx:301
ExcBoundsheetList maBoundsheetList
Definition: excdoc.hxx:86
void Write(SvStream &rSvStrm)
Definition: excdoc.cxx:778
virtual ~ExcDocument() override
Definition: excdoc.cxx:725
std::unique_ptr< XclExpChangeTrack > m_xExpChangeTrack
Definition: excdoc.hxx:88
void WriteXml(XclExpXmlStream &)
Definition: excdoc.cxx:809
ExcDocument(const XclExpRoot &rRoot)
Definition: excdoc.cxx:719
void ReadDoc()
Definition: excdoc.cxx:730
friend class ExcTable
Definition: excdoc.hxx:76
ExcTable aHeader
Definition: excdoc.hxx:83
ExcTableList maTableList
Definition: excdoc.hxx:85
void FillAsEmptyTable(SCTAB nCodeNameIdx)
Definition: excdoc.cxx:649
SCTAB mnScTab
Definition: excdoc.hxx:49
ExcTable(const XclExpRoot &rRoot)
Definition: excdoc.cxx:116
virtual ~ExcTable() override
Definition: excdoc.cxx:132
void FillAsHeaderBinary(ExcBoundsheetList &rBoundsheetList)
Definition: excdoc.cxx:142
void Add(XclExpRecordBase *pRec)
Definition: excdoc.cxx:136
void WriteXml(XclExpXmlStream &)
Definition: excdoc.cxx:678
void Write(XclExpStream &)
Definition: excdoc.cxx:670
void FillAsTableXml()
Definition: excdoc.cxx:555
XclExpNoteListRef mxNoteList
Definition: excdoc.hxx:52
sal_uInt16 nExcTab
Definition: excdoc.hxx:50
XclExpCellTableRef mxCellTable
Definition: excdoc.hxx:47
void FillAsTableBinary(SCTAB nCodeNameIdx)
Definition: excdoc.cxx:411
XclExpRecordList aRecList
Definition: excdoc.hxx:46
void FillAsHeaderXml(ExcBoundsheetList &rBoundsheetList)
Definition: excdoc.cxx:326
bool IsCalcAsShown() const
Definition: docoptio.hxx:81
virtual css::uno::Sequence< sal_Int8 > getPasswordHash(ScPasswordHash eHash, ScPasswordHash eHash2=PASSHASH_UNSPECIFIED) const override
virtual bool isProtected() const override
bool isOptionEnabled(Option eOption) const
SC_DLLPUBLIC const ScTableProtection * GetTabProtection(SCTAB nTab) const
Definition: documen3.cxx:1914
SC_DLLPUBLIC Color GetTabBgColor(SCTAB nTab) const
Definition: documen3.cxx:449
const ScCalcConfig & GetCalcConfig() const
Definition: document.hxx:2619
SC_DLLPUBLIC formula::FormulaGrammar::AddressConvention GetAddressConvention() const
Definition: documen3.cxx:492
SC_DLLPUBLIC void GetAllNoteEntries(std::vector< sc::NoteEntry > &rNotes) const
Definition: document.cxx:6837
SC_DLLPUBLIC ScDrawLayer * GetDrawLayer()
Definition: document.hxx:1084
SC_DLLPUBLIC ScDocProtection * GetDocProtection() const
Definition: documen3.cxx:1881
ScChangeTrack * GetChangeTrack() const
Definition: document.hxx:2494
SC_DLLPUBLIC const ScDocOptions & GetDocOptions() const
Definition: documen3.cxx:1936
const ScExtDocSettings & GetDocSettings() const
Definition: scextopt.cxx:170
SCTAB GetCodeNameCount() const
Definition: scextopt.cxx:195
sheet protection state container
bool isOptionEnabled(Option eOption) const
virtual css::uno::Sequence< sal_Int8 > getPasswordHash(ScPasswordHash eHash, ScPasswordHash eHash2=PASSHASH_UNSPECIFIED) const override
virtual bool isProtected() const override
const ::std::vector< ScEnhancedProtection > & getEnhancedProtection() const
std::shared_ptr< model::Theme > const & GetTheme() const
SdrPageProperties & getSdrPageProperties()
bool IsLoadReadonly() const
sal_uInt32 GetModifyPasswordHash() const
bool IsSecurityOptOpenReadOnly() const
css::uno::Reference< css::frame::XModel3 > GetModel() const
const css::uno::Sequence< css::beans::PropertyValue > & GetModifyPasswordInfo() const
Record which contains a Boolean value.
Definition: xerecord.hxx:255
This class contains the cell contents and more of an entire sheet.
Definition: xetable.hxx:987
Contains all conditional formats of a specific sheet.
Definition: xecontent.hxx:294
This record contains the Windows country IDs for the UI and document language.
Definition: excrecds.hxx:280
A record without body.
Definition: xerecord.hxx:184
XclExpRecordRef CreateRecord(SCTAB nScTab)
Returns a record object containing all filter records for the specified sheet.
Definition: excrecds.cxx:1197
Provides export of bitmap data to an IMGDATA record.
Definition: xeescher.hxx:150
End of User Interface Records.
Definition: xcl97rec.hxx:531
Beginning of User Interface Records.
Definition: xcl97rec.hxx:521
Provides export of the row/column label range list of a sheet.
Definition: xecontent.hxx:141
Represents a NOTE record containing the relevant data of a cell note.
Definition: xeescher.hxx:344
void StartSheet()
Initializes the object manager for a new sheet.
Definition: xeescher.cxx:1982
rtl::Reference< XclExpRecordBase > ProcessDrawing(const SdrPage *pSdrPage)
Processes a drawing page and returns the record block containing all related records (MSODRAWING,...
Definition: xeescher.cxx:1987
void EndDocument()
Finalizes the object manager after conversion of all sheets.
Definition: xeescher.cxx:2011
Contains all page (print) settings records for a single sheet.
Definition: xepage.hxx:92
void CreatePivotTables()
Creates all pivot tables and caches from the Calc DataPilot objects.
Definition: xepivot.cxx:1630
Base class for all Excel records.
Definition: xerecord.hxx:39
A list of Excel record objects.
Definition: xerecord.hxx:322
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xerecord.hxx:382
void AppendNewRecord(RecType *pRec)
Appends a newly created record to the list.
Definition: xerecord.hxx:361
size_t GetSize() const
Definition: xerecord.hxx:327
bool IsEmpty() const
Definition: xerecord.hxx:326
void RemoveAllRecords()
Removes all records from the list.
Definition: xerecord.hxx:372
virtual void Save(XclExpStream &rStrm) override
Writes the complete record list.
Definition: xerecord.hxx:375
void AppendRecord(RecType *pRec)
Appends a record to the list.
Definition: xerecord.hxx:348
RecType * GetRecord(size_t nPos) const
Returns reference to an existing record or empty reference on error.
Definition: xerecord.hxx:333
Access to global data from other classes.
Definition: xeroot.hxx:113
XclExpTablesManager & GetTablesManager()
Definition: xeroot.cxx:178
XclExpPivotTableManager & GetPivotTableManager() const
Returns the pivot table manager.
Definition: xeroot.cxx:166
void InitializeConvert()
Is called when export filter starts to create the Excel document (all BIFF versions).
Definition: xeroot.cxx:184
void InitializeTable(SCTAB nScTab)
Is called when export filter starts to create data for a single sheet (all BIFF versions).
Definition: xeroot.cxx:265
XclExpObjectManager & GetObjectManager() const
Returns the drawing object manager.
Definition: xeroot.cxx:148
void InitializeGlobals()
Is called when export filter starts to create the workbook global data (>=BIFF5).
Definition: xeroot.cxx:194
bool IsDocumentEncrypted() const
Definition: xeroot.cxx:300
XclExpXmlPivotTableManager & GetXmlPivotTableManager()
Definition: xeroot.cxx:172
XclExpTabInfo & GetTabInfo() const
Returns the buffer for Calc->Excel sheet index conversion.
Definition: xeroot.cxx:76
XclExpRecordRef CreateRecord(sal_uInt16 nRecId) const
Returns the reference to a record (or record list) representing a root object.
Definition: xeroot.cxx:282
void InitializeSave()
Is called before export filter starts to write the records to the stream.
Definition: xeroot.cxx:275
const XclExpRoot & GetRoot() const
Returns this root instance - for code readability in derived classes.
Definition: xeroot.hxx:118
XclExpFilterManager & GetFilterManager() const
Returns the filter manager.
Definition: xeroot.cxx:154
Represents one EnhancedProtection feature in a FEAT record.
Definition: xcl97rec.hxx:441
Represents a FEATHDR (SHEETPROTECTION) record that stores sheet protection options.
Definition: xcl97rec.hxx:427
This class is used to export Excel record streams.
Definition: xestream.hxx:73
sal_uInt64 GetSvStreamPos() const
Returns the absolute position of the system stream.
Definition: xestream.hxx:140
Stores the correct Excel sheet index for each Calc sheet.
Definition: xelink.hxx:62
SCTAB GetScTabCount() const
Returns the number of Calc sheets.
Definition: xelink.hxx:89
sal_uInt16 GetXclTabCount() const
Returns the number of Excel sheets to be exported.
Definition: xelink.hxx:92
bool IsExportTab(SCTAB nScTab) const
Returns true, if the specified Calc sheet will be exported.
Definition: xelink.cxx:774
Contains all view settings records for a single sheet.
Definition: xeview.hxx:138
rtl::Reference< XclExpTables > GetTablesBySheet(SCTAB nTab)
Definition: xedbdata.cxx:152
const_iterator cbegin()
const_iterator cend()
std::vector< XclExpUserBView >::const_iterator const_iterator
Contains all web query records for this document.
Definition: xecontent.hxx:411
Represents the WINDOW1 record containing global workbook view settings.
Definition: xeview.hxx:30
Write Access User Name - This record contains the user name, which is the name you type when you inst...
Definition: xcl97rec.hxx:543
bool HasCaches() const
Definition: xepivotxml.cxx:169
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xepivotxml.cxx:133
XclExpXmlPivotCaches & GetCaches()
Definition: xepivotxml.cxx:621
XclExpXmlPivotTables * GetTablesBySheet(SCTAB nTab)
Definition: xepivotxml.cxx:626
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xepivotxml.cxx:638
Save sheetPr element and its children for xlsx export.
Definition: excrecds.hxx:304
SfxObjectShell * GetDocShell() const
Returns the object shell of the Calc document.
Definition: xlroot.cxx:290
XclOutput GetOutput() const
Returns the current output format of the importer/exporter.
Definition: xlroot.hxx:143
ScExtDocOptions & GetExtDocOptions() const
Returns the extended document options.
Definition: xlroot.cxx:429
const OUString & GetUserName() const
Returns the current user name.
Definition: xlroot.hxx:176
bool HasVbaStorage() const
Returns true, if the document contains a VBA storage.
Definition: xlroot.cxx:255
XclBiff GetBiff() const
Returns the current BIFF version of the importer/exporter.
Definition: xlroot.hxx:141
RootData & GetOldRoot() const
Returns old RootData struct.
Definition: xlroot.hxx:138
void SetCurrScTab(SCTAB nScTab)
Sets the current Calc sheet index.
Definition: xlroot.hxx:261
ScDocument & GetDoc() const
Returns reference to the destination document (import) or source document (export).
Definition: xlroot.cxx:285
SdrPage * GetSdrPage(SCTAB nScTab) const
Returns the drawing layer page of the passed sheet, if present.
Definition: xlroot.cxx:316
static sal_uInt16 GetXclCodePage(rtl_TextEncoding eTextEnc)
Returns an Excel code page from a text encoding.
Definition: xltools.cxx:441
static OUString GetStreamName(const char *sStreamDir, const char *sStream, sal_Int32 nId)
Definition: xestream.cxx:697
void write(OUString const &rPath, model::Theme const &rTheme)
Determines if sparklines needs to be exported and initiates the export.
int nCount
float u
static OUString lcl_GetVbaTabName(SCTAB n)
Definition: excdoc.cxx:64
static void lcl_AddScenariosAndFilters(XclExpRecordList<> &aRecList, const XclExpRoot &rRoot, SCTAB nScTab)
Definition: excdoc.cxx:108
static void lcl_AddWorkbookProtection(XclExpRecordList<> &aRecList, const ExcTable &self)
Definition: excdoc.cxx:93
static void lcl_AddCalcPr(XclExpRecordList<> &aRecList, const ExcTable &self)
Definition: excdoc.cxx:77
static void lcl_AddBookviews(XclExpRecordList<> &aRecList, const ExcTable &self)
Definition: excdoc.cxx:70
constexpr sal_Int32 FSNS(sal_Int32 namespc, sal_Int32 element)
char const sHash[]
sal_Int64 n
void SvStream & rStrm
constexpr std::enable_if_t< std::is_signed_v< T >, std::make_unsigned_t< T > > make_unsigned(T value)
const sal_uInt16 BIFF_ID_SCENPROTECT
Definition: biffhelper.hxx:500
const sal_uInt16 BIFF_ID_OBJECTPROTECT
Definition: biffhelper.hxx:457
const sal_uInt16 BIFF_ID_SAVERECALC
Definition: biffhelper.hxx:496
OUString getRelationship(Relationship eRelationship)
std::shared_ptr< FastSerializerHelper > FSHelperPtr
XclExpChTrTabId * pTabId
Definition: root.hxx:56
XclExpUserBViewList * pUserBViewList
Definition: root.hxx:57
Configuration options for formula interpreter.
Definition: calcconfig.hxx:44
formula::FormulaGrammar::AddressConvention meStringRefAddressSyntax
Definition: calcconfig.hxx:53
bool mbHasStringRefSyntax
Definition: calcconfig.hxx:56
OUString maGlobCodeName
Global codename (VBA module name).
Definition: scextopt.hxx:29
@ PASSHASH_XL
sal_Int16 SCTAB
Definition: types.hxx:22
rtl::Reference< XclExtLst > XclExtLstRef
Definition: xeextlst.hxx:206
XclExpValueRecord< sal_uInt16 > XclExpUInt16Record
A record containing an unsigned 16-bit value.
Definition: xerecord.hxx:247
const sal_uInt16 EXC_ID_FONTLIST
Definition: xestyle.hxx:39
const sal_uInt16 EXC_ID_XFLIST
For internal use only.
Definition: xestyle.hxx:41
const sal_uInt16 EXC_ID_FORMATLIST
For internal use only.
Definition: xestyle.hxx:40
const sal_uInt16 EXC_ID_FNGROUPCOUNT
Definition: xlconst.hxx:200
const sal_uInt16 EXC_ID_CODEPAGE
Definition: xlconst.hxx:179
const sal_uInt16 EXC_ID_WRITEPROT
Definition: xlconst.hxx:191
const SCTAB SCTAB_GLOBAL
An invalid Calc sheet index, for common use.
Definition: xlconst.hxx:74
const sal_uInt16 EXC_ID_USESELFS
Definition: xlconst.hxx:218
const sal_uInt16 EXC_NOTAB
Definition: xlconst.hxx:72
const sal_uInt16 EXC_ID_MMS
Definition: xlconst.hxx:211
const sal_uInt16 EXC_ID_INTERFACEHDR
Definition: xlconst.hxx:214
const sal_uInt16 EXC_ID_INTERFACEEND
Definition: xlconst.hxx:215
XclBiff
An enumeration for all Excel file format types (BIFF types).
Definition: xlconst.hxx:30
@ EXC_BIFF5
MS Excel 4.0.
Definition: xlconst.hxx:34
@ EXC_BIFF8
MS Excel 5.0, MS Excel 7.0 (95)
Definition: xlconst.hxx:35
@ EXC_OUTPUT_BINARY
Definition: xlconst.hxx:42
const sal_uInt16 EXC_ID_TOOLBAREND
Definition: xlconst.hxx:210
const sal_uInt16 EXC_ID_XL9FILE
Definition: xlconst.hxx:231
const sal_uInt16 EXC_ID_TOOLBARHDR
Definition: xlconst.hxx:209
const sal_uInt16 EXC_ID_DSF
Definition: xlconst.hxx:221
const sal_uInt16 EXC_ID_HLINK
Definition: xlcontent.hxx:142
const sal_uInt16 EXC_ID_SST
Definition: xlcontent.hxx:45
const sal_uInt16 EXC_ID_DVAL
Font escapement type modified?
Definition: xlcontent.hxx:98
const sal_uInt16 EXC_ID_MERGEDCELLS
Definition: xlcontent.hxx:33
const sal_uInt16 EXC_ID_NAME
Definition: xlname.hxx:28
const sal_uInt16 EXC_ID_PALETTE
Definition: xlstyle.hxx:200
const sal_uInt16 EXC_ID3_DIMENSIONS
Definition: xltable.hxx:33
const sal_uInt16 EXC_ID_GUTS
Definition: xltable.hxx:147
const sal_uInt16 EXC_ID2_DEFROWHEIGHT
Definition: xltable.hxx:111