LibreOffice Module sc (master) 1
xecontent.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 <memory>
21#include <xecontent.hxx>
22
23#include <vector>
24#include <algorithm>
25#include <string_view>
26
27#include <com/sun/star/frame/XModel.hpp>
28#include <com/sun/star/sheet/XAreaLinks.hpp>
29#include <com/sun/star/sheet/XAreaLink.hpp>
30#include <com/sun/star/sheet/TableValidationVisibility.hpp>
31#include <com/sun/star/beans/XPropertySet.hpp>
32#include <sfx2/objsh.hxx>
33#include <tools/urlobj.hxx>
34#include <formula/grammar.hxx>
35#include <scitems.hxx>
36#include <editeng/flditem.hxx>
37#include <document.hxx>
38#include <validat.hxx>
39#include <unonames.hxx>
40#include <convuno.hxx>
41#include <rangenam.hxx>
42#include <tokenarray.hxx>
43#include <stlpool.hxx>
44#include <patattr.hxx>
45#include <fapihelper.hxx>
46#include <xehelper.hxx>
47#include <xestyle.hxx>
48#include <xename.hxx>
49#include <xlcontent.hxx>
50#include <xltools.hxx>
51#include <xeformula.hxx>
52#include <rtl/uuid.h>
53#include <sal/log.hxx>
54#include <oox/export/utils.hxx>
55#include <oox/token/namespaces.hxx>
57#include <comphelper/string.hxx>
58#include <o3tl/string_view.hxx>
59
60using namespace ::oox;
61
62using ::com::sun::star::uno::Reference;
63using ::com::sun::star::uno::UNO_QUERY;
64using ::com::sun::star::table::CellRangeAddress;
65using ::com::sun::star::sheet::XAreaLinks;
66using ::com::sun::star::sheet::XAreaLink;
67
68// Shared string table ========================================================
69
70namespace {
71
73struct XclExpHashEntry
74{
75 const XclExpString* mpString;
76 sal_uInt32 mnSstIndex;
77 explicit XclExpHashEntry( const XclExpString* pString, sal_uInt32 nSstIndex ) :
78 mpString( pString ), mnSstIndex( nSstIndex ) {}
79};
80
82struct XclExpHashEntrySWO
83{
84 bool operator()( const XclExpHashEntry& rLeft, const XclExpHashEntry& rRight ) const
85 { return *rLeft.mpString < *rRight.mpString; }
86};
87
88}
89
94{
95public:
96 explicit XclExpSstImpl();
97
99 sal_uInt32 Insert( XclExpStringRef xString );
100
102 void Save( XclExpStream& rStrm );
104
105private:
106 typedef ::std::vector< XclExpHashEntry > XclExpHashVec;
107
108 std::vector< XclExpStringRef > maStringVector;
109 std::vector< XclExpHashVec >
111 sal_uInt32 mnTotal;
112 sal_uInt32 mnSize;
113};
114
115const sal_uInt32 EXC_SST_HASHTABLE_SIZE = 2048;
116
118 maHashTab( EXC_SST_HASHTABLE_SIZE ),
119 mnTotal( 0 ),
120 mnSize( 0 )
121{
122}
123
125{
126 OSL_ENSURE( xString, "XclExpSstImpl::Insert - empty pointer not allowed" );
127 if( !xString )
128 xString.reset( new XclExpString );
129
130 ++mnTotal;
131 sal_uInt32 nSstIndex = 0;
132
133 // calculate hash value in range [0,EXC_SST_HASHTABLE_SIZE)
134 sal_uInt16 nHash = xString->GetHash();
135 nHash = (nHash ^ (nHash / EXC_SST_HASHTABLE_SIZE)) % EXC_SST_HASHTABLE_SIZE;
136
137 XclExpHashVec& rVec = maHashTab[ nHash ];
138 XclExpHashEntry aEntry( xString.get(), mnSize );
139 XclExpHashVec::iterator aIt = ::std::lower_bound( rVec.begin(), rVec.end(), aEntry, XclExpHashEntrySWO() );
140 if( (aIt == rVec.end()) || (*aIt->mpString != *xString) )
141 {
142 nSstIndex = mnSize;
143 maStringVector.push_back( xString );
144 rVec.insert( aIt, aEntry );
145 ++mnSize;
146 }
147 else
148 {
149 nSstIndex = aIt->mnSstIndex;
150 }
151
152 return nSstIndex;
153}
154
156{
157 if( maStringVector.empty() )
158 return;
159
160 SvMemoryStream aExtSst( 8192 );
161
162 sal_uInt32 nBucket = mnSize;
163 while( nBucket > 0x0100 )
164 nBucket /= 2;
165
166 sal_uInt16 nPerBucket = llimit_cast< sal_uInt16 >( nBucket, 8 );
167 sal_uInt16 nBucketIndex = 0;
168
169 // *** write the SST record ***
170
171 rStrm.StartRecord( EXC_ID_SST, 8 );
172
173 rStrm << mnTotal << mnSize;
174 for (auto const& elem : maStringVector)
175 {
176 if( !nBucketIndex )
177 {
178 // write bucket info before string to get correct record position
179 sal_uInt32 nStrmPos = static_cast< sal_uInt32 >( rStrm.GetSvStreamPos() );
180 sal_uInt16 nRecPos = rStrm.GetRawRecPos() + 4;
181 aExtSst.WriteUInt32( nStrmPos ) // stream position
182 .WriteUInt16( nRecPos ) // position from start of SST or CONTINUE
183 .WriteUInt16( 0 ); // reserved
184 }
185
186 rStrm << *elem;
187
188 if( ++nBucketIndex == nPerBucket )
189 nBucketIndex = 0;
190 }
191
192 rStrm.EndRecord();
193
194 // *** write the EXTSST record ***
195
196 rStrm.StartRecord( EXC_ID_EXTSST, 0 );
197
198 rStrm << nPerBucket;
199 rStrm.SetSliceSize( 8 ); // size of one bucket info
200 aExtSst.Seek( STREAM_SEEK_TO_BEGIN );
201 rStrm.CopyFromStream( aExtSst );
202
203 rStrm.EndRecord();
204}
205
207{
208 if( maStringVector.empty() )
209 return;
210
211 sax_fastparser::FSHelperPtr pSst = rStrm.CreateOutputStream(
212 "xl/sharedStrings.xml",
213 u"sharedStrings.xml",
214 rStrm.GetCurrentStream()->getOutputStream(),
215 "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
216 oox::getRelationship(Relationship::SHAREDSTRINGS));
217 rStrm.PushStream( pSst );
218
219 pSst->startElement( XML_sst,
220 XML_xmlns, rStrm.getNamespaceURL(OOX_NS(xls)),
221 XML_count, OString::number(mnTotal),
222 XML_uniqueCount, OString::number(mnSize) );
223
224 for (auto const& elem : maStringVector)
225 {
226 pSst->startElement(XML_si);
227 elem->WriteXml( rStrm );
228 pSst->endElement( XML_si );
229 }
230
231 pSst->endElement( XML_sst );
232
233 rStrm.PopStream();
234}
235
237 mxImpl( new XclExpSstImpl )
238{
239}
240
242{
243}
244
245sal_uInt32 XclExpSst::Insert( const XclExpStringRef& xString )
246{
247 return mxImpl->Insert( xString );
248}
249
251{
252 mxImpl->Save( rStrm );
253}
254
256{
257 mxImpl->SaveXml( rStrm );
258}
259
260// Merged cells ===============================================================
261
263 XclExpRoot( rRoot )
264{
265}
266
267void XclExpMergedcells::AppendRange( const ScRange& rRange, sal_uInt32 nBaseXFId )
268{
269 if( GetBiff() == EXC_BIFF8 )
270 {
271 maMergedRanges.push_back( rRange );
272 maBaseXFIds.push_back( nBaseXFId );
273 }
274}
275
276sal_uInt32 XclExpMergedcells::GetBaseXFId( const ScAddress& rPos ) const
277{
278 OSL_ENSURE( maBaseXFIds.size() == maMergedRanges.size(), "XclExpMergedcells::GetBaseXFId - invalid lists" );
279 ScfUInt32Vec::const_iterator aIt = maBaseXFIds.begin();
280 ScRangeList& rNCRanges = const_cast< ScRangeList& >( maMergedRanges );
281 for ( size_t i = 0, nRanges = rNCRanges.size(); i < nRanges; ++i, ++aIt )
282 {
283 const ScRange & rScRange = rNCRanges[ i ];
284 if( rScRange.Contains( rPos ) )
285 return *aIt;
286 }
287 return EXC_XFID_NOTFOUND;
288}
289
291{
292 if( GetBiff() != EXC_BIFF8 )
293 return;
294
295 XclRangeList aXclRanges;
297 size_t nFirstRange = 0;
298 size_t nRemainingRanges = aXclRanges.size();
299 while( nRemainingRanges > 0 )
300 {
301 size_t nRangeCount = ::std::min< size_t >( nRemainingRanges, EXC_MERGEDCELLS_MAXCOUNT );
302 rStrm.StartRecord( EXC_ID_MERGEDCELLS, 2 + 8 * nRangeCount );
303 aXclRanges.WriteSubList( rStrm, nFirstRange, nRangeCount );
304 rStrm.EndRecord();
305 nFirstRange += nRangeCount;
306 nRemainingRanges -= nRangeCount;
307 }
308}
309
311{
312 size_t nCount = maMergedRanges.size();
313 if( !nCount )
314 return;
315 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
316 rWorksheet->startElement(XML_mergeCells, XML_count, OString::number(nCount));
317 for( size_t i = 0; i < nCount; ++i )
318 {
319 const ScRange & rRange = maMergedRanges[ i ];
320 rWorksheet->singleElement(XML_mergeCell, XML_ref,
321 XclXmlUtils::ToOString(rStrm.GetRoot().GetDoc(), rRange));
322 }
323 rWorksheet->endElement( XML_mergeCells );
324}
325
326// Hyperlinks =================================================================
327
328XclExpHyperlink::XclExpHyperlink( const XclExpRoot& rRoot, const SvxURLField& rUrlField, const ScAddress& rScPos ) :
330 maScPos( rScPos ),
331 mxVarData( new SvMemoryStream ),
332 mnFlags( 0 )
333{
334 const OUString& rUrl = rUrlField.GetURL();
335 const OUString& rRepr = rUrlField.GetRepresentation();
336 INetURLObject aUrlObj( rUrl );
337 const INetProtocol eProtocol = aUrlObj.GetProtocol();
338 bool bWithRepr = !rRepr.isEmpty();
339 XclExpStream aXclStrm( *mxVarData, rRoot ); // using in raw write mode.
340
341 // description
342 if( bWithRepr )
343 {
344 XclExpString aDescr( rRepr, XclStrFlags::ForceUnicode, 255 );
345 aXclStrm << sal_uInt32( aDescr.Len() + 1 ); // string length + 1 trailing zero word
346 aDescr.WriteBuffer( aXclStrm ); // NO flags
347 aXclStrm << sal_uInt16( 0 );
348
350 m_Repr = rRepr;
351 }
352
353 // file link or URL
354 if( eProtocol == INetProtocol::File || eProtocol == INetProtocol::Smb )
355 {
356 sal_uInt16 nLevel;
357 bool bRel;
358 OUString aFileName(
359 BuildFileName(nLevel, bRel, rUrl, rRoot, rRoot.GetOutput() == EXC_OUTPUT_XML_2007));
360
361 if( eProtocol == INetProtocol::Smb )
362 {
363 // #n382718# (and #n261623#) Convert smb notation to '\\'
365 aFileName = aFileName.copy(4); // skip the 'smb:' part
366 aFileName = aFileName.replace('/', '\\');
367 }
368
369 if( !bRel )
372
373 OString aAsciiLink(OUStringToOString(aFileName,
374 rRoot.GetTextEncoding()));
375 XclExpString aLink( aFileName, XclStrFlags::ForceUnicode, 255 );
377 << nLevel
378 << sal_uInt32( aAsciiLink.getLength() + 1 ); // string length + 1 trailing zero byte
379 aXclStrm.Write( aAsciiLink.getStr(), aAsciiLink.getLength() );
380 aXclStrm << sal_uInt8( 0 )
381 << sal_uInt32( 0xDEADFFFF );
382 aXclStrm.WriteZeroBytes( 20 );
383 aXclStrm << sal_uInt32( aLink.GetBufferSize() + 6 )
384 << sal_uInt32( aLink.GetBufferSize() ) // byte count, not string length
385 << sal_uInt16( 0x0003 );
386 aLink.WriteBuffer( aXclStrm ); // NO flags
387
388 if (m_Repr.isEmpty())
389 m_Repr = aFileName;
390
392
393 if( bRel )
394 {
395 for( int i = 0; i < nLevel; ++i )
396 msTarget = "../" + msTarget;
397 }
398 else if (rRoot.GetOutput() != EXC_OUTPUT_XML_2007)
399 {
400 // xls expects the file:/// part appended ( or at least
401 // ms2007 does, ms2010 is more tolerant )
402 msTarget = "file:///" + msTarget;
403 }
404 }
405 else if( eProtocol != INetProtocol::NotValid )
406 {
409 << sal_uInt32( aUrl.GetBufferSize() + 2 ); // byte count + 1 trailing zero word
410 aUrl.WriteBuffer( aXclStrm ); // NO flags
411 aXclStrm << sal_uInt16( 0 );
412
414 if (m_Repr.isEmpty())
415 m_Repr = rUrl;
416
418 }
419 else if( !rUrl.isEmpty() && rUrl[0] == '#' ) // hack for #89066#
420 {
421 OUString aTextMark( rUrl.copy( 1 ) );
422
423 sal_Int32 nSepPos = aTextMark.lastIndexOf( '!' );
424 sal_Int32 nPointPos = aTextMark.lastIndexOf( '.' );
425 // last dot is the separator, if there is no ! after it
426 if(nSepPos < nPointPos)
427 {
428 nSepPos = nPointPos;
429 aTextMark = aTextMark.replaceAt( nSepPos, 1, u"!" );
430 }
431
432 if (nSepPos != -1)
433 {
434 std::u16string_view aSheetName(aTextMark.subView(0, nSepPos));
435
436 if (aSheetName.find(' ') != std::u16string_view::npos && aSheetName[0] != '\'')
437 {
438 aTextMark = "'" + aTextMark.replaceAt(nSepPos, 0, u"'");
439 }
440 }
441 else
442 {
443 SCTAB nTab;
444 if (rRoot.GetDoc().GetTable(aTextMark, nTab))
445 aTextMark += "!A1"; // tdf#143220 link to sheet not valid without cell reference
446 }
447
448 mxTextMark.reset( new XclExpString( aTextMark, XclStrFlags::ForceUnicode, 255 ) );
449 }
450
451 // text mark
452 if( !mxTextMark && aUrlObj.HasMark() )
453 mxTextMark.reset( new XclExpString( aUrlObj.GetMark(), XclStrFlags::ForceUnicode, 255 ) );
454
455 if( mxTextMark )
456 {
457 aXclStrm << sal_uInt32( mxTextMark->Len() + 1 ); // string length + 1 trailing zero word
458 mxTextMark->WriteBuffer( aXclStrm ); // NO flags
459 aXclStrm << sal_uInt16( 0 );
460
462
463 OUString location = XclXmlUtils::ToOUString(*mxTextMark);
464 if (!location.isEmpty() && msTarget.endsWith(OUStringConcatenation("#" + location)))
465 msTarget = msTarget.copy(0, msTarget.getLength() - location.getLength() - 1);
466 }
467
468 SetRecSize( 32 + mxVarData->Tell() );
469}
470
472{
473}
474
476 sal_uInt16& rnLevel, bool& rbRel, const OUString& rUrl, const XclExpRoot& rRoot, bool bEncoded )
477{
478 INetURLObject aURLObject( rUrl );
479 OUString aDosName(bEncoded ? aURLObject.GetMainURL(INetURLObject::DecodeMechanism::ToIUri)
480 : aURLObject.getFSysPath(FSysStyle::Dos));
481 rnLevel = 0;
482 rbRel = rRoot.IsRelUrl();
483
484 if( rbRel )
485 {
486 // try to convert to relative file name
487 OUString aTmpName( aDosName );
488 aDosName = INetURLObject::GetRelURL( rRoot.GetBasePath(), rUrl,
491
492 if (aDosName.startsWith(INET_FILE_SCHEME))
493 {
494 // not converted to rel -> back to old, return absolute flag
495 aDosName = aTmpName;
496 rbRel = false;
497 }
498 else if (aDosName.startsWith("./"))
499 {
500 aDosName = aDosName.copy(2);
501 }
502 else
503 {
504 while (aDosName.startsWith("../"))
505 {
506 aDosName = aDosName.copy(3);
507 ++rnLevel;
508 }
509 }
510 }
511 return aDosName;
512}
513
515{
516 sal_uInt16 nXclCol = static_cast< sal_uInt16 >( maScPos.Col() );
517 sal_uInt16 nXclRow = static_cast< sal_uInt16 >( maScPos.Row() );
518 rStrm << nXclRow << nXclRow << nXclCol << nXclCol;
520}
521
523{
525 << sal_uInt32( 2 )
526 << mnFlags;
527
529 rStrm.CopyFromStream( *mxVarData );
530}
531
533{
534 OUString sId = !msTarget.isEmpty() ? rStrm.addRelation( rStrm.GetCurrentStream()->getOutputStream(),
535 oox::getRelationship(Relationship::HYPERLINK),
536 msTarget, true ) : OUString();
537 std::optional<OString> sTextMark;
538 if (mxTextMark)
540 rStrm.GetCurrentStream()->singleElement( XML_hyperlink,
541 XML_ref, XclXmlUtils::ToOString(rStrm.GetRoot().GetDoc(), maScPos),
542 FSNS( XML_r, XML_id ), sax_fastparser::UseIf(sId, !sId.isEmpty()),
543 XML_location, sTextMark,
544 // OOXTODO: XML_tooltip, from record HLinkTooltip 800h wzTooltip
545 XML_display, m_Repr );
546}
547
548// Label ranges ===============================================================
549
551 XclExpRoot( rRoot )
552{
553 SCTAB nScTab = GetCurrScTab();
554 // row label ranges
556 // row labels only over 1 column (restriction of Excel97/2000/XP)
557 for ( size_t i = 0, nRanges = maRowRanges.size(); i < nRanges; ++i )
558 {
559 ScRange & rScRange = maRowRanges[ i ];
560 if( rScRange.aStart.Col() != rScRange.aEnd.Col() )
561 rScRange.aEnd.SetCol( rScRange.aStart.Col() );
562 }
563 // col label ranges
565}
566
568 const ScRangePairListRef& xLabelRangesRef, SCTAB nScTab )
569{
570 for ( size_t i = 0, nPairs = xLabelRangesRef->size(); i < nPairs; ++i )
571 {
572 const ScRangePair & rRangePair = (*xLabelRangesRef)[i];
573 const ScRange& rScRange = rRangePair.GetRange( 0 );
574 if( rScRange.aStart.Tab() == nScTab )
575 rScRanges.push_back( rScRange );
576 }
577}
578
580{
582 XclRangeList aRowXclRanges, aColXclRanges;
583 rAddrConv.ConvertRangeList( aRowXclRanges, maRowRanges, false );
584 rAddrConv.ConvertRangeList( aColXclRanges, maColRanges, false );
585 if( !aRowXclRanges.empty() || !aColXclRanges.empty() )
586 {
587 rStrm.StartRecord( EXC_ID_LABELRANGES, 4 + 8 * (aRowXclRanges.size() + aColXclRanges.size()) );
588 rStrm << aRowXclRanges << aColXclRanges;
589 rStrm.EndRecord();
590 }
591}
592
593// Conditional formatting ====================================================
594
596class XclExpCFImpl : protected XclExpRoot
597{
598public:
599 explicit XclExpCFImpl( const XclExpRoot& rRoot, const ScCondFormatEntry& rFormatEntry, sal_Int32 nPriority, ScAddress aOrigin );
600
604
605private:
613 sal_uInt32 mnFontColorId;
616 sal_Int32 mnPriority;
627};
628
629XclExpCFImpl::XclExpCFImpl( const XclExpRoot& rRoot, const ScCondFormatEntry& rFormatEntry, sal_Int32 nPriority, ScAddress aOrigin ) :
630 XclExpRoot( rRoot ),
631 mrFormatEntry( rFormatEntry ),
632 maOrigin( aOrigin ),
633 mnFontColorId( 0 ),
635 mnOperator( EXC_CF_CMP_NONE ),
636 mnPriority( nPriority ),
637 mbFontUsed( false ),
638 mbHeightUsed( false ),
639 mbWeightUsed( false ),
640 mbColorUsed( false ),
641 mbUnderlUsed( false ),
642 mbItalicUsed( false ),
643 mbStrikeUsed( false ),
644 mbBorderUsed( false ),
645 mbPattUsed( false ),
646 mbFormula2(false)
647{
648 // Set correct tab for maOrigin from GetValidSrcPos() of the format-entry.
649 ScAddress aValidSrcPos = mrFormatEntry.GetValidSrcPos();
650 maOrigin.SetTab(aValidSrcPos.Tab());
651
652 /* Get formatting attributes here, and not in WriteBody(). This is needed to
653 correctly insert all colors into the palette. */
654
655 if( SfxStyleSheetBase* pStyleSheet = GetDoc().GetStyleSheetPool()->Find( mrFormatEntry.GetStyle(), SfxStyleFamily::Para ) )
656 {
657 const SfxItemSet& rItemSet = pStyleSheet->GetItemSet();
658
659 // font
667 if( mbFontUsed )
668 {
669 vcl::Font aFont;
670 ScPatternAttr::GetFont( aFont, rItemSet, SC_AUTOCOL_RAW );
673 }
674
675 // border
676 mbBorderUsed = ScfTools::CheckItem( rItemSet, ATTR_BORDER, true );
677 if( mbBorderUsed )
678 maBorder.FillFromItemSet( rItemSet, GetPalette(), GetBiff() );
679
680 // pattern
682 if( mbPattUsed )
683 maArea.FillFromItemSet( rItemSet, GetPalette(), true );
684 }
685
686 // *** mode and comparison operator ***
687
688 switch( rFormatEntry.GetOperation() )
689 {
692 break;
695 mbFormula2 = true;
696 break;
699 mbFormula2 = true;
700 break;
703 break;
706 break;
709 break;
712 break;
715 break;
718 break;
721 break;
722 default:
724 OSL_FAIL( "XclExpCF::WriteBody - unknown condition type" );
725 }
726}
727
729{
730
731 // *** formulas ***
732
734
735 std::unique_ptr< ScTokenArray > xScTokArr( mrFormatEntry.CreateFlatCopiedTokenArray( 0 ) );
736 mxTokArr1 = rFmlaComp.CreateFormula( EXC_FMLATYPE_CONDFMT, *xScTokArr );
737
738 if (mbFormula2)
739 {
741 mxTokArr2 = rFmlaComp.CreateFormula( EXC_FMLATYPE_CONDFMT, *xScTokArr );
742 }
743
744 // *** mode and comparison operator ***
745
746 rStrm << mnType << mnOperator;
747
748 // *** formula sizes ***
749
750 sal_uInt16 nFmlaSize1 = mxTokArr1 ? mxTokArr1->GetSize() : 0;
751 sal_uInt16 nFmlaSize2 = mxTokArr2 ? mxTokArr2->GetSize() : 0;
752 rStrm << nFmlaSize1 << nFmlaSize2;
753
754 // *** formatting blocks ***
755
757 {
758 sal_uInt32 nFlags = EXC_CF_ALLDEFAULT;
759
763
764 // attributes used -> set flags to 0.
767
768 rStrm << nFlags << sal_uInt16( 0 );
769
770 if( mbFontUsed )
771 {
772 // font height, 0xFFFFFFFF indicates unused
773 sal_uInt32 nHeight = mbHeightUsed ? maFontData.mnHeight : 0xFFFFFFFF;
774 // font style: italic and strikeout
775 sal_uInt32 nStyle = 0;
778 // font color, 0xFFFFFFFF indicates unused
779 sal_uInt32 nColor = mbColorUsed ? GetPalette().GetColorIndex( mnFontColorId ) : 0xFFFFFFFF;
780 // font used flags for italic, weight, and strikeout -> 0 = used, 1 = default
781 sal_uInt32 nFontFlags1 = EXC_CF_FONT_ALLDEFAULT;
784 // font used flag for underline -> 0 = used, 1 = default
785 sal_uInt32 nFontFlags3 = mbUnderlUsed ? 0 : EXC_CF_FONT_UNDERL;
786
787 rStrm.WriteZeroBytesToRecord( 64 );
788 rStrm << nHeight
789 << nStyle
793 rStrm.WriteZeroBytesToRecord( 3 );
794 rStrm << nColor
795 << sal_uInt32( 0 )
796 << nFontFlags1
797 << EXC_CF_FONT_ESCAPEM // escapement never used -> set the flag
798 << nFontFlags3;
799 rStrm.WriteZeroBytesToRecord( 16 );
800 rStrm << sal_uInt16( 1 ); // must be 1
801 }
802
803 if( mbBorderUsed )
804 {
805 sal_uInt16 nLineStyle = 0;
806 sal_uInt32 nLineColor = 0;
808 maBorder.FillToCF8( nLineStyle, nLineColor );
809 rStrm << nLineStyle << nLineColor << sal_uInt16( 0 );
810 }
811
812 if( mbPattUsed )
813 {
814 sal_uInt16 nPattern = 0, nColor = 0;
816 maArea.FillToCF8( nPattern, nColor );
817 rStrm << nPattern << nColor;
818 }
819 }
820 else
821 {
822 // no data blocks at all
823 rStrm << sal_uInt32( 0 ) << sal_uInt16( 0 );
824 }
825
826 // *** formulas ***
827
828 if( mxTokArr1 )
829 mxTokArr1->WriteArray( rStrm );
830 if( mxTokArr2 )
831 mxTokArr2->WriteArray( rStrm );
832}
833
834namespace {
835
836const char* GetOperatorString(ScConditionMode eMode, bool& bFrmla2)
837{
838 const char *pRet = nullptr;
839 switch(eMode)
840 {
842 pRet = "equal";
843 break;
845 pRet = "lessThan";
846 break;
848 pRet = "greaterThan";
849 break;
851 pRet = "lessThanOrEqual";
852 break;
854 pRet = "greaterThanOrEqual";
855 break;
857 pRet = "notEqual";
858 break;
860 bFrmla2 = true;
861 pRet = "between";
862 break;
864 bFrmla2 = true;
865 pRet = "notBetween";
866 break;
868 pRet = nullptr;
869 break;
871 pRet = nullptr;
872 break;
874 pRet = "beginsWith";
875 break;
877 pRet = "endsWith";
878 break;
880 pRet = "containsText";
881 break;
883 pRet = "notContains";
884 break;
886 break;
888 default:
889 break;
890 }
891 return pRet;
892}
893
894const char* GetTypeString(ScConditionMode eMode)
895{
896 switch(eMode)
897 {
899 return "expression";
904 return "top10";
909 return "aboveAverage";
911 return "uniqueValues";
913 return "duplicateValues";
915 return "containsErrors";
917 return "notContainsErrors";
919 return "beginsWith";
921 return "endsWith";
923 return "containsText";
925 return "notContainsText";
926 default:
927 return "cellIs";
928 }
929}
930
931bool IsTopBottomRule(ScConditionMode eMode)
932{
933 switch(eMode)
934 {
939 return true;
940 default:
941 break;
942 }
943
944 return false;
945}
946
947bool IsTextRule(ScConditionMode eMode)
948{
949 switch(eMode)
950 {
955 return true;
956 default:
957 break;
958 }
959
960 return false;
961}
962
963bool RequiresFormula(ScConditionMode eMode)
964{
965 if (IsTopBottomRule(eMode))
966 return false;
967 else if (IsTextRule(eMode))
968 return false;
969
970 switch (eMode)
971 {
976 return false;
977 default:
978 break;
979 }
980
981 return true;
982}
983
984bool RequiresFixedFormula(ScConditionMode eMode)
985{
986 switch(eMode)
987 {
994 return true;
995 default:
996 break;
997 }
998
999 return false;
1000}
1001
1002OString GetFixedFormula(ScConditionMode eMode, const ScAddress& rAddress, std::string_view rText)
1003{
1004 OStringBuffer aBuffer;
1005 XclXmlUtils::ToOString(aBuffer, rAddress);
1006 OString aPos = aBuffer.makeStringAndClear();
1007 switch (eMode)
1008 {
1010 return OString("ISERROR(" + aPos + ")") ;
1012 return OString("NOT(ISERROR(" + aPos + "))") ;
1014 return OString("LEFT(" + aPos + ",LEN(\"" + rText + "\"))=\"" + rText + "\"");
1016 return OString("RIGHT(" + aPos +",LEN(\"" + rText + "\"))=\"" + rText + "\"");
1018 return OString(OString::Concat("NOT(ISERROR(SEARCH(\"") + rText + "\"," + aPos + ")))");
1020 return OString(OString::Concat("ISERROR(SEARCH(\"") + rText + "\"," + aPos + "))");
1021 default:
1022 break;
1023 }
1024
1025 return "";
1026}
1027
1028}
1029
1031{
1032 bool bFmla2 = false;
1034 bool bAboveAverage = eOperation == ScConditionMode::AboveAverage ||
1036 bool bEqualAverage = eOperation == ScConditionMode::AboveEqualAverage ||
1038 bool bBottom = eOperation == ScConditionMode::Bottom10
1039 || eOperation == ScConditionMode::BottomPercent;
1040 bool bPercent = eOperation == ScConditionMode::TopPercent ||
1041 eOperation == ScConditionMode::BottomPercent;
1042 OUString aRank("0");
1043 if(IsTopBottomRule(eOperation))
1044 {
1045 // position and formula grammar are not important
1046 // we only store a number there
1047 aRank = mrFormatEntry.GetExpression(ScAddress(0,0,0), 0);
1048 }
1049 OString aText;
1050 if(IsTextRule(eOperation))
1051 {
1052 // we need to write the text without quotes
1053 // we have to actually get the string from
1054 // the token array for that
1055 std::unique_ptr<ScTokenArray> pTokenArray(mrFormatEntry.CreateFlatCopiedTokenArray(0));
1056 if(pTokenArray->GetLen())
1057 aText = pTokenArray->FirstToken()->GetString().getString().toUtf8();
1058 }
1059
1060 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1061 rWorksheet->startElement( XML_cfRule,
1062 XML_type, GetTypeString( mrFormatEntry.GetOperation() ),
1063 XML_priority, OString::number(mnPriority + 1),
1064 XML_operator, GetOperatorString( mrFormatEntry.GetOperation(), bFmla2 ),
1065 XML_aboveAverage, ToPsz10(bAboveAverage),
1066 XML_equalAverage, ToPsz10(bEqualAverage),
1067 XML_bottom, ToPsz10(bBottom),
1068 XML_percent, ToPsz10(bPercent),
1069 XML_rank, aRank,
1070 XML_text, aText,
1071 XML_dxfId, OString::number(GetDxfs().GetDxfId(mrFormatEntry.GetStyle())) );
1072
1073 if (RequiresFixedFormula(eOperation))
1074 {
1075 rWorksheet->startElement(XML_formula);
1076 OString aFormula = GetFixedFormula(eOperation, maOrigin, aText);
1077 rWorksheet->writeEscaped(aFormula.getStr());
1078 rWorksheet->endElement( XML_formula );
1079 }
1080 else if(RequiresFormula(eOperation))
1081 {
1082 rWorksheet->startElement(XML_formula);
1083 std::unique_ptr<ScTokenArray> pTokenArray(mrFormatEntry.CreateFlatCopiedTokenArray(0));
1085 pTokenArray.get()));
1086 rWorksheet->endElement( XML_formula );
1087 if (bFmla2)
1088 {
1089 rWorksheet->startElement(XML_formula);
1090 std::unique_ptr<ScTokenArray> pTokenArray2(mrFormatEntry.CreateFlatCopiedTokenArray(1));
1092 pTokenArray2.get()));
1093 rWorksheet->endElement( XML_formula );
1094 }
1095 }
1096 // OOXTODO: XML_extLst
1097 rWorksheet->endElement( XML_cfRule );
1098}
1099
1100XclExpCF::XclExpCF( const XclExpRoot& rRoot, const ScCondFormatEntry& rFormatEntry, sal_Int32 nPriority, ScAddress aOrigin ) :
1102 XclExpRoot( rRoot ),
1103 mxImpl( new XclExpCFImpl( rRoot, rFormatEntry, nPriority, aOrigin ) )
1104{
1105}
1106
1108{
1109}
1110
1112{
1113 mxImpl->WriteBody( rStrm );
1114}
1115
1117{
1118 mxImpl->SaveXml( rStrm );
1119}
1120
1121XclExpDateFormat::XclExpDateFormat( const XclExpRoot& rRoot, const ScCondDateFormatEntry& rFormatEntry, sal_Int32 nPriority ):
1123 XclExpRoot( rRoot ),
1124 mrFormatEntry(rFormatEntry),
1125 mnPriority(nPriority)
1126{
1127}
1128
1130{
1131}
1132
1133namespace {
1134
1135const char* getTimePeriodString( condformat::ScCondFormatDateType eType )
1136{
1137 switch(eType)
1138 {
1139 case condformat::TODAY:
1140 return "today";
1142 return "yesterday";
1144 return "yesterday";
1146 return "thisWeek";
1148 return "lastWeek";
1150 return "nextWeek";
1152 return "thisMonth";
1154 return "lastMonth";
1156 return "nextMonth";
1158 return "last7Days";
1159 default:
1160 break;
1161 }
1162 return nullptr;
1163}
1164
1165}
1166
1168{
1169 // only write the supported entries into OOXML
1170 const char* sTimePeriod = getTimePeriodString(mrFormatEntry.GetDateType());
1171 if(!sTimePeriod)
1172 return;
1173
1174 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1175 rWorksheet->startElement( XML_cfRule,
1176 XML_type, "timePeriod",
1177 XML_priority, OString::number(mnPriority + 1),
1178 XML_timePeriod, sTimePeriod,
1179 XML_dxfId, OString::number(GetDxfs().GetDxfId(mrFormatEntry.GetStyleName())) );
1180 rWorksheet->endElement( XML_cfRule);
1181}
1182
1183XclExpCfvo::XclExpCfvo(const XclExpRoot& rRoot, const ScColorScaleEntry& rEntry, const ScAddress& rAddr, bool bFirst):
1184 XclExpRoot( rRoot ),
1185 mrEntry(rEntry),
1186 maSrcPos(rAddr),
1187 mbFirst(bFirst)
1188{
1189}
1190
1191namespace {
1192
1193OString getColorScaleType( const ScColorScaleEntry& rEntry, bool bFirst )
1194{
1195 switch(rEntry.GetType())
1196 {
1197 case COLORSCALE_MIN:
1198 return "min";
1199 case COLORSCALE_MAX:
1200 return "max";
1201 case COLORSCALE_PERCENT:
1202 return "percent";
1203 case COLORSCALE_FORMULA:
1204 return "formula";
1205 case COLORSCALE_AUTO:
1206 if(bFirst)
1207 return "min";
1208 else
1209 return "max";
1211 return "percentile";
1212 default:
1213 break;
1214 }
1215
1216 return "num";
1217}
1218
1219}
1220
1222{
1223 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1224
1225 OString aValue;
1227 {
1230 aValue = OUStringToOString(aFormula, RTL_TEXTENCODING_UTF8 );
1231 }
1232 else
1233 {
1234 aValue = OString::number( mrEntry.GetValue() );
1235 }
1236
1237 rWorksheet->startElement( XML_cfvo,
1238 XML_type, getColorScaleType(mrEntry, mbFirst),
1239 XML_val, aValue );
1240
1241 rWorksheet->endElement( XML_cfvo );
1242}
1243
1245 XclExpRoot( rRoot ),
1246 mrColor( rColor )
1247{
1248}
1249
1251{
1252}
1253
1255{
1256 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1257
1258 rWorksheet->startElement(XML_color, XML_rgb, XclXmlUtils::ToOString(mrColor));
1259
1260 rWorksheet->endElement( XML_color );
1261}
1262
1263namespace {
1264
1265OString createHexStringFromDigit(sal_uInt8 nDigit)
1266{
1267 OString aString = OString::number( nDigit, 16 );
1268 if(aString.getLength() == 1)
1269 aString += OString::number(0);
1270 return aString;
1271}
1272
1273OString createGuidStringFromInt(sal_uInt8 nGuid[16])
1274{
1275 OStringBuffer aBuffer;
1276 aBuffer.append('{');
1277 for(size_t i = 0; i < 16; ++i)
1278 {
1279 aBuffer.append(createHexStringFromDigit(nGuid[i]));
1280 if(i == 3|| i == 5 || i == 7 || i == 9 )
1281 aBuffer.append('-');
1282 }
1283 aBuffer.append('}');
1284 OString aString = aBuffer.makeStringAndClear();
1285 return aString.toAsciiUpperCase();
1286}
1287
1288OString generateGUIDString()
1289{
1290 sal_uInt8 nGuid[16];
1291 rtl_createUuid(nGuid, nullptr, true);
1292 return createGuidStringFromInt(nGuid);
1293}
1294
1295}
1296
1297XclExpCondfmt::XclExpCondfmt( const XclExpRoot& rRoot, const ScConditionalFormat& rCondFormat, const XclExtLstRef& xExtLst, sal_Int32& rIndex ) :
1299 XclExpRoot( rRoot )
1300{
1301 const ScRangeList& aScRanges = rCondFormat.GetRange();
1302 GetAddressConverter().ConvertRangeList( maXclRanges, aScRanges, true );
1303 if( maXclRanges.empty() )
1304 return;
1305
1306 std::vector<XclExpExtCondFormatData> aExtEntries;
1307 ScAddress aOrigin = aScRanges.Combine().aStart;
1308 for( size_t nIndex = 0, nCount = rCondFormat.size(); nIndex < nCount; ++nIndex )
1309 if( const ScFormatEntry* pFormatEntry = rCondFormat.GetEntry( nIndex ) )
1310 {
1311 if(pFormatEntry->GetType() == ScFormatEntry::Type::Condition)
1312 maCFList.AppendNewRecord( new XclExpCF( GetRoot(), static_cast<const ScCondFormatEntry&>(*pFormatEntry), ++rIndex, aOrigin ) );
1313 else if(pFormatEntry->GetType() == ScFormatEntry::Type::ExtCondition)
1314 {
1315 const ScCondFormatEntry& rFormat = static_cast<const ScCondFormatEntry&>(*pFormatEntry);
1316 XclExpExtCondFormatData aExtEntry;
1317 aExtEntry.nPriority = ++rIndex;
1318 aExtEntry.aGUID = generateGUIDString();
1319 aExtEntry.pEntry = &rFormat;
1320 aExtEntries.push_back(aExtEntry);
1321 }
1322 else if(pFormatEntry->GetType() == ScFormatEntry::Type::Colorscale)
1323 maCFList.AppendNewRecord( new XclExpColorScale( GetRoot(), static_cast<const ScColorScaleFormat&>(*pFormatEntry), ++rIndex ) );
1324 else if(pFormatEntry->GetType() == ScFormatEntry::Type::Databar)
1325 {
1326 const ScDataBarFormat& rFormat = static_cast<const ScDataBarFormat&>(*pFormatEntry);
1327 XclExpExtCondFormatData aExtEntry;
1328 aExtEntry.nPriority = -1;
1329 aExtEntry.aGUID = generateGUIDString();
1330 aExtEntry.pEntry = &rFormat;
1331 aExtEntries.push_back(aExtEntry);
1332
1333 maCFList.AppendNewRecord( new XclExpDataBar( GetRoot(), rFormat, ++rIndex, aExtEntry.aGUID));
1334 }
1335 else if(pFormatEntry->GetType() == ScFormatEntry::Type::Iconset)
1336 {
1337 // don't export iconSet entries that are not in OOXML
1338 const ScIconSetFormat& rIconSet = static_cast<const ScIconSetFormat&>(*pFormatEntry);
1339 bool bNeedsExt = false;
1340 switch (rIconSet.GetIconSetData()->eIconSetType)
1341 {
1342 case IconSet_3Smilies:
1344 case IconSet_3Stars:
1345 case IconSet_3Triangles:
1346 case IconSet_5Boxes:
1347 {
1348 bNeedsExt = true;
1349 }
1350 break;
1351 default:
1352 break;
1353 }
1354
1355 bNeedsExt |= rIconSet.GetIconSetData()->mbCustom;
1356
1357 if (bNeedsExt)
1358 {
1359 XclExpExtCondFormatData aExtEntry;
1360 aExtEntry.nPriority = ++rIndex;
1361 aExtEntry.aGUID = generateGUIDString();
1362 aExtEntry.pEntry = &rIconSet;
1363 aExtEntries.push_back(aExtEntry);
1364 }
1365 else
1366 maCFList.AppendNewRecord( new XclExpIconSet( GetRoot(), rIconSet, ++rIndex ) );
1367 }
1368 else if(pFormatEntry->GetType() == ScFormatEntry::Type::Date)
1369 maCFList.AppendNewRecord( new XclExpDateFormat( GetRoot(), static_cast<const ScCondDateFormatEntry&>(*pFormatEntry), ++rIndex ) );
1370 }
1372
1373 if(!aExtEntries.empty() && xExtLst)
1374 {
1375 XclExpExt* pParent = xExtLst->GetItem( XclExpExtDataBarType );
1376 if( !pParent )
1377 {
1378 xExtLst->AddRecord( new XclExpExtCondFormat( *xExtLst ) );
1379 pParent = xExtLst->GetItem( XclExpExtDataBarType );
1380 }
1381 static_cast<XclExpExtCondFormat*>(xExtLst->GetItem( XclExpExtDataBarType ))->AddRecord(
1382 new XclExpExtConditionalFormatting( *pParent, aExtEntries, aScRanges));
1383 }
1384}
1385
1387{
1388}
1389
1391{
1392 // ccf (2 bytes): An unsigned integer that specifies the count of CF records that follow this
1393 // record. MUST be greater than or equal to 0x0001, and less than or equal to 0x0003.
1394
1395 SAL_WARN_IF( maCFList.GetSize() > 3, "sc.filter", "More than 3 conditional filters for cell(s), won't export");
1396
1397 return !maCFList.IsEmpty() && maCFList.GetSize() <= 3 && !maXclRanges.empty();
1398}
1399
1401{
1402 return !maCFList.IsEmpty() && !maXclRanges.empty();
1403}
1404
1406{
1407 if( IsValidForBinary() )
1408 {
1410 maCFList.Save( rStrm );
1411 }
1412}
1413
1415{
1416 OSL_ENSURE( !maCFList.IsEmpty(), "XclExpCondfmt::WriteBody - no CF records to write" );
1417 OSL_ENSURE( !maXclRanges.empty(), "XclExpCondfmt::WriteBody - no cell ranges found" );
1418
1419 rStrm << static_cast< sal_uInt16 >( maCFList.GetSize() )
1420 << sal_uInt16( 1 )
1422 << maXclRanges;
1423}
1424
1426{
1427 if( !IsValidForXml() )
1428 return;
1429
1430 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1431 rWorksheet->startElement( XML_conditionalFormatting,
1432 XML_sqref, msSeqRef
1433 // OOXTODO: XML_pivot
1434 );
1435
1437
1438 rWorksheet->endElement( XML_conditionalFormatting );
1439}
1440
1441XclExpColorScale::XclExpColorScale( const XclExpRoot& rRoot, const ScColorScaleFormat& rFormat, sal_Int32 nPriority ):
1442 XclExpRoot( rRoot ),
1443 mnPriority( nPriority )
1444{
1445 const ScRange & rRange = rFormat.GetRange().front();
1446 ScAddress aAddr = rRange.aStart;
1447 for(const auto& rxColorScaleEntry : rFormat)
1448 {
1449 // exact position is not important, we allow only absolute refs
1450
1451 XclExpCfvoList::RecordRefType xCfvo( new XclExpCfvo( GetRoot(), *rxColorScaleEntry, aAddr ) );
1452 maCfvoList.AppendRecord( xCfvo );
1453 XclExpColScaleColList::RecordRefType xClo( new XclExpColScaleCol( GetRoot(), rxColorScaleEntry->GetColor() ) );
1454 maColList.AppendRecord( xClo );
1455 }
1456}
1457
1459{
1460 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1461
1462 rWorksheet->startElement( XML_cfRule,
1463 XML_type, "colorScale",
1464 XML_priority, OString::number(mnPriority + 1) );
1465
1466 rWorksheet->startElement(XML_colorScale);
1467
1470
1471 rWorksheet->endElement( XML_colorScale );
1472
1473 rWorksheet->endElement( XML_cfRule );
1474}
1475
1476XclExpDataBar::XclExpDataBar( const XclExpRoot& rRoot, const ScDataBarFormat& rFormat, sal_Int32 nPriority, const OString& rGUID):
1477 XclExpRoot( rRoot ),
1478 mrFormat( rFormat ),
1479 mnPriority( nPriority ),
1480 maGUID(rGUID)
1481{
1482 const ScRange & rRange = rFormat.GetRange().front();
1483 ScAddress aAddr = rRange.aStart;
1484 // exact position is not important, we allow only absolute refs
1485 mpCfvoLowerLimit.reset(
1486 new XclExpCfvo(GetRoot(), *mrFormat.GetDataBarData()->mpLowerLimit, aAddr, true));
1487 mpCfvoUpperLimit.reset(
1488 new XclExpCfvo(GetRoot(), *mrFormat.GetDataBarData()->mpUpperLimit, aAddr, false));
1489
1491}
1492
1494{
1495 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1496
1497 rWorksheet->startElement( XML_cfRule,
1498 XML_type, "dataBar",
1499 XML_priority, OString::number(mnPriority + 1) );
1500
1501 rWorksheet->startElement( XML_dataBar,
1502 XML_showValue, ToPsz10(!mrFormat.GetDataBarData()->mbOnlyBar),
1503 XML_minLength, OString::number(sal_uInt32(mrFormat.GetDataBarData()->mnMinLength)),
1504 XML_maxLength, OString::number(sal_uInt32(mrFormat.GetDataBarData()->mnMaxLength)) );
1505
1506 mpCfvoLowerLimit->SaveXml(rStrm);
1507 mpCfvoUpperLimit->SaveXml(rStrm);
1508 mpCol->SaveXml(rStrm);
1509
1510 rWorksheet->endElement( XML_dataBar );
1511
1512 // extLst entries for Excel 2010 and 2013
1513 rWorksheet->startElement(XML_extLst);
1514 rWorksheet->startElement(XML_ext,
1515 FSNS(XML_xmlns, XML_x14), rStrm.getNamespaceURL(OOX_NS(xls14Lst)),
1516 XML_uri, "{B025F937-C7B1-47D3-B67F-A62EFF666E3E}");
1517
1518 rWorksheet->startElementNS( XML_x14, XML_id );
1519 rWorksheet->write(maGUID);
1520 rWorksheet->endElementNS( XML_x14, XML_id );
1521
1522 rWorksheet->endElement( XML_ext );
1523 rWorksheet->endElement( XML_extLst );
1524
1525 rWorksheet->endElement( XML_cfRule );
1526}
1527
1528XclExpIconSet::XclExpIconSet( const XclExpRoot& rRoot, const ScIconSetFormat& rFormat, sal_Int32 nPriority ):
1529 XclExpRoot( rRoot ),
1530 mrFormat( rFormat ),
1531 mnPriority( nPriority )
1532{
1533 const ScRange & rRange = rFormat.GetRange().front();
1534 ScAddress aAddr = rRange.aStart;
1535 for (auto const& itr : rFormat)
1536 {
1537 // exact position is not important, we allow only absolute refs
1538
1539 XclExpCfvoList::RecordRefType xCfvo( new XclExpCfvo( GetRoot(), *itr, aAddr ) );
1540 maCfvoList.AppendRecord( xCfvo );
1541 }
1542}
1543
1545{
1546 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1547
1548 rWorksheet->startElement( XML_cfRule,
1549 XML_type, "iconSet",
1550 XML_priority, OString::number(mnPriority + 1) );
1551
1553 rWorksheet->startElement( XML_iconSet,
1554 XML_iconSet, pIconSetName,
1557
1559
1560 rWorksheet->endElement( XML_iconSet );
1561 rWorksheet->endElement( XML_cfRule );
1562}
1563
1565 XclExpRoot( rRoot )
1566{
1567 if( const ScConditionalFormatList* pCondFmtList = GetDoc().GetCondFormList(GetCurrScTab()) )
1568 {
1569 sal_Int32 nIndex = 0;
1570 for( const auto& rxCondFmt : *pCondFmtList)
1571 {
1572 XclExpCondfmtList::RecordRefType xCondfmtRec( new XclExpCondfmt( GetRoot(), *rxCondFmt, xExtLst, nIndex ));
1573 if( xCondfmtRec->IsValidForXml() )
1574 maCondfmtList.AppendRecord( xCondfmtRec );
1575 }
1576 }
1577}
1578
1580{
1582}
1583
1585{
1587}
1588
1589// Validation =================================================================
1590
1591namespace {
1592
1594void lclWriteDvFormula( XclExpStream& rStrm, const XclTokenArray* pXclTokArr )
1595{
1596 sal_uInt16 nFmlaSize = pXclTokArr ? pXclTokArr->GetSize() : 0;
1597 rStrm << nFmlaSize << sal_uInt16( 0 );
1598 if( pXclTokArr )
1599 pXclTokArr->WriteArray( rStrm );
1600}
1601
1603void lclWriteDvFormula( XclExpStream& rStrm, const XclExpString& rString )
1604{
1605 // fake a formula with a single tStr token
1606 rStrm << static_cast< sal_uInt16 >( rString.GetSize() + 1 )
1607 << sal_uInt16( 0 )
1608 << EXC_TOKID_STR
1609 << rString;
1610}
1611
1612const char* lcl_GetValidationType( sal_uInt32 nFlags )
1613{
1614 switch( nFlags & EXC_DV_MODE_MASK )
1615 {
1616 case EXC_DV_MODE_ANY: return "none";
1617 case EXC_DV_MODE_WHOLE: return "whole";
1618 case EXC_DV_MODE_DECIMAL: return "decimal";
1619 case EXC_DV_MODE_LIST: return "list";
1620 case EXC_DV_MODE_DATE: return "date";
1621 case EXC_DV_MODE_TIME: return "time";
1622 case EXC_DV_MODE_TEXTLEN: return "textLength";
1623 case EXC_DV_MODE_CUSTOM: return "custom";
1624 }
1625 return nullptr;
1626}
1627
1628const char* lcl_GetOperatorType( sal_uInt32 nFlags )
1629{
1630 switch( nFlags & EXC_DV_COND_MASK )
1631 {
1632 case EXC_DV_COND_BETWEEN: return "between";
1633 case EXC_DV_COND_NOTBETWEEN: return "notBetween";
1634 case EXC_DV_COND_EQUAL: return "equal";
1635 case EXC_DV_COND_NOTEQUAL: return "notEqual";
1636 case EXC_DV_COND_GREATER: return "greaterThan";
1637 case EXC_DV_COND_LESS: return "lessThan";
1638 case EXC_DV_COND_EQGREATER: return "greaterThanOrEqual";
1639 case EXC_DV_COND_EQLESS: return "lessThanOrEqual";
1640 }
1641 return nullptr;
1642}
1643
1644const char* lcl_GetErrorType( sal_uInt32 nFlags )
1645{
1646 switch (nFlags & EXC_DV_ERROR_MASK)
1647 {
1648 case EXC_DV_ERROR_STOP: return "stop";
1649 case EXC_DV_ERROR_WARNING: return "warning";
1650 case EXC_DV_ERROR_INFO: return "information";
1651 }
1652 return nullptr;
1653}
1654
1655void lcl_SetValidationText(const OUString& rText, XclExpString& rValidationText)
1656{
1657 if ( !rText.isEmpty() )
1658 {
1659 // maximum length allowed in Excel is 255 characters
1660 if ( rText.getLength() > 255 )
1661 {
1662 OUStringBuffer aBuf( rText );
1663 rValidationText.Assign(
1664 comphelper::string::truncateToLength(aBuf, 255).makeStringAndClear() );
1665 }
1666 else
1667 rValidationText.Assign( rText );
1668 }
1669 else
1670 rValidationText.Assign( '\0' );
1671}
1672
1673} // namespace
1674
1675XclExpDV::XclExpDV( const XclExpRoot& rRoot, sal_uLong nScHandle ) :
1677 XclExpRoot( rRoot ),
1678 mnFlags( 0 ),
1679 mnScHandle( nScHandle )
1680{
1681 if( const ScValidationData* pValData = GetDoc().GetValidationEntry( mnScHandle ) )
1682 {
1683 // prompt box - empty string represented by single NUL character
1684 OUString aTitle, aText;
1685 bool bShowPrompt = pValData->GetInput( aTitle, aText );
1686 lcl_SetValidationText(aTitle, maPromptTitle);
1687 lcl_SetValidationText(aText, maPromptText);
1688
1689 // error box - empty string represented by single NUL character
1690 ScValidErrorStyle eScErrorStyle;
1691 bool bShowError = pValData->GetErrMsg( aTitle, aText, eScErrorStyle );
1692 lcl_SetValidationText(aTitle, maErrorTitle);
1693 lcl_SetValidationText(aText, maErrorText);
1694
1695 // flags
1696 switch( pValData->GetDataMode() )
1697 {
1698 case SC_VALID_ANY: mnFlags |= EXC_DV_MODE_ANY; break;
1701 case SC_VALID_LIST: mnFlags |= EXC_DV_MODE_LIST; break;
1702 case SC_VALID_DATE: mnFlags |= EXC_DV_MODE_DATE; break;
1703 case SC_VALID_TIME: mnFlags |= EXC_DV_MODE_TIME; break;
1706 default: OSL_FAIL( "XclExpDV::XclExpDV - unknown mode" );
1707 }
1708
1709 switch( pValData->GetOperation() )
1710 {
1720 default: OSL_FAIL( "XclExpDV::XclExpDV - unknown condition" );
1721 }
1722 switch( eScErrorStyle )
1723 {
1727 case SC_VALERR_MACRO:
1728 // set INFO for validity with macro call, delete title
1730 maErrorTitle.Assign( '\0' ); // contains macro name
1731 break;
1732 default: OSL_FAIL( "XclExpDV::XclExpDV - unknown error style" );
1733 }
1734 ::set_flag( mnFlags, EXC_DV_IGNOREBLANK, pValData->IsIgnoreBlank() );
1735 ::set_flag( mnFlags, EXC_DV_SUPPRESSDROPDOWN, pValData->GetListType() == css::sheet::TableValidationVisibility::INVISIBLE );
1736 ::set_flag( mnFlags, EXC_DV_SHOWPROMPT, bShowPrompt );
1737 ::set_flag( mnFlags, EXC_DV_SHOWERROR, bShowError );
1738
1739 // formulas
1741
1742 // first formula
1743 std::unique_ptr< ScTokenArray > xScTokArr = pValData->CreateFlatCopiedTokenArray( 0 );
1744 if (xScTokArr)
1745 {
1746 if( pValData->GetDataMode() == SC_VALID_LIST )
1747 {
1748 OUString aString;
1749 if( XclTokenArrayHelper::GetStringList( aString, *xScTokArr, '\n' ) )
1750 {
1751 bool bList = false;
1752 OUStringBuffer sListBuf;
1753 OUStringBuffer sFormulaBuf;
1754 sFormulaBuf.append( '"' );
1755 /* Formula is a list of string tokens -> build the Excel string.
1756 Data validity is BIFF8 only (important for the XclExpString object).
1757 Excel uses the NUL character as string list separator. */
1759 if (!aString.isEmpty())
1760 {
1761 sal_Int32 nStringIx = 0;
1762 for(;;)
1763 {
1764 const std::u16string_view aToken( o3tl::getToken(aString, 0, '\n', nStringIx ) );
1765 if (aToken.find(',') != std::u16string_view::npos)
1766 {
1767 sListBuf.append('"');
1768 sListBuf.append(aToken);
1769 sListBuf.append('"');
1770 bList = true;
1771 }
1772 else
1773 sListBuf.append(aToken);
1774 mxString1->Append( aToken );
1775 sFormulaBuf.append( aToken );
1776 if (nStringIx<0)
1777 break;
1778 mxString1->Append(u"\0");
1779 sFormulaBuf.append( ',' );
1780 sListBuf.append( ',' );
1781 }
1782 }
1784
1785 // maximum length allowed in Excel is 255 characters, and don't end with an empty token
1786 // It should be 8192 but Excel doesn't accept it for unknown reason
1787 // See also https://bugs.documentfoundation.org/show_bug.cgi?id=137167#c2 for more details
1788 sal_uInt32 nLen = sFormulaBuf.getLength();
1789 if( nLen > 256 ) // 255 + beginning quote mark
1790 {
1791 nLen = 256;
1792 if( sFormulaBuf[nLen - 1] == ',' )
1793 --nLen;
1794 sFormulaBuf.truncate(nLen);
1795 }
1796
1797 sFormulaBuf.append( '"' );
1798 msFormula1 = sFormulaBuf.makeStringAndClear();
1799 if (bList)
1800 msList = sListBuf.makeStringAndClear();
1801 else
1802 sListBuf.remove(0, sListBuf.getLength());
1803 }
1804 else
1805 {
1806 /* All other formulas in validation are stored like conditional
1807 formatting formulas (with tRefN/tAreaN tokens as value or
1808 array class). But NOT the cell references and defined names
1809 in list validation - they are stored as reference class
1810 tokens... Example:
1811 1) Cell must be equal to A1 -> formula is =A1 -> writes tRefNV token
1812 2) List is taken from A1 -> formula is =A1 -> writes tRefNR token
1813 Formula compiler supports this by offering two different functions
1814 CreateDataValFormula() and CreateListValFormula(). */
1816 mxTokArr1 = rFmlaComp.CreateFormula( EXC_FMLATYPE_LISTVAL, *xScTokArr );
1817 else
1819 xScTokArr.get());
1820 }
1821 }
1822 else
1823 {
1824 // no list validation -> convert the formula
1826 mxTokArr1 = rFmlaComp.CreateFormula( EXC_FMLATYPE_DATAVAL, *xScTokArr );
1827 else
1829 xScTokArr.get());
1830 }
1831 }
1832
1833 // second formula
1834 xScTokArr = pValData->CreateFlatCopiedTokenArray( 1 );
1835 if (xScTokArr)
1836 {
1838 mxTokArr2 = rFmlaComp.CreateFormula( EXC_FMLATYPE_DATAVAL, *xScTokArr );
1839 else
1841 xScTokArr.get());
1842 }
1843 }
1844 else
1845 {
1846 OSL_FAIL( "XclExpDV::XclExpDV - missing core data" );
1847 mnScHandle = ULONG_MAX;
1848 }
1849}
1850
1852{
1853}
1854
1856{
1857 maScRanges.Join( rRange );
1858}
1859
1861{
1863 return (mnScHandle != ULONG_MAX) && !maXclRanges.empty();
1864}
1865
1867{
1868 // flags and strings
1870 // condition formulas
1871 if( mxString1 )
1872 lclWriteDvFormula( rStrm, *mxString1 );
1873 else
1874 lclWriteDvFormula( rStrm, mxTokArr1.get() );
1875 lclWriteDvFormula( rStrm, mxTokArr2.get() );
1876 // cell ranges
1877 rStrm << maXclRanges;
1878}
1879
1881{
1882 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1883 rWorksheet->startElement( XML_dataValidation,
1884 XML_allowBlank, ToPsz( ::get_flag( mnFlags, EXC_DV_IGNOREBLANK ) ),
1885 XML_error, XESTRING_TO_PSZ( maErrorText ),
1886 XML_errorStyle, lcl_GetErrorType(mnFlags),
1887 XML_errorTitle, XESTRING_TO_PSZ( maErrorTitle ),
1888 // OOXTODO: XML_imeMode,
1889 XML_operator, lcl_GetOperatorType( mnFlags ),
1890 XML_prompt, XESTRING_TO_PSZ( maPromptText ),
1891 XML_promptTitle, XESTRING_TO_PSZ( maPromptTitle ),
1892 // showDropDown should have been showNoDropDown - check oox/xlsx import for details
1893 XML_showDropDown, ToPsz( ::get_flag( mnFlags, EXC_DV_SUPPRESSDROPDOWN ) ),
1894 XML_showErrorMessage, ToPsz( ::get_flag( mnFlags, EXC_DV_SHOWERROR ) ),
1895 XML_showInputMessage, ToPsz( ::get_flag( mnFlags, EXC_DV_SHOWPROMPT ) ),
1896 XML_sqref, XclXmlUtils::ToOString(rStrm.GetRoot().GetDoc(), maScRanges),
1897 XML_type, lcl_GetValidationType(mnFlags) );
1898 if (!msList.isEmpty())
1899 {
1900 rWorksheet->startElement(FSNS(XML_mc, XML_AlternateContent),
1901 FSNS(XML_xmlns, XML_x12ac),rStrm.getNamespaceURL(OOX_NS(x12ac)),
1902 FSNS(XML_xmlns, XML_mc),rStrm.getNamespaceURL(OOX_NS(mce)));
1903 rWorksheet->startElement(FSNS(XML_mc, XML_Choice), XML_Requires, "x12ac");
1904 rWorksheet->startElement(FSNS(XML_x12ac, XML_list));
1905 rWorksheet->writeEscaped(msList);
1906 rWorksheet->endElement(FSNS(XML_x12ac, XML_list));
1907 rWorksheet->endElement(FSNS(XML_mc, XML_Choice));
1908 rWorksheet->startElement(FSNS(XML_mc, XML_Fallback));
1909 rWorksheet->startElement(XML_formula1);
1910 rWorksheet->writeEscaped(msFormula1);
1911 rWorksheet->endElement(XML_formula1);
1912 rWorksheet->endElement(FSNS(XML_mc, XML_Fallback));
1913 rWorksheet->endElement(FSNS(XML_mc, XML_AlternateContent));
1914 }
1915 if (msList.isEmpty() && !msFormula1.isEmpty())
1916 {
1917 rWorksheet->startElement(XML_formula1);
1918 rWorksheet->writeEscaped( msFormula1 );
1919 rWorksheet->endElement( XML_formula1 );
1920 }
1921 if( !msFormula2.isEmpty() )
1922 {
1923 rWorksheet->startElement(XML_formula2);
1924 rWorksheet->writeEscaped( msFormula2 );
1925 rWorksheet->endElement( XML_formula2 );
1926 }
1927 rWorksheet->endElement( XML_dataValidation );
1928}
1929
1932 XclExpRoot( rRoot )
1933{
1934}
1935
1937{
1938}
1939
1940void XclExpDval::InsertCellRange( const ScRange& rRange, sal_uLong nScHandle )
1941{
1942 if( GetBiff() == EXC_BIFF8 )
1943 {
1944 XclExpDV& rDVRec = SearchOrCreateDv( nScHandle );
1945 rDVRec.InsertCellRange( rRange );
1946 }
1947}
1948
1950{
1951 // check all records
1952 size_t nPos = maDVList.GetSize();
1953 while( nPos )
1954 {
1955 --nPos; // backwards to keep nPos valid
1956 XclExpDVRef xDVRec = maDVList.GetRecord( nPos );
1957 if( !xDVRec->Finalize() )
1959 }
1960
1961 // write the DVAL and the DV's
1962 if( !maDVList.IsEmpty() )
1963 {
1965 maDVList.Save( rStrm );
1966 }
1967}
1968
1970{
1971 if( maDVList.IsEmpty() )
1972 return;
1973
1974 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1975 rWorksheet->startElement( XML_dataValidations,
1976 XML_count, OString::number(maDVList.GetSize())
1977 // OOXTODO: XML_disablePrompts,
1978 // OOXTODO: XML_xWindow,
1979 // OOXTODO: XML_yWindow
1980 );
1982 rWorksheet->endElement( XML_dataValidations );
1983}
1984
1986{
1987 // test last found record
1988 if( mxLastFoundDV && (mxLastFoundDV->GetScHandle() == nScHandle) )
1989 return *mxLastFoundDV;
1990
1991 // binary search
1992 size_t nCurrPos = 0;
1993 if( !maDVList.IsEmpty() )
1994 {
1995 size_t nFirstPos = 0;
1996 size_t nLastPos = maDVList.GetSize() - 1;
1997 bool bLoop = true;
1998 sal_uLong nCurrScHandle = ::std::numeric_limits< sal_uLong >::max();
1999 while( (nFirstPos <= nLastPos) && bLoop )
2000 {
2001 nCurrPos = (nFirstPos + nLastPos) / 2;
2002 mxLastFoundDV = maDVList.GetRecord( nCurrPos );
2003 nCurrScHandle = mxLastFoundDV->GetScHandle();
2004 if( nCurrScHandle == nScHandle )
2005 bLoop = false;
2006 else if( nCurrScHandle < nScHandle )
2007 nFirstPos = nCurrPos + 1;
2008 else if( nCurrPos )
2009 nLastPos = nCurrPos - 1;
2010 else // special case for nLastPos = -1
2011 bLoop = false;
2012 }
2013 if( nCurrScHandle == nScHandle )
2014 return *mxLastFoundDV;
2015 else if( nCurrScHandle < nScHandle )
2016 ++nCurrPos;
2017 }
2018
2019 // create new DV record
2020 mxLastFoundDV = new XclExpDV( *this, nScHandle );
2021 maDVList.InsertRecord( mxLastFoundDV, nCurrPos );
2022 return *mxLastFoundDV;
2023}
2024
2026{
2027 rStrm.WriteZeroBytes( 10 );
2028 rStrm << EXC_DVAL_NOOBJ << static_cast< sal_uInt32 >( maDVList.GetSize() );
2029}
2030
2031// Web Queries ================================================================
2032
2034 const OUString& rRangeName,
2035 const OUString& rUrl,
2036 std::u16string_view rSource,
2037 sal_Int32 nRefrSecs ) :
2038 maDestRange( rRangeName ),
2039 maUrl( rUrl ),
2040 // refresh delay time: seconds -> minutes
2041 mnRefresh( ulimit_cast< sal_Int16 >( (nRefrSecs + 59) / 60 ) ),
2042 mbEntireDoc( false )
2043{
2044 // comma separated list of HTML table names or indexes
2045 OUString aNewTables;
2046 OUString aAppendTable;
2047 bool bExitLoop = false;
2048 if (!rSource.empty())
2049 {
2050 sal_Int32 nStringIx = 0;
2051 do
2052 {
2053 OUString aToken( o3tl::getToken(rSource, 0, ';', nStringIx ) );
2055 bExitLoop = mbEntireDoc || ScfTools::IsHTMLTablesName( aToken );
2056 if( !bExitLoop && ScfTools::GetHTMLNameFromName( aToken, aAppendTable ) )
2057 aNewTables = ScGlobal::addToken( aNewTables, aAppendTable, ',' );
2058 }
2059 while (nStringIx>0 && !bExitLoop);
2060 }
2061
2062 if( !bExitLoop ) // neither HTML_all nor HTML_tables found
2063 {
2064 if( !aNewTables.isEmpty() )
2065 mxQryTables.reset( new XclExpString( aNewTables ) );
2066 else
2067 mbEntireDoc = true;
2068 }
2069}
2070
2072{
2073}
2074
2076{
2077 OSL_ENSURE( !mbEntireDoc || !mxQryTables, "XclExpWebQuery::Save - illegal mode" );
2078 sal_uInt16 nFlags;
2079
2080 // QSI record
2081 rStrm.StartRecord( EXC_ID_QSI, 10 + maDestRange.GetSize() );
2083 << sal_uInt16( 0x0010 )
2084 << sal_uInt16( 0x0012 )
2085 << sal_uInt32( 0x00000000 )
2086 << maDestRange;
2087 rStrm.EndRecord();
2088
2089 // PARAMQRY record
2090 nFlags = 0;
2091 ::insert_value( nFlags, EXC_PQRYTYPE_WEBQUERY, 0, 3 );
2092 ::set_flag( nFlags, EXC_PQRY_WEBQUERY );
2094 rStrm.StartRecord( EXC_ID_PQRY, 12 );
2095 rStrm << nFlags
2096 << sal_uInt16( 0x0000 )
2097 << sal_uInt16( 0x0001 );
2098 rStrm.WriteZeroBytes( 6 );
2099 rStrm.EndRecord();
2100
2101 // WQSTRING record
2102 rStrm.StartRecord( EXC_ID_WQSTRING, maUrl.GetSize() );
2103 rStrm << maUrl;
2104 rStrm.EndRecord();
2105
2106 // unknown record 0x0802
2107 rStrm.StartRecord( EXC_ID_0802, 16 + maDestRange.GetSize() );
2108 rStrm << EXC_ID_0802; // repeated record id ?!?
2109 rStrm.WriteZeroBytes( 6 );
2110 rStrm << sal_uInt16( 0x0003 )
2111 << sal_uInt32( 0x00000000 )
2112 << sal_uInt16( 0x0010 )
2113 << maDestRange;
2114 rStrm.EndRecord();
2115
2116 // WEBQRYSETTINGS record
2118 rStrm.StartRecord( EXC_ID_WQSETT, 28 );
2119 rStrm << EXC_ID_WQSETT // repeated record id ?!?
2120 << sal_uInt16( 0x0000 )
2121 << sal_uInt16( 0x0004 )
2122 << sal_uInt16( 0x0000 )
2124 << nFlags;
2125 rStrm.WriteZeroBytes( 10 );
2126 rStrm << mnRefresh // refresh delay in minutes
2128 << sal_uInt16( 0x0000 );
2129 rStrm.EndRecord();
2130
2131 // WEBQRYTABLES record
2132 if( mxQryTables )
2133 {
2134 rStrm.StartRecord( EXC_ID_WQTABLES, 4 + mxQryTables->GetSize() );
2135 rStrm << EXC_ID_WQTABLES // repeated record id ?!?
2136 << sal_uInt16( 0x0000 )
2137 << *mxQryTables; // comma separated list of source tables
2138 rStrm.EndRecord();
2139 }
2140}
2141
2143{
2144 SCTAB nScTab = rRoot.GetCurrScTab();
2145 SfxObjectShell* pShell = rRoot.GetDocShell();
2146 if( !pShell ) return;
2147 ScfPropertySet aModelProp( pShell->GetModel() );
2148 if( !aModelProp.Is() ) return;
2149
2150 Reference< XAreaLinks > xAreaLinks;
2151 aModelProp.GetProperty( xAreaLinks, SC_UNO_AREALINKS );
2152 if( !xAreaLinks.is() ) return;
2153
2154 for( sal_Int32 nIndex = 0, nCount = xAreaLinks->getCount(); nIndex < nCount; ++nIndex )
2155 {
2156 Reference< XAreaLink > xAreaLink( xAreaLinks->getByIndex( nIndex ), UNO_QUERY );
2157 if( xAreaLink.is() )
2158 {
2159 CellRangeAddress aDestRange( xAreaLink->getDestArea() );
2160 if( static_cast< SCTAB >( aDestRange.Sheet ) == nScTab )
2161 {
2162 ScfPropertySet aLinkProp( xAreaLink );
2163 OUString aFilter;
2164 if( aLinkProp.GetProperty( aFilter, SC_UNONAME_FILTER ) &&
2165 (aFilter == EXC_WEBQRY_FILTER) )
2166 {
2167 // get properties
2168 OUString /*aFilterOpt,*/ aUrl;
2169 sal_Int32 nRefresh = 0;
2170
2171// aLinkProp.GetProperty( aFilterOpt, SC_UNONAME_FILTOPT );
2172 aLinkProp.GetProperty( aUrl, SC_UNONAME_LINKURL );
2173 aLinkProp.GetProperty( nRefresh, SC_UNONAME_REFDELAY );
2174
2175 OUString aAbsDoc( ScGlobal::GetAbsDocName( aUrl, pShell ) );
2176 INetURLObject aUrlObj( aAbsDoc );
2177 OUString aWebQueryUrl( aUrlObj.getFSysPath( FSysStyle::Dos ) );
2178 if( aWebQueryUrl.isEmpty() )
2179 aWebQueryUrl = aAbsDoc;
2180
2181 // find range or create a new range
2182 OUString aRangeName;
2183 ScRange aScDestRange;
2184 ScUnoConversion::FillScRange( aScDestRange, aDestRange );
2185 if( const ScRangeData* pRangeData = rRoot.GetNamedRanges().findByRange( aScDestRange ) )
2186 {
2187 aRangeName = pRangeData->GetName();
2188 }
2189 else
2190 {
2191 XclExpFormulaCompiler& rFmlaComp = rRoot.GetFormulaCompiler();
2192 XclExpNameManager& rNameMgr = rRoot.GetNameManager();
2193
2194 // create a new unique defined name containing the range
2195 XclTokenArrayRef xTokArr = rFmlaComp.CreateFormula( EXC_FMLATYPE_WQUERY, aScDestRange );
2196 sal_uInt16 nNameIdx = rNameMgr.InsertUniqueName( aUrlObj.getBase(), xTokArr, nScTab );
2197 aRangeName = rNameMgr.GetOrigName( nNameIdx );
2198 }
2199
2200 // create and store the web query record
2201 if( !aRangeName.isEmpty() )
2203 aRangeName, aWebQueryUrl, xAreaLink->getSourceArea(), nRefresh ) );
2204 }
2205 }
2206 }
2207 }
2208}
2209
2210/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
Any maOrigin
OUString GetMainURL(DecodeMechanism eMechanism, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
OUString GetMark(DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
OUString GetURLNoMark(DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
OUString getBase(sal_Int32 nIndex=LAST_SEGMENT, bool bIgnoreFinalSlash=true, DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
bool HasMark() const
static OUString GetRelURL(std::u16string_view rTheBaseURIRef, OUString const &rTheAbsURIRef, EncodeMechanism eEncodeMechanism=EncodeMechanism::WasEncoded, DecodeMechanism eDecodeMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8, FSysStyle eStyle=FSysStyle::Detect)
INetProtocol GetProtocol() const
OUString getFSysPath(FSysStyle eStyle, sal_Unicode *pDelimiter=nullptr) const
SCTAB Tab() const
Definition: address.hxx:283
void SetCol(SCCOL nColP)
Definition: address.hxx:291
SCROW Row() const
Definition: address.hxx:274
void SetTab(SCTAB nTabP)
Definition: address.hxx:295
SCCOL Col() const
Definition: address.hxx:279
const ScRangeList & GetRange() const
Definition: colorscale.cxx:437
double GetValue() const
Definition: colorscale.cxx:236
const ScTokenArray * GetFormula() const
Definition: colorscale.cxx:216
ScColorScaleEntryType GetType() const
Definition: colorscale.hxx:76
condformat::ScCondFormatDateType GetDateType() const
Definition: conditio.hxx:511
const OUString & GetStyleName() const
Definition: conditio.hxx:513
const OUString & GetStyle() const
Definition: conditio.hxx:472
ScAddress GetValidSrcPos() const
Return a position that's adjusted to allow textual representation of expressions if possible.
Definition: conditio.cxx:1330
ScConditionMode GetOperation() const
Definition: conditio.hxx:368
std::unique_ptr< ScTokenArray > CreateFlatCopiedTokenArray(sal_uInt16 nPos) const
Create a flat copy using ScTokenArray copy-ctor with shared tokens.
Definition: conditio.cxx:1285
OUString GetExpression(const ScAddress &rCursor, sal_uInt16 nPos, sal_uInt32 nNumFmt=0, const formula::FormulaGrammar::Grammar eGrammar=formula::FormulaGrammar::GRAM_DEFAULT) const
Definition: conditio.cxx:1239
const ScRangeList & GetRange() const
Definition: conditio.hxx:558
const ScFormatEntry * GetEntry(sal_uInt16 nPos) const
Definition: conditio.cxx:1785
size_t size() const
Definition: conditio.cxx:1771
const ScDataBarFormatData * GetDataBarData() const
Definition: colorscale.cxx:741
SC_DLLPUBLIC bool GetTable(const OUString &rName, SCTAB &rTab) const
Definition: document.cxx:262
ScRangePairListRef & GetRowNameRangesRef()
Definition: document.hxx:821
ScRangePairListRef & GetColNameRangesRef()
Definition: document.hxx:820
static SC_DLLPUBLIC OUString addToken(std::u16string_view rTokenList, std::u16string_view rToken, sal_Unicode cSep, sal_Int32 nSepCount=1, bool bForceSep=false)
Adds the string rToken to rTokenList, using a list separator character.
Definition: global.cxx:665
static SC_DLLPUBLIC OUString GetAbsDocName(const OUString &rFileName, const SfxObjectShell *pShell)
Definition: global2.cxx:287
static const char * getIconSetName(ScIconSetType eType)
const ScIconSetFormatData * GetIconSetData() const
static void GetFont(vcl::Font &rFont, const SfxItemSet &rItemSet, ScAutoFontColorMode eAutoMode, const OutputDevice *pOutDev=nullptr, const Fraction *pScale=nullptr, const SfxItemSet *pCondSet=nullptr, SvtScriptType nScript=SvtScriptType::NONE, const Color *pBackConfigColor=nullptr, const Color *pTextConfigColor=nullptr)
Static helper function to fill a font object from the passed item set.
Definition: patattr.cxx:251
ScRange & front()
Definition: rangelst.hxx:92
void Format(OUString &, ScRefFlags nFlags, const ScDocument &, formula::FormulaGrammar::AddressConvention eConv=formula::FormulaGrammar::CONV_OOO, sal_Unicode cDelimiter=0, bool bFullAddressNotation=false) const
Definition: rangelst.cxx:132
void Join(const ScRange &, bool bIsInList=false)
Definition: rangelst.cxx:152
ScRange Combine() const
Definition: rangelst.cxx:1107
void push_back(const ScRange &rRange)
Definition: rangelst.cxx:1137
size_t size() const
Definition: rangelst.hxx:89
SC_DLLPUBLIC const ScRangeData * findByRange(const ScRange &rRange) const
Definition: rangenam.cxx:697
const ScRange & GetRange(sal_uInt16 n) const
Definition: address.hxx:810
ScAddress aEnd
Definition: address.hxx:498
bool Contains(const ScAddress &) const
is Address& fully in Range?
Definition: address.hxx:718
ScAddress aStart
Definition: address.hxx:497
static void FillScRange(ScRange &rScRange, const css::table::CellRangeAddress &rApiRange)
Definition: convuno.hxx:79
A wrapper for a UNO property set.
Definition: fapihelper.hxx:104
bool GetProperty(Type &rValue, const OUString &rPropName) const
Gets the specified property from the property set.
Definition: fapihelper.hxx:148
bool Is() const
Returns true, if the contained XPropertySet interface is valid.
Definition: fapihelper.hxx:128
static bool CheckItem(const SfxItemSet &rItemSet, sal_uInt16 nWhichId, bool bDeep)
Returns true, if the passed item set contains the item.
Definition: ftools.cxx:200
static bool IsHTMLTablesName(std::u16string_view rSource)
Returns true, if rSource is the built-in range name for all HTML tables.
Definition: ftools.cxx:327
static bool GetHTMLNameFromName(const OUString &rSource, OUString &rName)
Converts a built-in range name to an HTML table name.
Definition: ftools.cxx:332
static bool IsHTMLDocName(std::u16string_view rSource)
Returns true, if rSource is the built-in range name for an HTML document.
Definition: ftools.cxx:322
css::uno::Reference< css::frame::XModel3 > GetModel() const
SvStream & WriteUInt16(sal_uInt16 nUInt16)
SvStream & WriteUInt32(sal_uInt32 nUInt32)
sal_uInt64 Seek(sal_uInt64 nPos)
const OUString & GetRepresentation() const
const OUString & GetURL() const
Provides functions to convert Calc cell addresses to Excel cell addresses.
Definition: xehelper.hxx:82
void ConvertRangeList(XclRangeList &rXclRanges, const ScRangeList &rScRanges, bool bWarn)
Converts the passed Calc cell range list to an Excel cell range list.
Definition: xehelper.cxx:265
Represents a CF record that contains one condition of a conditional format.
Definition: xecontent.cxx:597
bool mbColorUsed
true = Font weight used.
Definition: xecontent.cxx:620
bool mbPattUsed
true = Border attribute used.
Definition: xecontent.cxx:625
const ScCondFormatEntry & mrFormatEntry
Definition: xecontent.cxx:606
XclTokenArrayRef mxTokArr1
Pattern formatting attributes.
Definition: xecontent.cxx:611
void SaveXml(XclExpXmlStream &rStrm)
Definition: xecontent.cxx:1030
void WriteBody(XclExpStream &rStrm)
Writes the body of the CF record.
Definition: xecontent.cxx:728
bool mbUnderlUsed
true = Font color used.
Definition: xecontent.cxx:621
bool mbHeightUsed
true = Any font attribute used.
Definition: xecontent.cxx:618
bool mbFontUsed
Priority of this entry; needed for oox export.
Definition: xecontent.cxx:617
XclTokenArrayRef mxTokArr2
Formula for first condition.
Definition: xecontent.cxx:612
XclExpCellBorder maBorder
Font formatting attributes.
Definition: xecontent.cxx:609
bool mbFormula2
true = Pattern attribute used.
Definition: xecontent.cxx:626
bool mbBorderUsed
true = Font strikeout used.
Definition: xecontent.cxx:624
sal_uInt32 mnFontColorId
Formula for second condition.
Definition: xecontent.cxx:613
XclExpCFImpl(const XclExpRoot &rRoot, const ScCondFormatEntry &rFormatEntry, sal_Int32 nPriority, ScAddress aOrigin)
Definition: xecontent.cxx:629
sal_uInt8 mnType
Font color ID.
Definition: xecontent.cxx:614
bool mbStrikeUsed
true = Font posture used.
Definition: xecontent.cxx:623
sal_uInt8 mnOperator
Type of the condition (cell/formula).
Definition: xecontent.cxx:615
bool mbWeightUsed
true = Font height used.
Definition: xecontent.cxx:619
bool mbItalicUsed
true = Font underline type used.
Definition: xecontent.cxx:622
ScAddress maOrigin
Calc conditional format entry.
Definition: xecontent.cxx:607
XclExpCellArea maArea
Border formatting attributes.
Definition: xecontent.cxx:610
sal_Int32 mnPriority
Comparison operator for cell type.
Definition: xecontent.cxx:616
XclFontData maFontData
Top left cell of the combined range.
Definition: xecontent.cxx:608
Represents a CF record that contains one condition of a conditional format.
Definition: xecontent.hxx:168
XclExpCFImplPtr mxImpl
Definition: xecontent.hxx:181
XclExpCF(const XclExpRoot &rRoot, const ScCondFormatEntry &rFormatEntry, sal_Int32 nPriority, ScAddress aOrigin)
Definition: xecontent.cxx:1100
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1116
virtual void WriteBody(XclExpStream &rStrm) override
Writes the body of the CF record.
Definition: xecontent.cxx:1111
virtual ~XclExpCF() override
Definition: xecontent.cxx:1107
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1221
ScAddress maSrcPos
Definition: xecontent.hxx:205
const ScColorScaleEntry & mrEntry
Definition: xecontent.hxx:204
bool mbFirst
Definition: xecontent.hxx:206
XclExpCfvo(const XclExpRoot &rRoot, const ScColorScaleEntry &rFormatEntry, const ScAddress &rPos, bool bFirst=true)
Definition: xecontent.cxx:1183
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1254
const Color & mrColor
Definition: xecontent.hxx:217
XclExpColScaleCol(const XclExpRoot &rRoot, const Color &rColor)
Definition: xecontent.cxx:1244
virtual ~XclExpColScaleCol() override
Definition: xecontent.cxx:1250
XclExpColorScale(const XclExpRoot &rRoot, const ScColorScaleFormat &rFormat, sal_Int32 nPriority)
Definition: xecontent.cxx:1441
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1458
XclExpCfvoList maCfvoList
Definition: xecontent.hxx:257
XclExpColScaleColList maColList
Definition: xecontent.hxx:258
sal_Int32 mnPriority
Definition: xecontent.hxx:259
XclExpCondFormatBuffer(const XclExpRoot &rRoot, const XclExtLstRef &xExtLst)
Constructs CONDFMT and CF records containing the conditional formats of the current sheet.
Definition: xecontent.cxx:1564
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1584
virtual void Save(XclExpStream &rStrm) override
Writes all contained CONDFMT records with their CF records.
Definition: xecontent.cxx:1579
XclExpCondfmtList maCondfmtList
Definition: xecontent.hxx:305
Represents a CONDFMT record that contains all conditions of a conditional format.
Definition: xecontent.hxx:223
bool IsValidForBinary() const
Returns true, if this conditional format contains at least one cell range and CF record.
Definition: xecontent.cxx:1390
XclExpCondfmt(const XclExpRoot &rRoot, const ScConditionalFormat &rCondFormat, const XclExtLstRef &xExtLst, sal_Int32 &rIndex)
Definition: xecontent.cxx:1297
XclRangeList maXclRanges
List of CF records.
Definition: xecontent.hxx:243
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1425
virtual void Save(XclExpStream &rStrm) override
Writes the CONDFMT record with following CF records, if there is valid data.
Definition: xecontent.cxx:1405
bool IsValidForXml() const
Definition: xecontent.cxx:1400
XclExpRecordList< XclExpRecord > maCFList
Definition: xecontent.hxx:242
OUString msSeqRef
Cell ranges for this conditional format.
Definition: xecontent.hxx:244
virtual ~XclExpCondfmt() override
Definition: xecontent.cxx:1386
virtual void WriteBody(XclExpStream &rStrm) override
Writes the body of the CONDFMT record.
Definition: xecontent.cxx:1414
Provides export of the data of a DV record.
Definition: xecontent.hxx:315
XclExpString maPromptText
The prompt title.
Definition: xecontent.hxx:339
sal_uInt32 mnFlags
OOXML Formula for second condition.
Definition: xecontent.hxx:348
void InsertCellRange(const ScRange &rPos)
Inserts a new cell range into the cell range list.
Definition: xecontent.cxx:1855
XclRangeList maXclRanges
Calc range list with all affected cells.
Definition: xecontent.hxx:337
XclExpString maErrorTitle
The prompt text.
Definition: xecontent.hxx:340
XclTokenArrayRef mxTokArr2
x12ac:list for first condition.
Definition: xecontent.hxx:346
ScRangeList maScRanges
Definition: xecontent.hxx:336
virtual void WriteBody(XclExpStream &rStrm) override
Writes the body of the DV record.
Definition: xecontent.cxx:1866
XclExpStringRef mxString1
The error text.
Definition: xecontent.hxx:342
OUString msFormula1
Formula for first condition.
Definition: xecontent.hxx:344
OUString msFormula2
Formula for second condition.
Definition: xecontent.hxx:347
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1880
bool Finalize()
Converts the Calc range list to the Excel range list.
Definition: xecontent.cxx:1860
XclExpDV(const XclExpRoot &rRoot, sal_uLong nScHandle)
Definition: xecontent.cxx:1675
XclExpString maPromptTitle
Excel range list with all affected cells.
Definition: xecontent.hxx:338
XclTokenArrayRef mxTokArr1
String for first condition formula.
Definition: xecontent.hxx:343
XclExpString maErrorText
The error title.
Definition: xecontent.hxx:341
sal_uLong mnScHandle
Miscellaneous flags.
Definition: xecontent.hxx:349
OUString msList
OOXML Formula for first condition.
Definition: xecontent.hxx:345
virtual ~XclExpDV() override
Definition: xecontent.cxx:1851
std::unique_ptr< XclExpColScaleCol > mpCol
Definition: xecontent.hxx:271
OString maGUID
Definition: xecontent.hxx:275
XclExpDataBar(const XclExpRoot &rRoot, const ScDataBarFormat &rFormat, sal_Int32 nPriority, const OString &rGUID)
Definition: xecontent.cxx:1476
sal_Int32 mnPriority
Definition: xecontent.hxx:274
std::unique_ptr< XclExpCfvo > mpCfvoUpperLimit
Definition: xecontent.hxx:270
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1493
const ScDataBarFormat & mrFormat
Definition: xecontent.hxx:273
std::unique_ptr< XclExpCfvo > mpCfvoLowerLimit
Definition: xecontent.hxx:269
const ScCondDateFormatEntry & mrFormatEntry
Definition: xecontent.hxx:193
sal_Int32 mnPriority
Definition: xecontent.hxx:194
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1167
XclExpDateFormat(const XclExpRoot &rRoot, const ScCondDateFormatEntry &rFormatEntry, sal_Int32 nPriority)
Definition: xecontent.cxx:1121
virtual ~XclExpDateFormat() override
Definition: xecontent.cxx:1129
virtual void Save(XclExpStream &rStrm) override
Writes the DVAL record and the DV record list.
Definition: xecontent.cxx:1949
virtual ~XclExpDval() override
Definition: xecontent.cxx:1936
XclExpDV & SearchOrCreateDv(sal_uLong nScHandle)
Searches for or creates a XclExpDV record object with the specified handle.
Definition: xecontent.cxx:1985
XclExpDVList maDVList
Definition: xecontent.hxx:377
XclExpDval(const XclExpRoot &rRoot)
Definition: xecontent.cxx:1930
XclExpDVRef mxLastFoundDV
List of DV records.
Definition: xecontent.hxx:378
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1969
void InsertCellRange(const ScRange &rRange, sal_uLong nScHandle)
Inserts the cell range into the range list of the DV record with the specified handle.
Definition: xecontent.cxx:1940
virtual void WriteBody(XclExpStream &rStrm) override
Writes the body of the DVAL record.
Definition: xecontent.cxx:2025
Base class for ext entries.
Definition: xeextlst.hxx:38
The formula compiler to create Excel token arrays from Calc token arrays.
Definition: xeformula.hxx:52
XclTokenArrayRef CreateFormula(XclFormulaType eType, const ScTokenArray &rScTokArr, const ScAddress *pScBasePos=nullptr, XclExpRefLog *pRefLog=nullptr)
Creates and returns the token array of a formula.
Definition: xeformula.cxx:2643
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1544
XclExpIconSet(const XclExpRoot &rRoot, const ScIconSetFormat &rFormat, sal_Int32 nPriority)
Definition: xecontent.cxx:1528
const ScIconSetFormat & mrFormat
Definition: xecontent.hxx:288
sal_Int32 mnPriority
Definition: xecontent.hxx:289
XclExpCfvoList maCfvoList
Definition: xecontent.hxx:287
XclExpLabelranges(const XclExpRoot &rRoot)
Fills the cell range lists with all ranges of the current sheet.
Definition: xecontent.cxx:550
static void FillRangeList(ScRangeList &rScRanges, const ScRangePairListRef &xLabelRangesRef, SCTAB nScTab)
Fills the specified range list with all label headers of the current sheet.
Definition: xecontent.cxx:567
ScRangeList maColRanges
Cell range list for row labels.
Definition: xecontent.hxx:159
ScRangeList maRowRanges
Definition: xecontent.hxx:158
virtual void Save(XclExpStream &rStrm) override
Writes the LABELRANGES record if it contains at least one range.
Definition: xecontent.cxx:579
virtual void Save(XclExpStream &rStrm) override
Writes the record, if it contains at least one merged cell range.
Definition: xecontent.cxx:290
void AppendRange(const ScRange &rRange, sal_uInt32 nBaseXFId)
Appends a new range to the list of merged cell ranges.
Definition: xecontent.cxx:267
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:310
ScfUInt32Vec maBaseXFIds
All merged cell ranges of the sheet.
Definition: xecontent.hxx:89
XclExpMergedcells(const XclExpRoot &rRoot)
Definition: xecontent.cxx:262
sal_uInt32 GetBaseXFId(const ScAddress &rPos) const
Returns the XF identifier of the top-left cell in a merged range.
Definition: xecontent.cxx:276
ScRangeList maMergedRanges
Definition: xecontent.hxx:88
Manager that stores all internal defined names (NAME records) of the document.
Definition: xename.hxx:32
sal_uInt16 InsertUniqueName(const OUString &rName, const XclTokenArrayRef &xTokArr, SCTAB nScTab)
Inserts a new defined name.
Definition: xename.cxx:826
OUString GetOrigName(sal_uInt16 nNameIdx) const
Returns the Calc sheet of a local defined name, or SCTAB_GLOBAL for global defined names.
Definition: xename.cxx:842
sal_uInt32 InsertColor(const Color &rColor, XclExpColorType eType, sal_uInt16 nAutoDefault=0)
Inserts the color into the list and updates weighting.
Definition: xestyle.cxx:766
sal_uInt16 GetColorIndex(sal_uInt32 nColorId) const
Returns the Excel palette index of the color with passed color ID.
Definition: xestyle.cxx:781
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
void RemoveRecord(size_t nPos)
Removes the record at the specified position from the list.
Definition: xerecord.hxx:369
bool IsEmpty() const
Definition: xerecord.hxx:326
void InsertRecord(RecType *pRec, size_t nPos)
Inserts a record at the specified position into the list.
Definition: xerecord.hxx:343
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
Base class for single records with any content.
Definition: xerecord.hxx:143
virtual void Save(XclExpStream &rStrm) override
Writes the record header and calls WriteBody().
Definition: xerecord.cxx:150
void SetRecSize(std::size_t nRecSize)
Sets a new record size prediction.
Definition: xerecord.hxx:163
Access to global data from other classes.
Definition: xeroot.hxx:113
XclExpNameManager & GetNameManager() const
Returns the buffer that contains internal defined names.
Definition: xeroot.cxx:141
XclExpFormulaCompiler & GetFormulaCompiler() const
Returns the formula compiler to produce formula token arrays.
Definition: xeroot.cxx:87
XclExpDxfs & GetDxfs() const
Returns the differential formatting list.
Definition: xeroot.cxx:159
XclExpAddressConverter & GetAddressConverter() const
Returns the address converter.
Definition: xeroot.cxx:81
sc::CompileFormulaContext & GetCompileFormulaContext() const
Definition: xeroot.hxx:121
bool IsRelUrl() const
Returns true, if URLs should be stored relative to the document location.
Definition: xeroot.hxx:120
XclExpPalette & GetPalette() const
Returns the color buffer.
Definition: xeroot.cxx:105
const XclExpRoot & GetRoot() const
Returns this root instance - for code readability in derived classes.
Definition: xeroot.hxx:118
Implementation of the SST export.
Definition: xecontent.cxx:94
sal_uInt32 mnSize
Total count of strings (including doubles).
Definition: xecontent.cxx:112
std::vector< XclExpHashVec > maHashTab
List of unique strings (in SST ID order).
Definition: xecontent.cxx:110
sal_uInt32 mnTotal
Hashed table that manages string pointers.
Definition: xecontent.cxx:111
void SaveXml(XclExpXmlStream &rStrm)
Definition: xecontent.cxx:206
std::vector< XclExpStringRef > maStringVector
Definition: xecontent.cxx:108
sal_uInt32 Insert(XclExpStringRef xString)
Inserts the passed string, if not already inserted, and returns the unique SST index.
Definition: xecontent.cxx:124
void Save(XclExpStream &rStrm)
Writes the complete SST and EXTSST records.
Definition: xecontent.cxx:155
::std::vector< XclExpHashEntry > XclExpHashVec
Definition: xecontent.cxx:106
virtual ~XclExpSst() override
Definition: xecontent.cxx:241
virtual void Save(XclExpStream &rStrm) override
Writes the complete SST and EXTSST records.
Definition: xecontent.cxx:250
sal_uInt32 Insert(const XclExpStringRef &xString)
Inserts a new string into the table.
Definition: xecontent.cxx:245
XclExpSstImplPtr mxImpl
Definition: xecontent.hxx:67
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:255
This class is used to export Excel record streams.
Definition: xestream.hxx:73
void WriteZeroBytes(std::size_t nBytes)
Writes a sequence of nBytes zero bytes (respects slice setting).
Definition: xestream.cxx:261
std::size_t Write(const void *pData, std::size_t nBytes)
Writes nBytes bytes from memory.
Definition: xestream.cxx:220
This class stores an unformatted or formatted string for Excel export.
Definition: xestring.hxx:48
void Assign(const OUString &rString, XclStrFlags nFlags=XclStrFlags::NONE, sal_uInt16 nMaxLen=EXC_STR_MAXLEN)
Assigns an unformatted string, converts this object to a BIFF8 Unicode string.
Definition: xestring.cxx:111
std::size_t GetSize() const
Returns the byte count the whole string will take on export.
Definition: xestring.cxx:248
std::size_t GetBufferSize() const
Returns the byte count the character buffer will take on export.
Definition: xestring.cxx:243
void WriteBuffer(XclExpStream &rStrm) const
Writes the raw character buffer.
Definition: xestring.cxx:304
sal_uInt16 Len() const
Returns the character count of the string.
Definition: xestring.hxx:118
XclExpWebQueryBuffer(const XclExpRoot &rRoot)
Definition: xecontent.cxx:2142
Contains all records for a web query (linked tables in an HTML document).
Definition: xecontent.hxx:388
virtual void Save(XclExpStream &rStrm) override
Writes all needed records for this web query.
Definition: xecontent.cxx:2075
XclExpStringRef mxQryTables
Source document URL.
Definition: xecontent.hxx:404
virtual ~XclExpWebQuery() override
Definition: xecontent.cxx:2071
bool mbEntireDoc
Refresh time in minutes.
Definition: xecontent.hxx:406
XclExpString maDestRange
Definition: xecontent.hxx:402
sal_Int16 mnRefresh
List of source range names.
Definition: xecontent.hxx:405
XclExpWebQuery(const OUString &rRangeName, const OUString &rUrl, std::u16string_view rSource, sal_Int32 nRefrSecs)
Constructs a web query record container with settings from Calc.
Definition: xecontent.cxx:2033
XclExpString maUrl
Destination range.
Definition: xecontent.hxx:403
A 2D cell range address list with Excel column and row indexes.
Definition: xladdress.hxx:102
XclRange GetEnclosingRange() const
Definition: xladdress.cxx:72
bool empty() const
Definition: xladdress.hxx:110
void WriteSubList(XclExpStream &rStrm, size_t nBegin, size_t nCount, bool bCol16Bit=true, sal_uInt16 nCountInStream=0) const
Definition: xladdress.cxx:119
size_t size() const
Definition: xladdress.hxx:109
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
const OUString & GetBasePath() const
Returns the base path of the imported/exported file.
Definition: xlroot.hxx:174
rtl_TextEncoding GetTextEncoding() const
Returns the text encoding to import/export byte strings.
Definition: xlroot.hxx:147
SCTAB GetCurrScTab() const
Returns the current Calc sheet index.
Definition: xlroot.hxx:162
ScStyleSheetPool & GetStyleSheetPool() const
Returns the style sheet pool of the Calc document.
Definition: xlroot.cxx:306
XclBiff GetBiff() const
Returns the current BIFF version of the importer/exporter.
Definition: xlroot.hxx:141
ScRangeName & GetNamedRanges() const
Returns the defined names container of the Calc document.
Definition: xlroot.cxx:311
ScDocument & GetDoc() const
Returns reference to the destination document (import) or source document (export).
Definition: xlroot.cxx:285
static bool GetStringList(OUString &rStringList, const ScTokenArray &rScTokArr, sal_Unicode cSep)
Parses the passed formula and tries to find a string token list, i.e.
Definition: xlformula.cxx:893
Binary representation of an Excel token array.
Definition: xlformula.hxx:377
sal_uInt16 GetSize() const
Returns the size of the token array in bytes.
Definition: xlformula.cxx:735
void WriteArray(XclExpStream &rStrm) const
Writes the tokens of the token array (without size field).
Definition: xlformula.cxx:781
static const XclGuid maGuidStdLink
Definition: xltools.hxx:95
static const XclGuid maGuidFileMoniker
GUID of URL moniker (HLINK record).
Definition: xltools.hxx:97
static const XclGuid maGuidUrlMoniker
GUID of StdLink (HLINK record).
Definition: xltools.hxx:96
static OString ToOString(const Color &rColor)
Definition: xestream.cxx:709
static OUString ToOUString(const char *s)
Definition: xestream.cxx:785
@ IconSet_3Triangles
Definition: colorscale.hxx:200
@ IconSet_3ColorSmilies
Definition: colorscale.hxx:201
@ IconSet_5Boxes
Definition: colorscale.hxx:211
@ IconSet_3Smilies
Definition: colorscale.hxx:198
@ IconSet_3Stars
Definition: colorscale.hxx:199
@ COLORSCALE_MAX
Definition: colorscale.hxx:35
@ COLORSCALE_FORMULA
Definition: colorscale.hxx:39
@ COLORSCALE_PERCENT
Definition: colorscale.hxx:38
@ COLORSCALE_PERCENTILE
Definition: colorscale.hxx:36
@ COLORSCALE_AUTO
Definition: colorscale.hxx:33
@ COLORSCALE_MIN
Definition: colorscale.hxx:34
ScConditionMode
Definition: conditio.hxx:60
int nCount
sal_uInt32 mnSize
float u
OUString maUrl
FuncFlags mnFlags
Information about all parameters.
constexpr sal_Int32 FSNS(sal_Int32 namespc, sal_Int32 element)
void insert_value(Type &rnBitField, InsertType nValue, sal_uInt8 nStartBit, sal_uInt8 nBitCount)
Inserts a value into a bitfield.
Definition: ftools.hxx:102
bool get_flag(Type nBitField, Type nMask)
Returns true, if at least one of the bits set in nMask is set in nBitField.
Definition: ftools.hxx:75
ReturnType ulimit_cast(Type nValue, ReturnType nMax)
Returns the value, if it is not greater than nMax, otherwise nMax.
Definition: ftools.hxx:53
void set_flag(Type &rnBitField, Type nMask, bool bSet=true)
Sets or clears (according to bSet) all set bits of nMask in rnBitField.
Definition: ftools.hxx:95
sal_Int32 nIndex
sal_uInt16 nPos
#define SAL_WARN_IF(condition, area, stream)
aBuf
OUStringBuffer & truncateToLength(OUStringBuffer &rBuffer, sal_Int32 nLength)
OString generateGUIDString()
ScCondFormatDateType
Definition: conditio.hxx:484
int i
void SvStream & rStrm
std::basic_string_view< charT, traits > getToken(std::basic_string_view< charT, traits > sv, charT delimiter, std::size_t &position)
OUString getRelationship(Relationship eRelationship)
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
const char * UseIf(const char *s, bool bUse)
std::shared_ptr< FastSerializerHelper > FSHelperPtr
XML_type
const ObjectTypeFormatEntry & mrEntry
@ SC_AUTOCOL_RAW
COL_AUTO is returned.
Definition: patattr.hxx:44
sal_Int32 mnType
constexpr TypedWhichId< SvxFontHeightItem > ATTR_FONT_HEIGHT(101)
constexpr TypedWhichId< SvxPostureItem > ATTR_FONT_POSTURE(103)
constexpr TypedWhichId< SvxWeightItem > ATTR_FONT_WEIGHT(102)
constexpr TypedWhichId< SvxColorItem > ATTR_FONT_COLOR(109)
constexpr TypedWhichId< SvxBrushItem > ATTR_BACKGROUND(148)
constexpr TypedWhichId< SvxBoxItem > ATTR_BORDER(150)
constexpr TypedWhichId< SvxCrossedOutItem > ATTR_FONT_CROSSEDOUT(106)
constexpr TypedWhichId< SvxUnderlineItem > ATTR_FONT_UNDERLINE(104)
double mnPriority
sal_uIntPtr sal_uLong
#define STREAM_SEEK_TO_BEGIN
std::unique_ptr< ScColorScaleEntry, o3tl::default_delete< ScColorScaleEntry > > mpLowerLimit
Definition: colorscale.hxx:185
double mnMinLength
Minimal length of a databar in percent of cell length Value has to be in the range [0,...
Definition: colorscale.hxx:172
double mnMaxLength
Maximal length of a databar in percent of cell length Value has to be in the range (0,...
Definition: colorscale.hxx:177
Color maPositiveColor
Color for all Positive Values and if mbNeg == false also for negative ones.
Definition: colorscale.hxx:134
bool mbOnlyBar
If TRUE we only show the bar and not the value.
Definition: colorscale.hxx:182
std::unique_ptr< ScColorScaleEntry, o3tl::default_delete< ScColorScaleEntry > > mpUpperLimit
Definition: colorscale.hxx:184
ScIconSetType eIconSetType
Definition: colorscale.hxx:333
bool mbReverse
Specifies whether the icons should be shown in reverse order.
Definition: colorscale.hxx:338
Extends the XclCellArea struct for export.
Definition: xestyle.hxx:373
void FillToCF8(sal_uInt16 &rnPattern, sal_uInt16 &rnColor) const
Fills the data to the passed fields of a BIFF8 CF (conditional format) record.
Definition: xestyle.cxx:1924
void SetFinalColors(const XclExpPalette &rPalette)
Fills the mn***Color base members from the mn***ColorId members.
Definition: xestyle.cxx:1905
bool FillFromItemSet(const SfxItemSet &rItemSet, XclExpPalette &rPalette, bool bStyle)
Fills the area attributes from the passed item set.
Definition: xestyle.cxx:1887
Extends the XclCellBorder struct for export.
Definition: xestyle.hxx:342
void SetFinalColors(const XclExpPalette &rPalette)
Fills the mn***Color base members from the mn***ColorId members.
Definition: xestyle.cxx:1764
bool FillFromItemSet(const SfxItemSet &rItemSet, XclExpPalette &rPalette, XclBiff eBiff, bool bStyle=false)
Fills the border attributes from the passed item set.
Definition: xestyle.cxx:1706
void FillToCF8(sal_uInt16 &rnLine, sal_uInt32 &rnColor) const
Fills the data to the passed fields of a BIFF8 CF (conditional format) record.
Definition: xestyle.cxx:1801
const ScFormatEntry * pEntry
Definition: xeextlst.hxx:31
This struct helps reading and writing Excel fonts.
Definition: xlstyle.hxx:286
void FillFromVclFont(const vcl::Font &rFont)
Fills all members (except color and escapement) from the passed font.
Definition: xlstyle.cxx:204
Color maColor
String with styles (bold, italic).
Definition: xlstyle.hxx:289
sal_uInt16 mnHeight
Font color.
Definition: xlstyle.hxx:290
sal_uInt16 mnWeight
Font height in twips (1/20 of a point).
Definition: xlstyle.hxx:291
bool mbItalic
Underline style.
Definition: xlstyle.hxx:296
sal_uInt8 mnUnderline
Windows character set.
Definition: xlstyle.hxx:295
bool mbStrikeout
true = Italic.
Definition: xlstyle.hxx:297
unsigned char sal_uInt8
sal_Int16 SCTAB
Definition: types.hxx:22
OUString sId
#define SC_UNONAME_FILTER
Definition: unonames.hxx:367
#define SC_UNONAME_REFDELAY
Definition: unonames.hxx:371
#define SC_UNO_AREALINKS
Definition: unonames.hxx:39
#define SC_UNONAME_LINKURL
Definition: unonames.hxx:369
INetProtocol
constexpr OUStringLiteral INET_FILE_SCHEME
@ SC_VALID_TEXTLEN
Definition: validat.hxx:45
@ SC_VALID_TIME
Definition: validat.hxx:44
@ SC_VALID_CUSTOM
Definition: validat.hxx:47
@ SC_VALID_ANY
Definition: validat.hxx:40
@ SC_VALID_DECIMAL
Definition: validat.hxx:42
@ SC_VALID_WHOLE
Definition: validat.hxx:41
@ SC_VALID_DATE
Definition: validat.hxx:43
@ SC_VALID_LIST
Definition: validat.hxx:46
ScValidErrorStyle
Definition: validat.hxx:51
@ SC_VALERR_MACRO
Definition: validat.hxx:55
@ SC_VALERR_STOP
Definition: validat.hxx:52
@ SC_VALERR_WARNING
Definition: validat.hxx:53
@ SC_VALERR_INFO
Definition: validat.hxx:54
std::unique_ptr< char[]> aBuffer
const sal_uInt32 EXC_SST_HASHTABLE_SIZE
Definition: xecontent.cxx:115
@ XclExpExtDataBarType
Definition: xeextlst.hxx:21
std::shared_ptr< XclExpString > XclExpStringRef
Definition: xeroot.hxx:35
#define XESTRING_TO_PSZ(s)
Definition: xestream.hxx:232
@ EXC_COLOR_CELLTEXT
Definition: xestyle.hxx:47
@ EXC_BIFF8
MS Excel 5.0, MS Excel 7.0 (95)
Definition: xlconst.hxx:35
@ EXC_OUTPUT_BINARY
Definition: xlconst.hxx:42
@ EXC_OUTPUT_XML_2007
MS Excel binary .xls.
Definition: xlconst.hxx:43
const sal_uInt32 EXC_DV_COND_NOTBETWEEN
Definition: xlcontent.hxx:126
const sal_uInt16 EXC_ID_DV
Definition: xlcontent.hxx:103
const sal_uInt16 EXC_WQSETT_SPECTABLES
All tables or entire document.
Definition: xlcontent.hxx:176
const sal_uInt32 EXC_DV_ERROR_INFO
Definition: xlcontent.hxx:138
const sal_uInt32 EXC_DV_IGNOREBLANK
Definition: xlcontent.hxx:107
const sal_uInt32 EXC_DV_COND_BETWEEN
Definition: xlcontent.hxx:125
const sal_uInt32 EXC_DV_COND_NOTEQUAL
Definition: xlcontent.hxx:128
const sal_uInt16 EXC_MERGEDCELLS_MAXCOUNT
Definition: xlcontent.hxx:34
const sal_uInt32 EXC_HLINK_DESCR
Absolute path.
Definition: xlcontent.hxx:146
const sal_uInt32 EXC_DV_MODE_ANY
Definition: xlcontent.hxx:114
const sal_uInt16 EXC_ID_LABELRANGES
Definition: xlcontent.hxx:50
const sal_uInt16 EXC_ID_CF
Definition: xlcontent.hxx:55
constexpr OUStringLiteral EXC_WEBQRY_FILTER
UNC path.
Definition: xlcontent.hxx:153
const sal_uInt16 EXC_QSI_DEFAULTFLAGS
Definition: xlcontent.hxx:168
const sal_uInt32 EXC_DV_SHOWPROMPT
Definition: xlcontent.hxx:109
const sal_uInt16 EXC_PQRYTYPE_WEBQUERY
Source type: ODBC.
Definition: xlcontent.hxx:161
const sal_uInt16 EXC_WQSETT_DEFAULTFLAGS
Specific tables.
Definition: xlcontent.hxx:177
const sal_uInt16 EXC_WQSETT_FORMATFULL
Definition: xlcontent.hxx:180
const sal_uInt32 EXC_DV_MODE_WHOLE
Definition: xlcontent.hxx:115
const sal_uInt32 EXC_CF_BLOCK_AREA
Border block present?
Definition: xlcontent.hxx:85
const sal_uInt16 EXC_ID_0802
Flags for export.
Definition: xlcontent.hxx:171
const sal_uInt16 EXC_ID_QSI
All tables.
Definition: xlcontent.hxx:167
const sal_uInt8 EXC_CF_CMP_NOT_BETWEEN
Definition: xlcontent.hxx:63
const sal_uInt16 EXC_WQSETT_ALL
Definition: xlcontent.hxx:175
const sal_uInt16 EXC_ID_WQSTRING
Definition: xlcontent.hxx:156
const sal_uInt32 EXC_CF_ALLDEFAULT
Any area attribute modified?
Definition: xlcontent.hxx:80
const sal_uInt32 EXC_HLINK_BODY
Definition: xlcontent.hxx:144
const sal_uInt32 EXC_CF_FONT_ESCAPEM
Font underline type modified?
Definition: xlcontent.hxx:94
const sal_uInt32 EXC_DV_MODE_MASK
Definition: xlcontent.hxx:113
const sal_uInt16 EXC_ID_HLINK
Definition: xlcontent.hxx:142
const sal_uInt32 EXC_CF_AREA_ALL
Background color modified?
Definition: xlcontent.hxx:79
const sal_uInt16 EXC_ID_SST
Definition: xlcontent.hxx:45
const sal_uInt32 EXC_DV_ERROR_WARNING
Definition: xlcontent.hxx:137
const sal_uInt32 EXC_CF_BLOCK_BORDER
Alignment block present?
Definition: xlcontent.hxx:84
const sal_uInt32 EXC_CF_FONT_STYLE
NumberFormat String or Id?
Definition: xlcontent.hxx:89
const sal_uInt32 EXC_DV_COND_MASK
Definition: xlcontent.hxx:124
const sal_uInt8 EXC_CF_TYPE_FMLA
Definition: xlcontent.hxx:59
const sal_uInt32 EXC_CF_BLOCK_FONT
Font block present?
Definition: xlcontent.hxx:82
const sal_uInt32 EXC_DV_SUPPRESSDROPDOWN
Definition: xlcontent.hxx:108
const sal_uInt32 EXC_DV_SHOWERROR
Definition: xlcontent.hxx:110
const sal_uInt32 EXC_DV_COND_LESS
Definition: xlcontent.hxx:130
const sal_uInt16 EXC_ID_WQTABLES
Definition: xlcontent.hxx:183
const sal_uInt16 EXC_ID_EXTSST
Definition: xlcontent.hxx:46
const sal_uInt32 EXC_DV_MODE_TIME
Definition: xlcontent.hxx:119
const sal_uInt8 EXC_CF_TYPE_CELL
Definition: xlcontent.hxx:58
const sal_uInt32 EXC_CF_BORDER_ALL
Bottom border line modified?
Definition: xlcontent.hxx:75
const sal_uInt8 EXC_CF_CMP_LESS
Definition: xlcontent.hxx:67
const sal_uInt8 EXC_CF_CMP_GREATER
Definition: xlcontent.hxx:66
const sal_uInt32 EXC_DV_MODE_TEXTLEN
Definition: xlcontent.hxx:120
const sal_uInt16 EXC_PQRY_WEBQUERY
ODBC connection.
Definition: xlcontent.hxx:163
const sal_uInt8 EXC_CF_TYPE_NONE
Definition: xlcontent.hxx:57
const sal_uInt32 EXC_DV_MODE_LIST
Definition: xlcontent.hxx:117
const sal_uInt16 EXC_ID_PQRY
Definition: xlcontent.hxx:159
const sal_uInt8 EXC_CF_CMP_LESS_EQUAL
Definition: xlcontent.hxx:69
const sal_uInt32 EXC_CF_FONT_ALLDEFAULT
Font cancellation modified?
Definition: xlcontent.hxx:91
const sal_uInt32 EXC_DV_COND_EQGREATER
Definition: xlcontent.hxx:131
const sal_uInt16 EXC_ID_CONDFMT
Definition: xlcontent.hxx:54
const sal_uInt8 EXC_CF_CMP_NONE
Definition: xlcontent.hxx:61
const sal_uInt32 EXC_DV_MODE_DATE
Definition: xlcontent.hxx:118
const sal_uInt32 EXC_DV_COND_EQUAL
Definition: xlcontent.hxx:127
const sal_uInt32 EXC_DV_MODE_DECIMAL
Definition: xlcontent.hxx:116
const sal_uInt8 EXC_CF_CMP_GREATER_EQUAL
Definition: xlcontent.hxx:68
const sal_uInt32 EXC_DV_ERROR_STOP
Definition: xlcontent.hxx:136
const sal_uInt32 EXC_DV_ERROR_MASK
Definition: xlcontent.hxx:135
const sal_uInt32 EXC_DV_MODE_CUSTOM
Definition: xlcontent.hxx:121
const sal_uInt16 EXC_ID_DVAL
Font escapement type modified?
Definition: xlcontent.hxx:98
const sal_uInt8 EXC_CF_CMP_NOT_EQUAL
Definition: xlcontent.hxx:65
const sal_uInt16 EXC_ID_MERGEDCELLS
Definition: xlcontent.hxx:33
const sal_uInt32 EXC_DV_STRINGLIST
Definition: xlcontent.hxx:106
const sal_uInt32 EXC_CF_FONT_STRIKEOUT
Font posture or weight modified?
Definition: xlcontent.hxx:90
const sal_uInt8 EXC_CF_CMP_EQUAL
Definition: xlcontent.hxx:64
const sal_uInt16 EXC_ID_WQSETT
Definition: xlcontent.hxx:174
const sal_uInt32 EXC_DV_COND_EQLESS
Definition: xlcontent.hxx:132
const sal_uInt32 EXC_HLINK_MARK
Description.
Definition: xlcontent.hxx:147
const sal_uInt16 EXC_PQRY_TABLES
Web query.
Definition: xlcontent.hxx:164
const sal_uInt32 EXC_DV_COND_GREATER
Definition: xlcontent.hxx:129
const sal_uInt8 EXC_CF_CMP_BETWEEN
Definition: xlcontent.hxx:62
const sal_uInt32 EXC_CF_FONT_UNDERL
Default flags.
Definition: xlcontent.hxx:93
const sal_uInt32 EXC_HLINK_ABS
Contains file link or URL.
Definition: xlcontent.hxx:145
@ EXC_FMLATYPE_DATAVAL
Conditional format.
Definition: xlformula.hxx:165
@ EXC_FMLATYPE_WQUERY
Spreadsheet links in form controls.
Definition: xlformula.hxx:169
@ EXC_FMLATYPE_LISTVAL
Web query source range.
Definition: xlformula.hxx:170
@ EXC_FMLATYPE_CONDFMT
Shared formula.
Definition: xlformula.hxx:164
std::shared_ptr< XclTokenArray > XclTokenArrayRef
Definition: xlformula.hxx:416
const sal_uInt8 EXC_TOKID_STR
Missing argument.
Definition: xlformula.hxx:74
@ EightBitLength
Always use UCS-2 characters (default: try to compress). BIFF8 only.
@ ForceUnicode
Default string settings.
const sal_uInt16 EXC_FONTESC_NONE
Definition: xlstyle.hxx:125
const sal_uInt32 EXC_XFID_NOTFOUND
Special index for "not found" state.
Definition: xlstyle.hxx:142