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>
56#include <memory>
57
58using namespace oox;
59
60static OUString lcl_GetVbaTabName( SCTAB n )
61{
62 OUString aRet = "__VBA__" + OUString::number( static_cast<sal_uInt16>(n) );
63 return aRet;
64}
65
66static void lcl_AddBookviews( XclExpRecordList<>& aRecList, const ExcTable& self )
67{
68 aRecList.AppendNewRecord( new XclExpXmlStartElementRecord( XML_bookViews ) );
69 aRecList.AppendNewRecord( new XclExpWindow1( self.GetRoot() ) );
70 aRecList.AppendNewRecord( new XclExpXmlEndElementRecord( XML_bookViews ) );
71}
72
73static void lcl_AddCalcPr( XclExpRecordList<>& aRecList, const ExcTable& self )
74{
75 ScDocument& rDoc = self.GetDoc();
76
77 aRecList.AppendNewRecord( new XclExpXmlStartSingleElementRecord( XML_calcPr ) );
78 // OOXTODO: calcCompleted, calcId, calcMode, calcOnSave,
79 // concurrentCalc, concurrentManualCount,
80 // forceFullCalc, fullCalcOnLoad, fullPrecision
81 aRecList.AppendNewRecord( new XclCalccount( rDoc ) );
82 aRecList.AppendNewRecord( new XclRefmode( rDoc ) );
83 aRecList.AppendNewRecord( new XclIteration( rDoc ) );
84 aRecList.AppendNewRecord( new XclDelta( rDoc ) );
86 aRecList.AppendNewRecord( new XclExpXmlEndSingleElementRecord() ); // XML_calcPr
87}
88
89static void lcl_AddWorkbookProtection( XclExpRecordList<>& aRecList, const ExcTable& self )
90{
91 aRecList.AppendNewRecord( new XclExpXmlStartSingleElementRecord( XML_workbookProtection ) );
92
93 const ScDocProtection* pProtect = self.GetDoc().GetDocProtection();
94 if (pProtect && pProtect->isProtected())
95 {
99 }
100
101 aRecList.AppendNewRecord( new XclExpXmlEndSingleElementRecord() ); // XML_workbookProtection
102}
103
104static void lcl_AddScenariosAndFilters( XclExpRecordList<>& aRecList, const XclExpRoot& rRoot, SCTAB nScTab )
105{
106 // Scenarios
107 aRecList.AppendNewRecord( new ExcEScenarioManager( rRoot, nScTab ) );
108 // filter
109 aRecList.AppendRecord( rRoot.GetFilterManager().CreateRecord( nScTab ) );
110}
111
113 XclExpRoot( rRoot ),
114 mnScTab( SCTAB_GLOBAL ),
115 nExcTab( EXC_NOTAB ),
116 mxNoteList( new XclExpNoteList )
117{
118}
119
120ExcTable::ExcTable( const XclExpRoot& rRoot, SCTAB nScTab ) :
121 XclExpRoot( rRoot ),
122 mnScTab( nScTab ),
123 nExcTab( rRoot.GetTabInfo().GetXclTab( nScTab ) ),
124 mxNoteList( new XclExpNoteList )
125{
126}
127
129{
130}
131
133{
134 OSL_ENSURE( pRec, "-ExcTable::Add(): pRec is NULL!" );
136}
137
139{
141
142 RootData& rR = GetOldRoot();
143 ScDocument& rDoc = GetDoc();
144 XclExpTabInfo& rTabInfo = GetTabInfo();
145
146 if ( GetBiff() <= EXC_BIFF5 )
147 Add( new ExcBofW );
148 else
149 Add( new ExcBofW8 );
150
151 sal_uInt16 nExcTabCount = rTabInfo.GetXclTabCount();
152 sal_uInt16 nCodenames = static_cast< sal_uInt16 >( GetExtDocOptions().GetCodeNameCount() );
153
154 SfxObjectShell* pShell = GetDocShell();
155 sal_uInt16 nWriteProtHash = pShell ? pShell->GetModifyPasswordHash() : 0;
156 bool bRecommendReadOnly = pShell && pShell->IsLoadReadonly();
157
158 if( (nWriteProtHash > 0) || bRecommendReadOnly )
160
161 // TODO: correct codepage for BIFF5?
162 sal_uInt16 nCodePage = XclTools::GetXclCodePage( (GetBiff() <= EXC_BIFF5) ? RTL_TEXTENCODING_MS_1252 : RTL_TEXTENCODING_UNICODE );
163
164 if( GetBiff() <= EXC_BIFF5 )
165 {
167 Add( new XclExpUInt16Record( EXC_ID_MMS, 0 ) );
171 Add( new ExcDummy_00 );
172 }
173 else
174 {
175 if( IsDocumentEncrypted() )
176 Add( new XclExpFileEncryption( GetRoot() ) );
177 Add( new XclExpInterfaceHdr( nCodePage ) );
178 Add( new XclExpUInt16Record( EXC_ID_MMS, 0 ) );
179 Add( new XclExpInterfaceEnd );
180 Add( new XclExpWriteAccess );
181 }
182
183 Add( new XclExpFileSharing( GetRoot(), nWriteProtHash, bRecommendReadOnly ) );
184 Add( new XclExpUInt16Record( EXC_ID_CODEPAGE, nCodePage ) );
185
186 if( GetBiff() == EXC_BIFF8 )
187 {
188 Add( new XclExpBoolRecord( EXC_ID_DSF, false ) );
190 rR.pTabId = new XclExpChTrTabId( std::max( nExcTabCount, nCodenames ) );
191 Add( rR.pTabId );
192 if( HasVbaStorage() )
193 {
194 Add( new XclObproj );
195 const OUString& rCodeName = GetExtDocOptions().GetDocSettings().maGlobCodeName;
196 if( !rCodeName.isEmpty() )
197 Add( new XclCodename( rCodeName ) );
198 }
199 }
200
202
203 if ( GetBiff() <= EXC_BIFF5 )
204 {
205 // global link table: EXTERNCOUNT, EXTERNSHEET, NAME
208 }
209
210 // document protection options
212
213 if( GetBiff() == EXC_BIFF8 )
214 {
215 Add( new XclExpProt4Rev );
216 Add( new XclExpProt4RevPass );
217 }
218
219 lcl_AddBookviews( aRecList, *this );
220
221 Add( new XclExpXmlStartSingleElementRecord( XML_workbookPr ) );
222 if ( GetBiff() == EXC_BIFF8 && GetOutput() != EXC_OUTPUT_BINARY )
223 {
224 Add( new XclExpBoolRecord(0x0040, false, XML_backupFile ) ); // BACKUP
225 Add( new XclExpBoolRecord(0x008D, false, XML_showObjects ) ); // HIDEOBJ
226 }
227
228 if ( GetBiff() == EXC_BIFF8 )
229 {
230 Add( new XclExpBoolRecord(0x0040, false) ); // BACKUP
231 Add( new XclExpBoolRecord(0x008D, false) ); // HIDEOBJ
232 }
233
234 if( GetBiff() <= EXC_BIFF5 )
235 {
236 Add( new ExcDummy_040 );
237 Add( new Exc1904( rDoc ) );
238 Add( new ExcDummy_041 );
239 }
240 else
241 {
242 // BIFF8
243 Add( new Exc1904( rDoc ) );
244 Add( new XclExpBoolRecord( 0x000E, !rDoc.GetDocOptions().IsCalcAsShown() ) );
245 Add( new XclExpBoolRecord(0x01B7, false) ); // REFRESHALL
246 Add( new XclExpBoolRecord(0x00DA, false) ); // BOOKBOOL
247 }
248
249 // Formatting: FONT, FORMAT, XF, STYLE, PALETTE
254
255 SCTAB nC;
256 SCTAB nScTabCount = rTabInfo.GetScTabCount();
257 if( GetBiff() <= EXC_BIFF5 )
258 {
259 // Bundlesheet
260 for( nC = 0 ; nC < nScTabCount ; nC++ )
261 if( rTabInfo.IsExportTab( nC ) )
262 {
263 ExcBoundsheetList::RecordRefType xBoundsheet = new ExcBundlesheet( rR, nC );
264 aRecList.AppendRecord( xBoundsheet );
265 rBoundsheetList.AppendRecord( xBoundsheet );
266 }
267 }
268 else
269 {
270 // Pivot Cache
272 aRecList.AppendRecord( GetPivotTableManager().CreatePivotCachesRecord() );
273
274 // Change tracking
275 if( rDoc.GetChangeTrack() )
276 {
278 Add( rR.pUserBViewList );
279 }
280
281 // Natural Language Formulas Flag
282 aRecList.AppendNewRecord( new XclExpBoolRecord( EXC_ID_USESELFS, GetDoc().GetDocOptions().IsLookUpColRowNames() ) );
283
284 // Bundlesheet
285 for( nC = 0 ; nC < nScTabCount ; nC++ )
286 if( rTabInfo.IsExportTab( nC ) )
287 {
288 ExcBoundsheetList::RecordRefType xBoundsheet = new ExcBundlesheet8( rR, nC );
289 aRecList.AppendRecord( xBoundsheet );
290 rBoundsheetList.AppendRecord( xBoundsheet );
291 }
292
293 OUString aTmpString;
294 for( SCTAB nAdd = 0; nC < static_cast<SCTAB>(nCodenames) ; nC++, nAdd++ )
295 {
296 aTmpString = lcl_GetVbaTabName( nAdd );
297 ExcBoundsheetList::RecordRefType xBoundsheet = new ExcBundlesheet8( aTmpString );
298 aRecList.AppendRecord( xBoundsheet );
299 rBoundsheetList.AppendRecord( xBoundsheet );
300 }
301
302 // COUNTRY - in BIFF8 in workbook globals
303 Add( new XclExpCountry( GetRoot() ) );
304
305 // link table: SUPBOOK, XCT, CRN, EXTERNNAME, EXTERNSHEET, NAME
308
309 Add( new XclExpRecalcId );
310
311 // MSODRAWINGGROUP per-document data
312 aRecList.AppendRecord( GetObjectManager().CreateDrawingGroup() );
313 // Shared string table: SST, EXTSST
315
316 Add( new XclExpBookExt );
317 }
318
319 Add( new ExcEof );
320}
321
323{
325
326 RootData& rR = GetOldRoot();
327 ScDocument& rDoc = GetDoc();
328 XclExpTabInfo& rTabInfo = GetTabInfo();
329
330 sal_uInt16 nExcTabCount = rTabInfo.GetXclTabCount();
331 sal_uInt16 nCodenames = static_cast< sal_uInt16 >( GetExtDocOptions().GetCodeNameCount() );
332
333 rR.pTabId = new XclExpChTrTabId( std::max( nExcTabCount, nCodenames ) );
334 Add( rR.pTabId );
335
336 Add( new XclExpXmlStartSingleElementRecord( XML_workbookPr ) );
337 Add( new XclExpBoolRecord(0x0040, false, XML_backupFile ) ); // BACKUP
338 Add( new XclExpBoolRecord(0x008D, false, XML_showObjects ) ); // HIDEOBJ
339
340 Add( new Exc1904( rDoc ) );
341 // OOXTODO: The following /workbook/workbookPr attributes are mapped
342 // to various BIFF records that are not currently supported:
343 //
344 // XML_allowRefreshQuery: QSISTAG 802h: fEnableRefresh
345 // XML_autoCompressPictures: COMPRESSPICTURES 89Bh: fAutoCompressPictures
346 // XML_checkCompatibility: COMPAT12 88Ch: fNoCompatChk
347 // XML_codeName: "Calc"
348 // XML_defaultThemeVersion: ???
349 // XML_filterPrivacy: BOOKEXT 863h: fFilterPrivacy
350 // XML_hidePivotFieldList: BOOKBOOL DAh: fHidePivotTableFList
351 // XML_promptedSolutions: BOOKEXT 863h: fBuggedUserAboutSolution
352 // XML_publishItems: NAMEPUBLISH 893h: fPublished
353 // XML_saveExternalLinkValues: BOOKBOOL DAh: fNoSavSupp
354 // XML_showBorderUnselectedTables: BOOKBOOL DAh: fHideBorderUnsels
355 // XML_showInkAnnotation: BOOKEXT 863h: fShowInkAnnotation
356 // XML_showPivotChart: PIVOTCHARTBITS 859h: fGXHide??
357 // XML_updateLinks: BOOKBOOL DAh: grbitUpdateLinks
358 Add( new XclExpXmlEndSingleElementRecord() ); // XML_workbookPr
359
360 // Formatting: FONT, FORMAT, XF, STYLE, PALETTE
362
363 // Change tracking
364 if( rDoc.GetChangeTrack() )
365 {
367 Add( rR.pUserBViewList );
368 }
369
371 lcl_AddBookviews( aRecList, *this );
372
373 // Bundlesheet
374 SCTAB nC;
375 SCTAB nScTabCount = rTabInfo.GetScTabCount();
377 for( nC = 0 ; nC < nScTabCount ; nC++ )
378 if( rTabInfo.IsExportTab( nC ) )
379 {
380 ExcBoundsheetList::RecordRefType xBoundsheet = new ExcBundlesheet8( rR, nC );
381 aRecList.AppendRecord( xBoundsheet );
382 rBoundsheetList.AppendRecord( xBoundsheet );
383 }
385
386 OUString aTmpString;
387 for( SCTAB nAdd = 0; nC < static_cast<SCTAB>(nCodenames) ; nC++, nAdd++ )
388 {
389 aTmpString = lcl_GetVbaTabName( nAdd );
390 ExcBoundsheetList::RecordRefType xBoundsheet = new ExcBundlesheet8( aTmpString );
391 aRecList.AppendRecord( xBoundsheet );
392 rBoundsheetList.AppendRecord( xBoundsheet );
393 }
394
395 // link table: SUPBOOK, XCT, CRN, EXTERNNAME, EXTERNSHEET, NAME
398
399 lcl_AddCalcPr( aRecList, *this );
400
401 // MSODRAWINGGROUP per-document data
402 aRecList.AppendRecord( GetObjectManager().CreateDrawingGroup() );
403 // Shared string table: SST, EXTSST
405}
406
408{
410
411 RootData& rR = GetOldRoot();
412 XclBiff eBiff = GetBiff();
413 ScDocument& rDoc = GetDoc();
414
415 OSL_ENSURE( (mnScTab >= 0) && (mnScTab <= MAXTAB), "-ExcTable::Table(): mnScTab - no ordinary table!" );
416 OSL_ENSURE( nExcTab <= o3tl::make_unsigned(MAXTAB), "-ExcTable::Table(): nExcTab - no ordinary table!" );
417
418 // create a new OBJ list for this sheet (may be used by notes, autofilter, data validation)
419 if( eBiff == EXC_BIFF8 )
421
422 // cell table: DEFROWHEIGHT, DEFCOLWIDTH, COLINFO, DIMENSIONS, ROW, cell records
424
425 //export cell notes
426 std::vector<sc::NoteEntry> aNotes;
427 rDoc.GetAllNoteEntries(aNotes);
428 for (const auto& rNote : aNotes)
429 {
430 if (rNote.maPos.Tab() != mnScTab)
431 continue;
432
433 mxNoteList->AppendNewRecord(new XclExpNote(GetRoot(), rNote.maPos, rNote.mpNote, u""));
434 }
435
436 // WSBOOL needs data from page settings, create it here, add it later
438 bool bFitToPages = xPageSett->GetPageData().mbFitToPages;
439
440 if( eBiff <= EXC_BIFF5 )
441 {
442 Add( new ExcBof );
443 Add( new ExcDummy_02a );
444 }
445 else
446 {
447 Add( new ExcBof8 );
448 lcl_AddCalcPr( aRecList, *this );
449 }
450
451 // GUTS (count & size of outline icons)
452 aRecList.AppendRecord( mxCellTable->CreateRecord( EXC_ID_GUTS ) );
453 // DEFROWHEIGHT, created by the cell table
455
456 // COUNTRY - in BIFF5/7 in every worksheet
457 if( eBiff <= EXC_BIFF5 )
458 Add( new XclExpCountry( GetRoot() ) );
459
460 Add( new XclExpWsbool( bFitToPages ) );
461
462 // page settings (SETUP and various other records)
463 aRecList.AppendRecord( xPageSett );
464
465 const ScTableProtection* pTabProtect = rDoc.GetTabProtection(mnScTab);
466 if (pTabProtect && pTabProtect->isProtected())
467 {
468 Add( new XclExpProtection(true) );
472 Add( new XclExpPassHash(pTabProtect->getPasswordHash(PASSHASH_XL)) );
473 }
474
475 // local link table: EXTERNCOUNT, EXTERNSHEET
476 if( eBiff <= EXC_BIFF5 )
478
479 if ( eBiff == EXC_BIFF8 )
481
482 // cell table: DEFCOLWIDTH, COLINFO, DIMENSIONS, ROW, cell records
484
485 // MERGEDCELLS record, generated by the cell table
487 // label ranges
488 if( eBiff == EXC_BIFF8 )
489 Add( new XclExpLabelranges( GetRoot() ) );
490 // data validation (DVAL and list of DV records), generated by the cell table
491 aRecList.AppendRecord( mxCellTable->CreateRecord( EXC_ID_DVAL ) );
492
493 if( eBiff == EXC_BIFF8 )
494 {
495 // all MSODRAWING and OBJ stuff of this sheet goes here
496 aRecList.AppendRecord( GetObjectManager().ProcessDrawing( GetSdrPage( mnScTab ) ) );
497 // pivot tables
498 aRecList.AppendRecord( GetPivotTableManager().CreatePivotTablesRecord( mnScTab ) );
499 }
500
501 // list of NOTE records, generated by the cell table
503
504 // sheet view settings: WINDOW2, SCL, PANE, SELECTION
506
507 if( eBiff == EXC_BIFF8 )
508 {
509 // sheet protection options
511
512 // enhanced protections if there are
513 if (pTabProtect)
514 {
515 const ::std::vector<ScEnhancedProtection>& rProts( pTabProtect->getEnhancedProtection());
516 for (const auto& rProt : rProts)
517 {
519 }
520 }
521
522 // web queries
523 Add( new XclExpWebQueryBuffer( GetRoot() ) );
524
525 // conditional formats
527
528 if( HasVbaStorage() )
529 if( nCodeNameIdx < GetExtDocOptions().GetCodeNameCount() )
530 Add( new XclCodename( GetExtDocOptions().GetCodeName( nCodeNameIdx ) ) );
531 }
532
533 // list of HLINK records, generated by the cell table
534 aRecList.AppendRecord( mxCellTable->CreateRecord( EXC_ID_HLINK ) );
535
536 // change tracking
537 if( rR.pUserBViewList )
538 {
540 for ( iter = rR.pUserBViewList->cbegin(); iter != rR.pUserBViewList->cend(); ++iter)
541 {
542 Add( new XclExpUsersViewBegin( (*iter).GetGUID(), nExcTab ) );
543 Add( new XclExpUsersViewEnd );
544 }
545 }
546
547 // EOF
548 Add( new ExcEof );
549}
550
552{
554
555 ScDocument& rDoc = GetDoc();
556
557 OSL_ENSURE( (mnScTab >= 0) && (mnScTab <= MAXTAB), "-ExcTable::Table(): mnScTab - no ordinary table!" );
558 OSL_ENSURE( nExcTab <= o3tl::make_unsigned(MAXTAB), "-ExcTable::Table(): nExcTab - no ordinary table!" );
559
560 // create a new OBJ list for this sheet (may be used by notes, autofilter, data validation)
562
563 // cell table: DEFROWHEIGHT, DEFCOLWIDTH, COLINFO, DIMENSIONS, ROW, cell records
565
566 //export cell notes
567 std::vector<sc::NoteEntry> aNotes;
568 rDoc.GetAllNoteEntries(aNotes);
569 for (const auto& rNote : aNotes)
570 {
571 if (rNote.maPos.Tab() != mnScTab)
572 continue;
573
574 mxNoteList->AppendNewRecord(new XclExpNote(GetRoot(), rNote.maPos, rNote.mpNote, u""));
575 }
576
577 // WSBOOL needs data from page settings, create it here, add it later
579 XclExtLstRef xExtLst = new XclExtLst( GetRoot() );
580 bool bFitToPages = xPageSett->GetPageData().mbFitToPages;
581
582 Color aTabColor = GetRoot().GetDoc().GetTabBgColor(mnScTab);
583 Add(new XclExpXmlSheetPr(bFitToPages, mnScTab, aTabColor, &GetFilterManager()));
584
585 // GUTS (count & size of outline icons)
586 aRecList.AppendRecord( mxCellTable->CreateRecord( EXC_ID_GUTS ) );
587 // DEFROWHEIGHT, created by the cell table
589
591
592 // sheet view settings: WINDOW2, SCL, PANE, SELECTION
594
595 // cell table: DEFCOLWIDTH, COLINFO, DIMENSIONS, ROW, cell records
597
598 // list of NOTE records, generated by the cell table
599 // not in the worksheet file
600 if( mxNoteList != nullptr && !mxNoteList->IsEmpty() )
602
603 const ScTableProtection* pTabProtect = rDoc.GetTabProtection(mnScTab);
604 if (pTabProtect && pTabProtect->isProtected())
605 Add( new XclExpSheetProtection(true, mnScTab) );
606
608
609 // MERGEDCELLS record, generated by the cell table
611
612 // conditional formats
613 Add( new XclExpCondFormatBuffer( GetRoot(), xExtLst ) );
614
615 Add(new xcl::exp::SparklineBuffer(GetRoot(), xExtLst));
616
617 // data validation (DVAL and list of DV records), generated by the cell table
618 aRecList.AppendRecord( mxCellTable->CreateRecord( EXC_ID_DVAL ) );
619
620 // list of HLINK records, generated by the cell table
621 XclExpRecordRef xHyperlinks = mxCellTable->CreateRecord( EXC_ID_HLINK );
622 XclExpHyperlinkList* pHyperlinkList = dynamic_cast<XclExpHyperlinkList*>(xHyperlinks.get());
623 if( pHyperlinkList != nullptr && !pHyperlinkList->IsEmpty() )
624 {
626 aRecList.AppendRecord( xHyperlinks );
627 aRecList.AppendNewRecord( new XclExpXmlEndElementRecord( XML_hyperlinks ) );
628 }
629
630 aRecList.AppendRecord( xPageSett );
631
632 // all MSODRAWING and OBJ stuff of this sheet goes here
634
635 XclExpImgData* pImgData = xPageSett->getGraphicExport();
636 if (pImgData)
637 aRecList.AppendRecord(pImgData);
638
639 // <tableParts> after <drawing> and before <extLst>
641
642 aRecList.AppendRecord( xExtLst );
643}
644
646{
648
649 if( !(HasVbaStorage() && (nCodeNameIdx < GetExtDocOptions().GetCodeNameCount())) )
650 return;
651
652 if( GetBiff() <= EXC_BIFF5 )
653 {
654 Add( new ExcBof );
655 }
656 else
657 {
658 Add( new ExcBof8 );
659 Add( new XclCodename( GetExtDocOptions().GetCodeName( nCodeNameIdx ) ) );
660 }
661 // sheet view settings: WINDOW2, SCL, PANE, SELECTION
663 Add( new ExcEof );
664}
665
667{
669 if( mxCellTable )
670 mxCellTable->Finalize(true);
672}
673
675{
676 if (!GetTabInfo().IsExportTab(mnScTab))
677 {
678 // header export.
680 if (mxCellTable)
681 mxCellTable->Finalize(false);
683
684 return;
685 }
686
687 // worksheet export
688 OUString sSheetName = XclXmlUtils::GetStreamName( "xl/", "worksheets/sheet", mnScTab+1 );
689
690 sax_fastparser::FSHelperPtr pWorksheet = rStrm.GetStreamForPath( sSheetName );
691
692 rStrm.PushStream( pWorksheet );
693
694 pWorksheet->startElement( XML_worksheet,
695 XML_xmlns, rStrm.getNamespaceURL(OOX_NS(xls)).toUtf8(),
696 FSNS(XML_xmlns, XML_r), rStrm.getNamespaceURL(OOX_NS(officeRel)).toUtf8(),
697 FSNS(XML_xmlns, XML_xdr), "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing", // rStrm.getNamespaceURL(OOX_NS(xm)).toUtf8() -> "http://schemas.microsoft.com/office/excel/2006/main",
698 FSNS(XML_xmlns, XML_x14), rStrm.getNamespaceURL(OOX_NS(xls14Lst)).toUtf8(),
699 FSNS(XML_xmlns, XML_xr2), rStrm.getNamespaceURL(OOX_NS(xr2)).toUtf8(),
700 FSNS(XML_xmlns, XML_mc), rStrm.getNamespaceURL(OOX_NS(mce)).toUtf8());
701
703 if (mxCellTable)
704 mxCellTable->Finalize(false);
706
708 if (pPT)
709 pPT->SaveXml(rStrm);
710
711 rStrm.GetCurrentStream()->endElement( XML_worksheet );
712 rStrm.PopStream();
713}
714
716 XclExpRoot( rRoot ),
717 aHeader( rRoot )
718{
719}
720
722{
723 maTableList.RemoveAllRecords(); // for the following assertion!
724}
725
727{
729
732 else
733 {
736 GetTablesManager().Initialize(); // Move outside conditions if we wanted to support BIFF.
737 }
738
739 SCTAB nScTab = 0, nScTabCount = GetTabInfo().GetScTabCount();
740 SCTAB nCodeNameIdx = 0, nCodeNameCount = GetExtDocOptions().GetCodeNameCount();
741
742 for( ; nScTab < nScTabCount; ++nScTab )
743 {
744 if( GetTabInfo().IsExportTab( nScTab ) )
745 {
746 ExcTableList::RecordRefType xTab = new ExcTable( GetRoot(), nScTab );
749 xTab->FillAsTableBinary(nCodeNameIdx);
750 else
751 xTab->FillAsTableXml();
752
753 ++nCodeNameIdx;
754 }
755 }
756 for( ; nCodeNameIdx < nCodeNameCount; ++nScTab, ++nCodeNameIdx )
757 {
758 ExcTableList::RecordRefType xTab = new ExcTable( GetRoot(), nScTab );
760 xTab->FillAsEmptyTable( nCodeNameIdx );
761 }
762
763 if ( GetBiff() == EXC_BIFF8 )
764 {
765 // complete temporary Escher stream
767
768 // change tracking
769 if ( GetDoc().GetChangeTrack() )
771 }
772}
773
775{
776 if( !maTableList.IsEmpty() )
777 {
779
780 XclExpStream aXclStrm( rSvStrm, GetRoot() );
781
782 aHeader.Write( aXclStrm );
783
784 OSL_ENSURE( maTableList.GetSize() == maBoundsheetList.GetSize(),
785 "ExcDocument::Write - different number of sheets and BOUNDSHEET records" );
786
787 for( size_t nTab = 0, nTabCount = maTableList.GetSize(); nTab < nTabCount; ++nTab )
788 {
789 // set current stream position in BOUNDSHEET record
790 ExcBoundsheetRef xBoundsheet = maBoundsheetList.GetRecord( nTab );
791 if( xBoundsheet )
792 xBoundsheet->SetStreamPos( aXclStrm.GetSvStreamPos() );
793 // write the table
794 maTableList.GetRecord( nTab )->Write( aXclStrm );
795 }
796
797 // write the table stream positions into the BOUNDSHEET records
798 for( size_t nBSheet = 0, nBSheetCount = maBoundsheetList.GetSize(); nBSheet < nBSheetCount; ++nBSheet )
799 maBoundsheetList.GetRecord( nBSheet )->UpdateStreamPos( aXclStrm );
800 }
802 m_xExpChangeTrack->Write();
803}
804
806{
807 SfxObjectShell* pDocShell = GetDocShell();
808
809 using namespace ::com::sun::star;
810 uno::Reference<document::XDocumentPropertiesSupplier> xDPS( pDocShell->GetModel(), uno::UNO_QUERY_THROW );
811 uno::Reference<document::XDocumentProperties> xDocProps = xDPS->getDocumentProperties();
812
813 OUString sUserName = GetUserName();
814 sal_uInt32 nWriteProtHash = pDocShell->GetModifyPasswordHash();
815 bool bHasPasswordHash = nWriteProtHash && !sUserName.isEmpty();
816 const uno::Sequence<beans::PropertyValue> aInfo = pDocShell->GetModifyPasswordInfo();
817 OUString sAlgorithm, sSalt, sHash;
818 sal_Int32 nCount = 0;
819 for (const auto& prop : aInfo)
820 {
821 if (prop.Name == "algorithm-name")
822 prop.Value >>= sAlgorithm;
823 else if (prop.Name == "salt")
824 prop.Value >>= sSalt;
825 else if (prop.Name == "iteration-count")
826 prop.Value >>= nCount;
827 else if (prop.Name == "hash")
828 prop.Value >>= sHash;
829 }
830 bool bHasPasswordInfo
831 = sAlgorithm != "PBKDF2" && !sSalt.isEmpty() && !sHash.isEmpty() && !sUserName.isEmpty();
832 rStrm.exportDocumentProperties(xDocProps, pDocShell->IsSecurityOptOpenReadOnly()
833 && !bHasPasswordHash && !bHasPasswordInfo);
834 rStrm.exportCustomFragments();
835
836 sax_fastparser::FSHelperPtr& rWorkbook = rStrm.GetCurrentStream();
837 rWorkbook->startElement( XML_workbook,
838 XML_xmlns, rStrm.getNamespaceURL(OOX_NS(xls)).toUtf8(),
839 FSNS(XML_xmlns, XML_r), rStrm.getNamespaceURL(OOX_NS(officeRel)).toUtf8() );
840 rWorkbook->singleElement( XML_fileVersion,
841 XML_appName, "Calc"
842 // OOXTODO: XML_codeName
843 // OOXTODO: XML_lastEdited
844 // OOXTODO: XML_lowestEdited
845 // OOXTODO: XML_rupBuild
846 );
847
848 if (bHasPasswordHash)
849 rWorkbook->singleElement(XML_fileSharing,
850 XML_userName, sUserName,
851 XML_reservationPassword, OString::number(nWriteProtHash, 16).getStr());
852 else if (bHasPasswordInfo)
853 rWorkbook->singleElement(XML_fileSharing,
854 XML_userName, sUserName,
855 XML_algorithmName, sAlgorithm.toUtf8().getStr(),
856 XML_hashValue, sHash.toUtf8().getStr(),
857 XML_saltValue, sSalt.toUtf8().getStr(),
858 XML_spinCount, OString::number(nCount).getStr());
859
860 if( !maTableList.IsEmpty() )
861 {
863
865
866 for( size_t nTab = 0, nTabCount = maTableList.GetSize(); nTab < nTabCount; ++nTab )
867 {
868 // write the table
870 }
871 }
872
874 m_xExpChangeTrack->WriteXml( rStrm );
875
877 if (rCaches.HasCaches())
878 rCaches.SaveXml(rStrm);
879
880 const ScCalcConfig& rCalcConfig = GetDoc().GetCalcConfig();
882
883 // don't save "unspecified" string ref syntax ... query formula grammar
884 // and save that instead
886 {
887 eConv = GetDoc().GetAddressConvention();
888 }
889
890 // write if it has been read|imported or explicitly changed
891 // or if ref syntax isn't what would be native for our file format
892 // i.e. ExcelA1 in this case
893 if ( rCalcConfig.mbHasStringRefSyntax ||
895 {
896 XclExtLstRef xExtLst = new XclExtLst( GetRoot() );
897 xExtLst->AddRecord( new XclExpExtCalcPr( GetRoot(), eConv ) );
898 xExtLst->SaveXml(rStrm);
899 }
900
901 rWorkbook->endElement( XML_workbook );
902 rWorkbook.reset();
903}
904
905/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
const SCTAB MAXTAB
Definition: address.hxx:70
void UpdateStreamPos(XclExpStream &rStrm)
Definition: excrecds.cxx:299
ExcBoundsheetList maBoundsheetList
Definition: excdoc.hxx:86
void Write(SvStream &rSvStrm)
Definition: excdoc.cxx:774
virtual ~ExcDocument() override
Definition: excdoc.cxx:721
std::unique_ptr< XclExpChangeTrack > m_xExpChangeTrack
Definition: excdoc.hxx:88
void WriteXml(XclExpXmlStream &)
Definition: excdoc.cxx:805
ExcDocument(const XclExpRoot &rRoot)
Definition: excdoc.cxx:715
void ReadDoc()
Definition: excdoc.cxx:726
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:645
SCTAB mnScTab
Definition: excdoc.hxx:49
ExcTable(const XclExpRoot &rRoot)
Definition: excdoc.cxx:112
virtual ~ExcTable() override
Definition: excdoc.cxx:128
void FillAsHeaderBinary(ExcBoundsheetList &rBoundsheetList)
Definition: excdoc.cxx:138
void Add(XclExpRecordBase *pRec)
Definition: excdoc.cxx:132
void WriteXml(XclExpXmlStream &)
Definition: excdoc.cxx:674
void Write(XclExpStream &)
Definition: excdoc.cxx:666
void FillAsTableXml()
Definition: excdoc.cxx:551
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:407
XclExpRecordList aRecList
Definition: excdoc.hxx:46
void FillAsHeaderXml(ExcBoundsheetList &rBoundsheetList)
Definition: excdoc.cxx:322
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:1928
SC_DLLPUBLIC Color GetTabBgColor(SCTAB nTab) const
Definition: documen3.cxx:454
const ScCalcConfig & GetCalcConfig() const
Definition: document.hxx:2614
SC_DLLPUBLIC formula::FormulaGrammar::AddressConvention GetAddressConvention() const
Definition: documen3.cxx:500
SC_DLLPUBLIC void GetAllNoteEntries(std::vector< sc::NoteEntry > &rNotes) const
Definition: document.cxx:6985
SC_DLLPUBLIC ScDocProtection * GetDocProtection() const
Definition: documen3.cxx:1895
ScChangeTrack * GetChangeTrack() const
Definition: document.hxx:2487
SC_DLLPUBLIC const ScDocOptions & GetDocOptions() const
Definition: documen3.cxx:1952
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
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:1155
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:1961
rtl::Reference< XclExpRecordBase > ProcessDrawing(const SdrPage *pSdrPage)
Processes a drawing page and returns the record block containing all related records (MSODRAWING,...
Definition: xeescher.cxx:1966
void EndDocument()
Finalizes the object manager after conversion of all sheets.
Definition: xeescher.cxx:1990
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:299
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:281
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:291
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:256
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:286
SdrPage * GetSdrPage(SCTAB nScTab) const
Returns the drawing layer page of the passed sheet, if present.
Definition: xlroot.cxx:317
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:694
Determines if sparklines needs to be exported and initiates the export.
int nCount
float u
static OUString lcl_GetVbaTabName(SCTAB n)
Definition: excdoc.cxx:60
static void lcl_AddScenariosAndFilters(XclExpRecordList<> &aRecList, const XclExpRoot &rRoot, SCTAB nScTab)
Definition: excdoc.cxx:104
static void lcl_AddWorkbookProtection(XclExpRecordList<> &aRecList, const ExcTable &self)
Definition: excdoc.cxx:89
static void lcl_AddCalcPr(XclExpRecordList<> &aRecList, const ExcTable &self)
Definition: excdoc.cxx:73
static void lcl_AddBookviews(XclExpRecordList<> &aRecList, const ExcTable &self)
Definition: excdoc.cxx:66
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
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:38
const sal_uInt16 EXC_ID_XFLIST
For internal use only.
Definition: xestyle.hxx:40
const sal_uInt16 EXC_ID_FORMATLIST
For internal use only.
Definition: xestyle.hxx:39
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:199
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