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 <utility>
22#include <xecontent.hxx>
23
24#include <vector>
25#include <algorithm>
26#include <string_view>
27
28#include <com/sun/star/frame/XModel.hpp>
29#include <com/sun/star/sheet/XAreaLinks.hpp>
30#include <com/sun/star/sheet/XAreaLink.hpp>
31#include <com/sun/star/sheet/TableValidationVisibility.hpp>
32#include <com/sun/star/beans/XPropertySet.hpp>
33#include <sfx2/objsh.hxx>
34#include <tools/urlobj.hxx>
35#include <formula/grammar.hxx>
36#include <scitems.hxx>
37#include <editeng/flditem.hxx>
38#include <document.hxx>
39#include <validat.hxx>
40#include <unonames.hxx>
41#include <convuno.hxx>
42#include <rangenam.hxx>
43#include <tokenarray.hxx>
44#include <stlpool.hxx>
45#include <patattr.hxx>
46#include <fapihelper.hxx>
47#include <xehelper.hxx>
48#include <xestyle.hxx>
49#include <xename.hxx>
50#include <xlcontent.hxx>
51#include <xltools.hxx>
52#include <xeformula.hxx>
53#include <rtl/uuid.h>
54#include <sal/log.hxx>
55#include <oox/export/utils.hxx>
56#include <oox/token/namespaces.hxx>
58#include <comphelper/string.hxx>
59#include <o3tl/string_view.hxx>
60
61using namespace ::oox;
62
63using ::com::sun::star::uno::Reference;
64using ::com::sun::star::uno::UNO_QUERY;
65using ::com::sun::star::table::CellRangeAddress;
66using ::com::sun::star::sheet::XAreaLinks;
67using ::com::sun::star::sheet::XAreaLink;
68
69// Shared string table ========================================================
70
71namespace {
72
74struct XclExpHashEntry
75{
76 const XclExpString* mpString;
77 sal_uInt32 mnSstIndex;
78 explicit XclExpHashEntry( const XclExpString* pString, sal_uInt32 nSstIndex ) :
79 mpString( pString ), mnSstIndex( nSstIndex ) {}
80};
81
83struct XclExpHashEntrySWO
84{
85 bool operator()( const XclExpHashEntry& rLeft, const XclExpHashEntry& rRight ) const
86 { return *rLeft.mpString < *rRight.mpString; }
87};
88
89}
90
95{
96public:
97 explicit XclExpSstImpl();
98
100 sal_uInt32 Insert( XclExpStringRef xString );
101
103 void Save( XclExpStream& rStrm );
105
106private:
107 typedef ::std::vector< XclExpHashEntry > XclExpHashVec;
108
109 std::vector< XclExpStringRef > maStringVector;
110 std::vector< XclExpHashVec >
112 sal_uInt32 mnTotal;
113 sal_uInt32 mnSize;
114};
115
116const sal_uInt32 EXC_SST_HASHTABLE_SIZE = 2048;
117
119 maHashTab( EXC_SST_HASHTABLE_SIZE ),
120 mnTotal( 0 ),
121 mnSize( 0 )
122{
123}
124
126{
127 OSL_ENSURE( xString, "XclExpSstImpl::Insert - empty pointer not allowed" );
128 if( !xString )
129 xString.reset( new XclExpString );
130
131 ++mnTotal;
132 sal_uInt32 nSstIndex = 0;
133
134 // calculate hash value in range [0,EXC_SST_HASHTABLE_SIZE)
135 sal_uInt16 nHash = xString->GetHash();
136 nHash = (nHash ^ (nHash / EXC_SST_HASHTABLE_SIZE)) % EXC_SST_HASHTABLE_SIZE;
137
138 XclExpHashVec& rVec = maHashTab[ nHash ];
139 XclExpHashEntry aEntry( xString.get(), mnSize );
140 XclExpHashVec::iterator aIt = ::std::lower_bound( rVec.begin(), rVec.end(), aEntry, XclExpHashEntrySWO() );
141 if( (aIt == rVec.end()) || (*aIt->mpString != *xString) )
142 {
143 nSstIndex = mnSize;
144 maStringVector.push_back( xString );
145 rVec.insert( aIt, aEntry );
146 ++mnSize;
147 }
148 else
149 {
150 nSstIndex = aIt->mnSstIndex;
151 }
152
153 return nSstIndex;
154}
155
157{
158 if( maStringVector.empty() )
159 return;
160
161 SvMemoryStream aExtSst( 8192 );
162
163 sal_uInt32 nBucket = mnSize;
164 while( nBucket > 0x0100 )
165 nBucket /= 2;
166
167 sal_uInt16 nPerBucket = llimit_cast< sal_uInt16 >( nBucket, 8 );
168 sal_uInt16 nBucketIndex = 0;
169
170 // *** write the SST record ***
171
172 rStrm.StartRecord( EXC_ID_SST, 8 );
173
174 rStrm << mnTotal << mnSize;
175 for (auto const& elem : maStringVector)
176 {
177 if( !nBucketIndex )
178 {
179 // write bucket info before string to get correct record position
180 sal_uInt32 nStrmPos = static_cast< sal_uInt32 >( rStrm.GetSvStreamPos() );
181 sal_uInt16 nRecPos = rStrm.GetRawRecPos() + 4;
182 aExtSst.WriteUInt32( nStrmPos ) // stream position
183 .WriteUInt16( nRecPos ) // position from start of SST or CONTINUE
184 .WriteUInt16( 0 ); // reserved
185 }
186
187 rStrm << *elem;
188
189 if( ++nBucketIndex == nPerBucket )
190 nBucketIndex = 0;
191 }
192
193 rStrm.EndRecord();
194
195 // *** write the EXTSST record ***
196
197 rStrm.StartRecord( EXC_ID_EXTSST, 0 );
198
199 rStrm << nPerBucket;
200 rStrm.SetSliceSize( 8 ); // size of one bucket info
201 aExtSst.Seek( STREAM_SEEK_TO_BEGIN );
202 rStrm.CopyFromStream( aExtSst );
203
204 rStrm.EndRecord();
205}
206
208{
209 if( maStringVector.empty() )
210 return;
211
212 sax_fastparser::FSHelperPtr pSst = rStrm.CreateOutputStream(
213 "xl/sharedStrings.xml",
214 u"sharedStrings.xml",
215 rStrm.GetCurrentStream()->getOutputStream(),
216 "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
217 oox::getRelationship(Relationship::SHAREDSTRINGS));
218 rStrm.PushStream( pSst );
219
220 pSst->startElement( XML_sst,
221 XML_xmlns, rStrm.getNamespaceURL(OOX_NS(xls)),
222 XML_count, OString::number(mnTotal),
223 XML_uniqueCount, OString::number(mnSize) );
224
225 for (auto const& elem : maStringVector)
226 {
227 pSst->startElement(XML_si);
228 elem->WriteXml( rStrm );
229 pSst->endElement( XML_si );
230 }
231
232 pSst->endElement( XML_sst );
233
234 rStrm.PopStream();
235}
236
238 mxImpl( new XclExpSstImpl )
239{
240}
241
243{
244}
245
246sal_uInt32 XclExpSst::Insert( const XclExpStringRef& xString )
247{
248 return mxImpl->Insert( xString );
249}
250
252{
253 mxImpl->Save( rStrm );
254}
255
257{
258 mxImpl->SaveXml( rStrm );
259}
260
261// Merged cells ===============================================================
262
264 XclExpRoot( rRoot )
265{
266}
267
268void XclExpMergedcells::AppendRange( const ScRange& rRange, sal_uInt32 nBaseXFId )
269{
270 if( GetBiff() == EXC_BIFF8 )
271 {
272 maMergedRanges.push_back( rRange );
273 maBaseXFIds.push_back( nBaseXFId );
274 }
275}
276
277sal_uInt32 XclExpMergedcells::GetBaseXFId( const ScAddress& rPos ) const
278{
279 OSL_ENSURE( maBaseXFIds.size() == maMergedRanges.size(), "XclExpMergedcells::GetBaseXFId - invalid lists" );
280 ScfUInt32Vec::const_iterator aIt = maBaseXFIds.begin();
281 ScRangeList& rNCRanges = const_cast< ScRangeList& >( maMergedRanges );
282 for ( size_t i = 0, nRanges = rNCRanges.size(); i < nRanges; ++i, ++aIt )
283 {
284 const ScRange & rScRange = rNCRanges[ i ];
285 if( rScRange.Contains( rPos ) )
286 return *aIt;
287 }
288 return EXC_XFID_NOTFOUND;
289}
290
292{
293 if( GetBiff() != EXC_BIFF8 )
294 return;
295
296 XclRangeList aXclRanges;
298 size_t nFirstRange = 0;
299 size_t nRemainingRanges = aXclRanges.size();
300 while( nRemainingRanges > 0 )
301 {
302 size_t nRangeCount = ::std::min< size_t >( nRemainingRanges, EXC_MERGEDCELLS_MAXCOUNT );
303 rStrm.StartRecord( EXC_ID_MERGEDCELLS, 2 + 8 * nRangeCount );
304 aXclRanges.WriteSubList( rStrm, nFirstRange, nRangeCount );
305 rStrm.EndRecord();
306 nFirstRange += nRangeCount;
307 nRemainingRanges -= nRangeCount;
308 }
309}
310
312{
313 size_t nCount = maMergedRanges.size();
314 if( !nCount )
315 return;
316 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
317 rWorksheet->startElement(XML_mergeCells, XML_count, OString::number(nCount));
318 for( size_t i = 0; i < nCount; ++i )
319 {
320 const ScRange & rRange = maMergedRanges[ i ];
321 rWorksheet->singleElement(XML_mergeCell, XML_ref,
322 XclXmlUtils::ToOString(rStrm.GetRoot().GetDoc(), rRange));
323 }
324 rWorksheet->endElement( XML_mergeCells );
325}
326
327// Hyperlinks =================================================================
328
329XclExpHyperlink::XclExpHyperlink( const XclExpRoot& rRoot, const SvxURLField& rUrlField, const ScAddress& rScPos ) :
331 maScPos( rScPos ),
332 mxVarData( new SvMemoryStream ),
333 mnFlags( 0 )
334{
335 const OUString& rUrl = rUrlField.GetURL();
336 const OUString& rRepr = rUrlField.GetRepresentation();
337 INetURLObject aUrlObj( rUrl );
338 const INetProtocol eProtocol = aUrlObj.GetProtocol();
339 bool bWithRepr = !rRepr.isEmpty();
340 XclExpStream aXclStrm( *mxVarData, rRoot ); // using in raw write mode.
341
342 // description
343 if( bWithRepr )
344 {
345 XclExpString aDescr( rRepr, XclStrFlags::ForceUnicode, 255 );
346 aXclStrm << sal_uInt32( aDescr.Len() + 1 ); // string length + 1 trailing zero word
347 aDescr.WriteBuffer( aXclStrm ); // NO flags
348 aXclStrm << sal_uInt16( 0 );
349
351 m_Repr = rRepr;
352 }
353
354 // file link or URL
355 if( eProtocol == INetProtocol::File || eProtocol == INetProtocol::Smb )
356 {
357 sal_uInt16 nLevel;
358 bool bRel;
359 OUString aFileName(
360 BuildFileName(nLevel, bRel, rUrl, rRoot, rRoot.GetOutput() == EXC_OUTPUT_XML_2007));
361
362 if( eProtocol == INetProtocol::Smb )
363 {
364 // #n382718# (and #n261623#) Convert smb notation to '\\'
366 aFileName = aFileName.copy(4); // skip the 'smb:' part
367 aFileName = aFileName.replace('/', '\\');
368 }
369
370 if( !bRel )
373
374 OString aAsciiLink(OUStringToOString(aFileName,
375 rRoot.GetTextEncoding()));
376 XclExpString aLink( aFileName, XclStrFlags::ForceUnicode, 255 );
378 << nLevel
379 << sal_uInt32( aAsciiLink.getLength() + 1 ); // string length + 1 trailing zero byte
380 aXclStrm.Write( aAsciiLink.getStr(), aAsciiLink.getLength() );
381 aXclStrm << sal_uInt8( 0 )
382 << sal_uInt32( 0xDEADFFFF );
383 aXclStrm.WriteZeroBytes( 20 );
384 aXclStrm << sal_uInt32( aLink.GetBufferSize() + 6 )
385 << sal_uInt32( aLink.GetBufferSize() ) // byte count, not string length
386 << sal_uInt16( 0x0003 );
387 aLink.WriteBuffer( aXclStrm ); // NO flags
388
389 if (m_Repr.isEmpty())
390 m_Repr = aFileName;
391
393
394 if( bRel )
395 {
396 for( int i = 0; i < nLevel; ++i )
397 msTarget = "../" + msTarget;
398 }
399 else if (rRoot.GetOutput() != EXC_OUTPUT_XML_2007)
400 {
401 // xls expects the file:/// part appended ( or at least
402 // ms2007 does, ms2010 is more tolerant )
403 msTarget = "file:///" + msTarget;
404 }
405 }
406 else if( eProtocol != INetProtocol::NotValid )
407 {
410 << sal_uInt32( aUrl.GetBufferSize() + 2 ); // byte count + 1 trailing zero word
411 aUrl.WriteBuffer( aXclStrm ); // NO flags
412 aXclStrm << sal_uInt16( 0 );
413
415 if (m_Repr.isEmpty())
416 m_Repr = rUrl;
417
419 }
420 else if( !rUrl.isEmpty() && rUrl[0] == '#' ) // hack for #89066#
421 {
422 OUString aTextMark( rUrl.copy( 1 ) );
423
424 sal_Int32 nSepPos = aTextMark.lastIndexOf( '!' );
425 sal_Int32 nPointPos = aTextMark.lastIndexOf( '.' );
426 // last dot is the separator, if there is no ! after it
427 if(nSepPos < nPointPos)
428 {
429 nSepPos = nPointPos;
430 aTextMark = aTextMark.replaceAt( nSepPos, 1, u"!" );
431 }
432
433 if (nSepPos != -1)
434 {
435 std::u16string_view aSheetName(aTextMark.subView(0, nSepPos));
436
437 if (aSheetName.find(' ') != std::u16string_view::npos && aSheetName[0] != '\'')
438 {
439 aTextMark = "'" + aTextMark.replaceAt(nSepPos, 0, u"'");
440 }
441 }
442 else
443 {
444 SCTAB nTab;
445 if (rRoot.GetDoc().GetTable(aTextMark, nTab))
446 aTextMark += "!A1"; // tdf#143220 link to sheet not valid without cell reference
447 }
448
449 mxTextMark.reset( new XclExpString( aTextMark, XclStrFlags::ForceUnicode, 255 ) );
450 }
451
452 // text mark
453 if( !mxTextMark && aUrlObj.HasMark() )
454 mxTextMark.reset( new XclExpString( aUrlObj.GetMark(), XclStrFlags::ForceUnicode, 255 ) );
455
456 if( mxTextMark )
457 {
458 aXclStrm << sal_uInt32( mxTextMark->Len() + 1 ); // string length + 1 trailing zero word
459 mxTextMark->WriteBuffer( aXclStrm ); // NO flags
460 aXclStrm << sal_uInt16( 0 );
461
463
464 OUString location = XclXmlUtils::ToOUString(*mxTextMark);
465 if (!location.isEmpty() && msTarget.endsWith(Concat2View("#" + location)))
466 msTarget = msTarget.copy(0, msTarget.getLength() - location.getLength() - 1);
467 }
468
469 SetRecSize( 32 + mxVarData->Tell() );
470}
471
473{
474}
475
477 sal_uInt16& rnLevel, bool& rbRel, const OUString& rUrl, const XclExpRoot& rRoot, bool bEncoded )
478{
479 INetURLObject aURLObject( rUrl );
480 OUString aDosName(bEncoded ? aURLObject.GetMainURL(INetURLObject::DecodeMechanism::ToIUri)
481 : aURLObject.getFSysPath(FSysStyle::Dos));
482 rnLevel = 0;
483 rbRel = rRoot.IsRelUrl();
484
485 if( rbRel )
486 {
487 // try to convert to relative file name
488 OUString aTmpName( aDosName );
489 aDosName = INetURLObject::GetRelURL( rRoot.GetBasePath(), rUrl,
492
493 if (aDosName.startsWith(INET_FILE_SCHEME))
494 {
495 // not converted to rel -> back to old, return absolute flag
496 aDosName = aTmpName;
497 rbRel = false;
498 }
499 else if (aDosName.startsWith("./"))
500 {
501 aDosName = aDosName.copy(2);
502 }
503 else
504 {
505 while (aDosName.startsWith("../"))
506 {
507 aDosName = aDosName.copy(3);
508 ++rnLevel;
509 }
510 }
511 }
512 return aDosName;
513}
514
516{
517 sal_uInt16 nXclCol = static_cast< sal_uInt16 >( maScPos.Col() );
518 sal_uInt16 nXclRow = static_cast< sal_uInt16 >( maScPos.Row() );
519 rStrm << nXclRow << nXclRow << nXclCol << nXclCol;
521}
522
524{
526 << sal_uInt32( 2 )
527 << mnFlags;
528
530 rStrm.CopyFromStream( *mxVarData );
531}
532
534{
535 OUString sId = !msTarget.isEmpty() ? rStrm.addRelation( rStrm.GetCurrentStream()->getOutputStream(),
536 oox::getRelationship(Relationship::HYPERLINK),
537 msTarget, true ) : OUString();
538 std::optional<OString> sTextMark;
539 if (mxTextMark)
541 rStrm.GetCurrentStream()->singleElement( XML_hyperlink,
542 XML_ref, XclXmlUtils::ToOString(rStrm.GetRoot().GetDoc(), maScPos),
543 FSNS( XML_r, XML_id ), sax_fastparser::UseIf(sId, !sId.isEmpty()),
544 XML_location, sTextMark,
545 // OOXTODO: XML_tooltip, from record HLinkTooltip 800h wzTooltip
546 XML_display, m_Repr );
547}
548
549// Label ranges ===============================================================
550
552 XclExpRoot( rRoot )
553{
554 SCTAB nScTab = GetCurrScTab();
555 // row label ranges
557 // row labels only over 1 column (restriction of Excel97/2000/XP)
558 for ( size_t i = 0, nRanges = maRowRanges.size(); i < nRanges; ++i )
559 {
560 ScRange & rScRange = maRowRanges[ i ];
561 if( rScRange.aStart.Col() != rScRange.aEnd.Col() )
562 rScRange.aEnd.SetCol( rScRange.aStart.Col() );
563 }
564 // col label ranges
566}
567
569 const ScRangePairListRef& xLabelRangesRef, SCTAB nScTab )
570{
571 for ( size_t i = 0, nPairs = xLabelRangesRef->size(); i < nPairs; ++i )
572 {
573 const ScRangePair & rRangePair = (*xLabelRangesRef)[i];
574 const ScRange& rScRange = rRangePair.GetRange( 0 );
575 if( rScRange.aStart.Tab() == nScTab )
576 rScRanges.push_back( rScRange );
577 }
578}
579
581{
583 XclRangeList aRowXclRanges, aColXclRanges;
584 rAddrConv.ConvertRangeList( aRowXclRanges, maRowRanges, false );
585 rAddrConv.ConvertRangeList( aColXclRanges, maColRanges, false );
586 if( !aRowXclRanges.empty() || !aColXclRanges.empty() )
587 {
588 rStrm.StartRecord( EXC_ID_LABELRANGES, 4 + 8 * (aRowXclRanges.size() + aColXclRanges.size()) );
589 rStrm << aRowXclRanges << aColXclRanges;
590 rStrm.EndRecord();
591 }
592}
593
594// Conditional formatting ====================================================
595
597class XclExpCFImpl : protected XclExpRoot
598{
599public:
600 explicit XclExpCFImpl( const XclExpRoot& rRoot, const ScCondFormatEntry& rFormatEntry, sal_Int32 nPriority, ScAddress aOrigin );
601
605
606private:
614 sal_uInt32 mnFontColorId;
617 sal_Int32 mnPriority;
628};
629
630XclExpCFImpl::XclExpCFImpl( const XclExpRoot& rRoot, const ScCondFormatEntry& rFormatEntry, sal_Int32 nPriority, ScAddress aOrigin ) :
631 XclExpRoot( rRoot ),
632 mrFormatEntry( rFormatEntry ),
633 maOrigin( aOrigin ),
634 mnFontColorId( 0 ),
636 mnOperator( EXC_CF_CMP_NONE ),
637 mnPriority( nPriority ),
638 mbFontUsed( false ),
639 mbHeightUsed( false ),
640 mbWeightUsed( false ),
641 mbColorUsed( false ),
642 mbUnderlUsed( false ),
643 mbItalicUsed( false ),
644 mbStrikeUsed( false ),
645 mbBorderUsed( false ),
646 mbPattUsed( false ),
647 mbFormula2(false)
648{
649 // Set correct tab for maOrigin from GetValidSrcPos() of the format-entry.
650 ScAddress aValidSrcPos = mrFormatEntry.GetValidSrcPos();
651 maOrigin.SetTab(aValidSrcPos.Tab());
652
653 /* Get formatting attributes here, and not in WriteBody(). This is needed to
654 correctly insert all colors into the palette. */
655
656 if( SfxStyleSheetBase* pStyleSheet = GetDoc().GetStyleSheetPool()->Find( mrFormatEntry.GetStyle(), SfxStyleFamily::Para ) )
657 {
658 const SfxItemSet& rItemSet = pStyleSheet->GetItemSet();
659
660 // font
668 if( mbFontUsed )
669 {
670 vcl::Font aFont;
671 model::ComplexColor aComplexColor;
672 ScPatternAttr::fillFontOnly(aFont, rItemSet);
673 ScPatternAttr::fillColor(aComplexColor, rItemSet, ScAutoFontColorMode::Raw);
674 maFontData.FillFromVclFont(aFont, aComplexColor);
676 }
677
678 // border
679 mbBorderUsed = ScfTools::CheckItem( rItemSet, ATTR_BORDER, true );
680 if( mbBorderUsed )
681 maBorder.FillFromItemSet( rItemSet, GetPalette(), GetBiff() );
682
683 // pattern
685 if( mbPattUsed )
686 maArea.FillFromItemSet( rItemSet, GetPalette(), true );
687 }
688
689 // *** mode and comparison operator ***
690
691 switch( rFormatEntry.GetOperation() )
692 {
695 break;
698 mbFormula2 = true;
699 break;
702 mbFormula2 = true;
703 break;
706 break;
709 break;
712 break;
715 break;
718 break;
721 break;
724 break;
725 default:
727 OSL_FAIL( "XclExpCF::WriteBody - unknown condition type" );
728 }
729}
730
732{
733
734 // *** formulas ***
735
737
738 std::unique_ptr< ScTokenArray > xScTokArr( mrFormatEntry.CreateFlatCopiedTokenArray( 0 ) );
739 mxTokArr1 = rFmlaComp.CreateFormula( EXC_FMLATYPE_CONDFMT, *xScTokArr );
740
741 if (mbFormula2)
742 {
744 mxTokArr2 = rFmlaComp.CreateFormula( EXC_FMLATYPE_CONDFMT, *xScTokArr );
745 }
746
747 // *** mode and comparison operator ***
748
749 rStrm << mnType << mnOperator;
750
751 // *** formula sizes ***
752
753 sal_uInt16 nFmlaSize1 = mxTokArr1 ? mxTokArr1->GetSize() : 0;
754 sal_uInt16 nFmlaSize2 = mxTokArr2 ? mxTokArr2->GetSize() : 0;
755 rStrm << nFmlaSize1 << nFmlaSize2;
756
757 // *** formatting blocks ***
758
760 {
761 sal_uInt32 nFlags = EXC_CF_ALLDEFAULT;
762
766
767 // attributes used -> set flags to 0.
770
771 rStrm << nFlags << sal_uInt16( 0 );
772
773 if( mbFontUsed )
774 {
775 // font height, 0xFFFFFFFF indicates unused
776 sal_uInt32 nHeight = mbHeightUsed ? maFontData.mnHeight : 0xFFFFFFFF;
777 // font style: italic and strikeout
778 sal_uInt32 nStyle = 0;
781 // font color, 0xFFFFFFFF indicates unused
782 sal_uInt32 nColor = mbColorUsed ? GetPalette().GetColorIndex( mnFontColorId ) : 0xFFFFFFFF;
783 // font used flags for italic, weight, and strikeout -> 0 = used, 1 = default
784 sal_uInt32 nFontFlags1 = EXC_CF_FONT_ALLDEFAULT;
787 // font used flag for underline -> 0 = used, 1 = default
788 sal_uInt32 nFontFlags3 = mbUnderlUsed ? 0 : EXC_CF_FONT_UNDERL;
789
790 rStrm.WriteZeroBytesToRecord( 64 );
791 rStrm << nHeight
792 << nStyle
796 rStrm.WriteZeroBytesToRecord( 3 );
797 rStrm << nColor
798 << sal_uInt32( 0 )
799 << nFontFlags1
800 << EXC_CF_FONT_ESCAPEM // escapement never used -> set the flag
801 << nFontFlags3;
802 rStrm.WriteZeroBytesToRecord( 16 );
803 rStrm << sal_uInt16( 1 ); // must be 1
804 }
805
806 if( mbBorderUsed )
807 {
808 sal_uInt16 nLineStyle = 0;
809 sal_uInt32 nLineColor = 0;
811 maBorder.FillToCF8( nLineStyle, nLineColor );
812 rStrm << nLineStyle << nLineColor << sal_uInt16( 0 );
813 }
814
815 if( mbPattUsed )
816 {
817 sal_uInt16 nPattern = 0, nColor = 0;
819 maArea.FillToCF8( nPattern, nColor );
820 rStrm << nPattern << nColor;
821 }
822 }
823 else
824 {
825 // no data blocks at all
826 rStrm << sal_uInt32( 0 ) << sal_uInt16( 0 );
827 }
828
829 // *** formulas ***
830
831 if( mxTokArr1 )
832 mxTokArr1->WriteArray( rStrm );
833 if( mxTokArr2 )
834 mxTokArr2->WriteArray( rStrm );
835}
836
837namespace {
838
839const char* GetOperatorString(ScConditionMode eMode, bool& bFrmla2)
840{
841 const char *pRet = nullptr;
842 switch(eMode)
843 {
845 pRet = "equal";
846 break;
848 pRet = "lessThan";
849 break;
851 pRet = "greaterThan";
852 break;
854 pRet = "lessThanOrEqual";
855 break;
857 pRet = "greaterThanOrEqual";
858 break;
860 pRet = "notEqual";
861 break;
863 bFrmla2 = true;
864 pRet = "between";
865 break;
867 bFrmla2 = true;
868 pRet = "notBetween";
869 break;
871 pRet = nullptr;
872 break;
874 pRet = nullptr;
875 break;
877 pRet = "beginsWith";
878 break;
880 pRet = "endsWith";
881 break;
883 pRet = "containsText";
884 break;
886 pRet = "notContains";
887 break;
889 break;
891 default:
892 break;
893 }
894 return pRet;
895}
896
897const char* GetTypeString(ScConditionMode eMode)
898{
899 switch(eMode)
900 {
902 return "expression";
907 return "top10";
912 return "aboveAverage";
914 return "uniqueValues";
916 return "duplicateValues";
918 return "containsErrors";
920 return "notContainsErrors";
922 return "beginsWith";
924 return "endsWith";
926 return "containsText";
928 return "notContainsText";
929 default:
930 return "cellIs";
931 }
932}
933
934bool IsTopBottomRule(ScConditionMode eMode)
935{
936 switch(eMode)
937 {
942 return true;
943 default:
944 break;
945 }
946
947 return false;
948}
949
950bool IsTextRule(ScConditionMode eMode)
951{
952 switch(eMode)
953 {
958 return true;
959 default:
960 break;
961 }
962
963 return false;
964}
965
966bool RequiresFormula(ScConditionMode eMode)
967{
968 if (IsTopBottomRule(eMode))
969 return false;
970 else if (IsTextRule(eMode))
971 return false;
972
973 switch (eMode)
974 {
979 return false;
980 default:
981 break;
982 }
983
984 return true;
985}
986
987bool RequiresFixedFormula(ScConditionMode eMode)
988{
989 switch(eMode)
990 {
997 return true;
998 default:
999 break;
1000 }
1001
1002 return false;
1003}
1004
1005OString GetFixedFormula(ScConditionMode eMode, const ScAddress& rAddress, std::string_view rText)
1006{
1007 OStringBuffer aBuffer;
1008 XclXmlUtils::ToOString(aBuffer, rAddress);
1009 OString aPos = aBuffer.makeStringAndClear();
1010 switch (eMode)
1011 {
1013 return OString("ISERROR(" + aPos + ")") ;
1015 return OString("NOT(ISERROR(" + aPos + "))") ;
1017 return OString("LEFT(" + aPos + ",LEN(\"" + rText + "\"))=\"" + rText + "\"");
1019 return OString("RIGHT(" + aPos +",LEN(\"" + rText + "\"))=\"" + rText + "\"");
1021 return OString(OString::Concat("NOT(ISERROR(SEARCH(\"") + rText + "\"," + aPos + ")))");
1023 return OString(OString::Concat("ISERROR(SEARCH(\"") + rText + "\"," + aPos + "))");
1024 default:
1025 break;
1026 }
1027
1028 return "";
1029}
1030
1031}
1032
1034{
1035 bool bFmla2 = false;
1037 bool bAboveAverage = eOperation == ScConditionMode::AboveAverage ||
1039 bool bEqualAverage = eOperation == ScConditionMode::AboveEqualAverage ||
1041 bool bBottom = eOperation == ScConditionMode::Bottom10
1042 || eOperation == ScConditionMode::BottomPercent;
1043 bool bPercent = eOperation == ScConditionMode::TopPercent ||
1044 eOperation == ScConditionMode::BottomPercent;
1045 OUString aRank("0");
1046 if(IsTopBottomRule(eOperation))
1047 {
1048 // position and formula grammar are not important
1049 // we only store a number there
1050 aRank = mrFormatEntry.GetExpression(ScAddress(0,0,0), 0);
1051 }
1052 OString aText;
1053 if(IsTextRule(eOperation))
1054 {
1055 // we need to write the text without quotes
1056 // we have to actually get the string from
1057 // the token array for that
1058 std::unique_ptr<ScTokenArray> pTokenArray(mrFormatEntry.CreateFlatCopiedTokenArray(0));
1059 if(pTokenArray->GetLen())
1060 aText = pTokenArray->FirstToken()->GetString().getString().toUtf8();
1061 }
1062
1063 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1064 rWorksheet->startElement( XML_cfRule,
1065 XML_type, GetTypeString( mrFormatEntry.GetOperation() ),
1066 XML_priority, OString::number(mnPriority + 1),
1067 XML_operator, GetOperatorString( mrFormatEntry.GetOperation(), bFmla2 ),
1068 XML_aboveAverage, ToPsz10(bAboveAverage),
1069 XML_equalAverage, ToPsz10(bEqualAverage),
1070 XML_bottom, ToPsz10(bBottom),
1071 XML_percent, ToPsz10(bPercent),
1072 XML_rank, aRank,
1073 XML_text, aText,
1074 XML_dxfId, OString::number(GetDxfs().GetDxfId(mrFormatEntry.GetStyle())) );
1075
1076 if (RequiresFixedFormula(eOperation))
1077 {
1078 rWorksheet->startElement(XML_formula);
1079 OString aFormula = GetFixedFormula(eOperation, maOrigin, aText);
1080 rWorksheet->writeEscaped(aFormula.getStr());
1081 rWorksheet->endElement( XML_formula );
1082 }
1083 else if(RequiresFormula(eOperation))
1084 {
1085 rWorksheet->startElement(XML_formula);
1086 std::unique_ptr<ScTokenArray> pTokenArray(mrFormatEntry.CreateFlatCopiedTokenArray(0));
1088 pTokenArray.get()));
1089 rWorksheet->endElement( XML_formula );
1090 if (bFmla2)
1091 {
1092 rWorksheet->startElement(XML_formula);
1093 std::unique_ptr<ScTokenArray> pTokenArray2(mrFormatEntry.CreateFlatCopiedTokenArray(1));
1095 pTokenArray2.get()));
1096 rWorksheet->endElement( XML_formula );
1097 }
1098 }
1099 // OOXTODO: XML_extLst
1100 rWorksheet->endElement( XML_cfRule );
1101}
1102
1103XclExpCF::XclExpCF( const XclExpRoot& rRoot, const ScCondFormatEntry& rFormatEntry, sal_Int32 nPriority, ScAddress aOrigin ) :
1105 XclExpRoot( rRoot ),
1106 mxImpl( new XclExpCFImpl( rRoot, rFormatEntry, nPriority, aOrigin ) )
1107{
1108}
1109
1111{
1112}
1113
1115{
1116 mxImpl->WriteBody( rStrm );
1117}
1118
1120{
1121 mxImpl->SaveXml( rStrm );
1122}
1123
1124XclExpDateFormat::XclExpDateFormat( const XclExpRoot& rRoot, const ScCondDateFormatEntry& rFormatEntry, sal_Int32 nPriority ):
1126 XclExpRoot( rRoot ),
1127 mrFormatEntry(rFormatEntry),
1128 mnPriority(nPriority)
1129{
1130}
1131
1133{
1134}
1135
1136namespace {
1137
1138const char* getTimePeriodString( condformat::ScCondFormatDateType eType )
1139{
1140 switch(eType)
1141 {
1142 case condformat::TODAY:
1143 return "today";
1145 return "yesterday";
1147 return "yesterday";
1149 return "thisWeek";
1151 return "lastWeek";
1153 return "nextWeek";
1155 return "thisMonth";
1157 return "lastMonth";
1159 return "nextMonth";
1161 return "last7Days";
1162 default:
1163 break;
1164 }
1165 return nullptr;
1166}
1167
1168}
1169
1171{
1172 // only write the supported entries into OOXML
1173 const char* sTimePeriod = getTimePeriodString(mrFormatEntry.GetDateType());
1174 if(!sTimePeriod)
1175 return;
1176
1177 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1178 rWorksheet->startElement( XML_cfRule,
1179 XML_type, "timePeriod",
1180 XML_priority, OString::number(mnPriority + 1),
1181 XML_timePeriod, sTimePeriod,
1182 XML_dxfId, OString::number(GetDxfs().GetDxfId(mrFormatEntry.GetStyleName())) );
1183 rWorksheet->endElement( XML_cfRule);
1184}
1185
1186XclExpCfvo::XclExpCfvo(const XclExpRoot& rRoot, const ScColorScaleEntry& rEntry, const ScAddress& rAddr, bool bFirst):
1187 XclExpRoot( rRoot ),
1188 mrEntry(rEntry),
1189 maSrcPos(rAddr),
1190 mbFirst(bFirst)
1191{
1192}
1193
1194namespace {
1195
1196OString getColorScaleType( const ScColorScaleEntry& rEntry, bool bFirst )
1197{
1198 switch(rEntry.GetType())
1199 {
1200 case COLORSCALE_MIN:
1201 return "min";
1202 case COLORSCALE_MAX:
1203 return "max";
1204 case COLORSCALE_PERCENT:
1205 return "percent";
1206 case COLORSCALE_FORMULA:
1207 return "formula";
1208 case COLORSCALE_AUTO:
1209 if(bFirst)
1210 return "min";
1211 else
1212 return "max";
1214 return "percentile";
1215 default:
1216 break;
1217 }
1218
1219 return "num";
1220}
1221
1222}
1223
1225{
1226 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1227
1228 OString aValue;
1230 {
1233 aValue = OUStringToOString(aFormula, RTL_TEXTENCODING_UTF8 );
1234 }
1235 else
1236 {
1237 aValue = OString::number( mrEntry.GetValue() );
1238 }
1239
1240 rWorksheet->startElement( XML_cfvo,
1241 XML_type, getColorScaleType(mrEntry, mbFirst),
1242 XML_val, aValue );
1243
1244 rWorksheet->endElement( XML_cfvo );
1245}
1246
1248 XclExpRoot( rRoot ),
1249 mrColor( rColor )
1250{
1251}
1252
1254{
1255}
1256
1258{
1259 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1260
1261 rWorksheet->startElement(XML_color, XML_rgb, XclXmlUtils::ToOString(mrColor));
1262
1263 rWorksheet->endElement( XML_color );
1264}
1265
1266namespace {
1267
1268OString createHexStringFromDigit(sal_uInt8 nDigit)
1269{
1270 OString aString = OString::number( nDigit, 16 );
1271 if(aString.getLength() == 1)
1272 aString += OString::number(0);
1273 return aString;
1274}
1275
1276OString createGuidStringFromInt(sal_uInt8 nGuid[16])
1277{
1278 OStringBuffer aBuffer("{");
1279 for(size_t i = 0; i < 16; ++i)
1280 {
1281 aBuffer.append(createHexStringFromDigit(nGuid[i]));
1282 if(i == 3|| i == 5 || i == 7 || i == 9 )
1283 aBuffer.append('-');
1284 }
1285 aBuffer.append('}');
1286 OString aString = aBuffer.makeStringAndClear();
1287 return aString.toAsciiUpperCase();
1288}
1289
1290OString generateGUIDString()
1291{
1292 sal_uInt8 nGuid[16];
1293 rtl_createUuid(nGuid, nullptr, true);
1294 return createGuidStringFromInt(nGuid);
1295}
1296
1297}
1298
1299XclExpCondfmt::XclExpCondfmt( const XclExpRoot& rRoot, const ScConditionalFormat& rCondFormat, const XclExtLstRef& xExtLst, sal_Int32& rIndex ) :
1301 XclExpRoot( rRoot )
1302{
1303 const ScRangeList& aScRanges = rCondFormat.GetRange();
1304 GetAddressConverter().ConvertRangeList( maXclRanges, aScRanges, true );
1305 if( maXclRanges.empty() )
1306 return;
1307
1308 std::vector<XclExpExtCondFormatData> aExtEntries;
1309 ScAddress aOrigin = aScRanges.Combine().aStart;
1310 for( size_t nIndex = 0, nCount = rCondFormat.size(); nIndex < nCount; ++nIndex )
1311 if( const ScFormatEntry* pFormatEntry = rCondFormat.GetEntry( nIndex ) )
1312 {
1313 if(pFormatEntry->GetType() == ScFormatEntry::Type::Condition)
1314 maCFList.AppendNewRecord( new XclExpCF( GetRoot(), static_cast<const ScCondFormatEntry&>(*pFormatEntry), ++rIndex, aOrigin ) );
1315 else if(pFormatEntry->GetType() == ScFormatEntry::Type::ExtCondition)
1316 {
1317 const ScCondFormatEntry& rFormat = static_cast<const ScCondFormatEntry&>(*pFormatEntry);
1318 XclExpExtCondFormatData aExtEntry;
1319 aExtEntry.nPriority = ++rIndex;
1320 aExtEntry.aGUID = generateGUIDString();
1321 aExtEntry.pEntry = &rFormat;
1322 aExtEntries.push_back(aExtEntry);
1323 }
1324 else if(pFormatEntry->GetType() == ScFormatEntry::Type::Colorscale)
1325 maCFList.AppendNewRecord( new XclExpColorScale( GetRoot(), static_cast<const ScColorScaleFormat&>(*pFormatEntry), ++rIndex ) );
1326 else if(pFormatEntry->GetType() == ScFormatEntry::Type::Databar)
1327 {
1328 const ScDataBarFormat& rFormat = static_cast<const ScDataBarFormat&>(*pFormatEntry);
1329 XclExpExtCondFormatData aExtEntry;
1330 aExtEntry.nPriority = -1;
1331 aExtEntry.aGUID = generateGUIDString();
1332 aExtEntry.pEntry = &rFormat;
1333 aExtEntries.push_back(aExtEntry);
1334
1335 maCFList.AppendNewRecord( new XclExpDataBar( GetRoot(), rFormat, ++rIndex, aExtEntry.aGUID));
1336 }
1337 else if(pFormatEntry->GetType() == ScFormatEntry::Type::Iconset)
1338 {
1339 // don't export iconSet entries that are not in OOXML
1340 const ScIconSetFormat& rIconSet = static_cast<const ScIconSetFormat&>(*pFormatEntry);
1341 bool bNeedsExt = false;
1342 switch (rIconSet.GetIconSetData()->eIconSetType)
1343 {
1344 case IconSet_3Smilies:
1346 case IconSet_3Stars:
1347 case IconSet_3Triangles:
1348 case IconSet_5Boxes:
1349 {
1350 bNeedsExt = true;
1351 }
1352 break;
1353 default:
1354 break;
1355 }
1356
1357 bNeedsExt |= rIconSet.GetIconSetData()->mbCustom;
1358
1359 if (bNeedsExt)
1360 {
1361 XclExpExtCondFormatData aExtEntry;
1362 aExtEntry.nPriority = ++rIndex;
1363 aExtEntry.aGUID = generateGUIDString();
1364 aExtEntry.pEntry = &rIconSet;
1365 aExtEntries.push_back(aExtEntry);
1366 }
1367 else
1368 maCFList.AppendNewRecord( new XclExpIconSet( GetRoot(), rIconSet, ++rIndex ) );
1369 }
1370 else if(pFormatEntry->GetType() == ScFormatEntry::Type::Date)
1371 maCFList.AppendNewRecord( new XclExpDateFormat( GetRoot(), static_cast<const ScCondDateFormatEntry&>(*pFormatEntry), ++rIndex ) );
1372 }
1374
1375 if(!aExtEntries.empty() && xExtLst)
1376 {
1377 XclExpExt* pParent = xExtLst->GetItem( XclExpExtDataBarType );
1378 if( !pParent )
1379 {
1380 xExtLst->AddRecord( new XclExpExtCondFormat( *xExtLst ) );
1381 pParent = xExtLst->GetItem( XclExpExtDataBarType );
1382 }
1383 static_cast<XclExpExtCondFormat*>(xExtLst->GetItem( XclExpExtDataBarType ))->AddRecord(
1384 new XclExpExtConditionalFormatting( *pParent, aExtEntries, aScRanges));
1385 }
1386}
1387
1389{
1390}
1391
1393{
1394 // ccf (2 bytes): An unsigned integer that specifies the count of CF records that follow this
1395 // record. MUST be greater than or equal to 0x0001, and less than or equal to 0x0003.
1396
1397 SAL_WARN_IF( maCFList.GetSize() > 3, "sc.filter", "More than 3 conditional filters for cell(s), won't export");
1398
1399 return !maCFList.IsEmpty() && maCFList.GetSize() <= 3 && !maXclRanges.empty();
1400}
1401
1403{
1404 return !maCFList.IsEmpty() && !maXclRanges.empty();
1405}
1406
1408{
1409 if( IsValidForBinary() )
1410 {
1412 maCFList.Save( rStrm );
1413 }
1414}
1415
1417{
1418 OSL_ENSURE( !maCFList.IsEmpty(), "XclExpCondfmt::WriteBody - no CF records to write" );
1419 OSL_ENSURE( !maXclRanges.empty(), "XclExpCondfmt::WriteBody - no cell ranges found" );
1420
1421 rStrm << static_cast< sal_uInt16 >( maCFList.GetSize() )
1422 << sal_uInt16( 1 )
1424 << maXclRanges;
1425}
1426
1428{
1429 if( !IsValidForXml() )
1430 return;
1431
1432 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1433 rWorksheet->startElement( XML_conditionalFormatting,
1434 XML_sqref, msSeqRef
1435 // OOXTODO: XML_pivot
1436 );
1437
1439
1440 rWorksheet->endElement( XML_conditionalFormatting );
1441}
1442
1443XclExpColorScale::XclExpColorScale( const XclExpRoot& rRoot, const ScColorScaleFormat& rFormat, sal_Int32 nPriority ):
1444 XclExpRoot( rRoot ),
1445 mnPriority( nPriority )
1446{
1447 const ScRange & rRange = rFormat.GetRange().front();
1448 ScAddress aAddr = rRange.aStart;
1449 for(const auto& rxColorScaleEntry : rFormat)
1450 {
1451 // exact position is not important, we allow only absolute refs
1452
1453 XclExpCfvoList::RecordRefType xCfvo( new XclExpCfvo( GetRoot(), *rxColorScaleEntry, aAddr ) );
1454 maCfvoList.AppendRecord( xCfvo );
1455 XclExpColScaleColList::RecordRefType xClo( new XclExpColScaleCol( GetRoot(), rxColorScaleEntry->GetColor() ) );
1456 maColList.AppendRecord( xClo );
1457 }
1458}
1459
1461{
1462 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1463
1464 rWorksheet->startElement( XML_cfRule,
1465 XML_type, "colorScale",
1466 XML_priority, OString::number(mnPriority + 1) );
1467
1468 rWorksheet->startElement(XML_colorScale);
1469
1472
1473 rWorksheet->endElement( XML_colorScale );
1474
1475 rWorksheet->endElement( XML_cfRule );
1476}
1477
1478XclExpDataBar::XclExpDataBar( const XclExpRoot& rRoot, const ScDataBarFormat& rFormat, sal_Int32 nPriority, OString aGUID):
1479 XclExpRoot( rRoot ),
1480 mrFormat( rFormat ),
1481 mnPriority( nPriority ),
1482 maGUID(std::move(aGUID))
1483{
1484 const ScRange & rRange = rFormat.GetRange().front();
1485 ScAddress aAddr = rRange.aStart;
1486 // exact position is not important, we allow only absolute refs
1487 mpCfvoLowerLimit.reset(
1488 new XclExpCfvo(GetRoot(), *mrFormat.GetDataBarData()->mpLowerLimit, aAddr, true));
1489 mpCfvoUpperLimit.reset(
1490 new XclExpCfvo(GetRoot(), *mrFormat.GetDataBarData()->mpUpperLimit, aAddr, false));
1491
1493}
1494
1496{
1497 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1498
1499 rWorksheet->startElement( XML_cfRule,
1500 XML_type, "dataBar",
1501 XML_priority, OString::number(mnPriority + 1) );
1502
1503 rWorksheet->startElement( XML_dataBar,
1504 XML_showValue, ToPsz10(!mrFormat.GetDataBarData()->mbOnlyBar),
1505 XML_minLength, OString::number(sal_uInt32(mrFormat.GetDataBarData()->mnMinLength)),
1506 XML_maxLength, OString::number(sal_uInt32(mrFormat.GetDataBarData()->mnMaxLength)) );
1507
1508 mpCfvoLowerLimit->SaveXml(rStrm);
1509 mpCfvoUpperLimit->SaveXml(rStrm);
1510 mpCol->SaveXml(rStrm);
1511
1512 rWorksheet->endElement( XML_dataBar );
1513
1514 // extLst entries for Excel 2010 and 2013
1515 rWorksheet->startElement(XML_extLst);
1516 rWorksheet->startElement(XML_ext,
1517 FSNS(XML_xmlns, XML_x14), rStrm.getNamespaceURL(OOX_NS(xls14Lst)),
1518 XML_uri, "{B025F937-C7B1-47D3-B67F-A62EFF666E3E}");
1519
1520 rWorksheet->startElementNS( XML_x14, XML_id );
1521 rWorksheet->write(maGUID);
1522 rWorksheet->endElementNS( XML_x14, XML_id );
1523
1524 rWorksheet->endElement( XML_ext );
1525 rWorksheet->endElement( XML_extLst );
1526
1527 rWorksheet->endElement( XML_cfRule );
1528}
1529
1530XclExpIconSet::XclExpIconSet( const XclExpRoot& rRoot, const ScIconSetFormat& rFormat, sal_Int32 nPriority ):
1531 XclExpRoot( rRoot ),
1532 mrFormat( rFormat ),
1533 mnPriority( nPriority )
1534{
1535 const ScRange & rRange = rFormat.GetRange().front();
1536 ScAddress aAddr = rRange.aStart;
1537 for (auto const& itr : rFormat)
1538 {
1539 // exact position is not important, we allow only absolute refs
1540
1541 XclExpCfvoList::RecordRefType xCfvo( new XclExpCfvo( GetRoot(), *itr, aAddr ) );
1542 maCfvoList.AppendRecord( xCfvo );
1543 }
1544}
1545
1547{
1548 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1549
1550 rWorksheet->startElement( XML_cfRule,
1551 XML_type, "iconSet",
1552 XML_priority, OString::number(mnPriority + 1) );
1553
1555 rWorksheet->startElement( XML_iconSet,
1556 XML_iconSet, pIconSetName,
1559
1561
1562 rWorksheet->endElement( XML_iconSet );
1563 rWorksheet->endElement( XML_cfRule );
1564}
1565
1567 XclExpRoot( rRoot )
1568{
1569 if( const ScConditionalFormatList* pCondFmtList = GetDoc().GetCondFormList(GetCurrScTab()) )
1570 {
1571 sal_Int32 nIndex = 0;
1572 for( const auto& rxCondFmt : *pCondFmtList)
1573 {
1574 XclExpCondfmtList::RecordRefType xCondfmtRec( new XclExpCondfmt( GetRoot(), *rxCondFmt, xExtLst, nIndex ));
1575 if( xCondfmtRec->IsValidForXml() )
1576 maCondfmtList.AppendRecord( xCondfmtRec );
1577 }
1578 }
1579}
1580
1582{
1584}
1585
1587{
1589}
1590
1591// Validation =================================================================
1592
1593namespace {
1594
1596void lclWriteDvFormula( XclExpStream& rStrm, const XclTokenArray* pXclTokArr )
1597{
1598 sal_uInt16 nFmlaSize = pXclTokArr ? pXclTokArr->GetSize() : 0;
1599 rStrm << nFmlaSize << sal_uInt16( 0 );
1600 if( pXclTokArr )
1601 pXclTokArr->WriteArray( rStrm );
1602}
1603
1605void lclWriteDvFormula( XclExpStream& rStrm, const XclExpString& rString )
1606{
1607 // fake a formula with a single tStr token
1608 rStrm << static_cast< sal_uInt16 >( rString.GetSize() + 1 )
1609 << sal_uInt16( 0 )
1610 << EXC_TOKID_STR
1611 << rString;
1612}
1613
1614const char* lcl_GetValidationType( sal_uInt32 nFlags )
1615{
1616 switch( nFlags & EXC_DV_MODE_MASK )
1617 {
1618 case EXC_DV_MODE_ANY: return "none";
1619 case EXC_DV_MODE_WHOLE: return "whole";
1620 case EXC_DV_MODE_DECIMAL: return "decimal";
1621 case EXC_DV_MODE_LIST: return "list";
1622 case EXC_DV_MODE_DATE: return "date";
1623 case EXC_DV_MODE_TIME: return "time";
1624 case EXC_DV_MODE_TEXTLEN: return "textLength";
1625 case EXC_DV_MODE_CUSTOM: return "custom";
1626 }
1627 return nullptr;
1628}
1629
1630const char* lcl_GetOperatorType( sal_uInt32 nFlags )
1631{
1632 switch( nFlags & EXC_DV_COND_MASK )
1633 {
1634 case EXC_DV_COND_BETWEEN: return "between";
1635 case EXC_DV_COND_NOTBETWEEN: return "notBetween";
1636 case EXC_DV_COND_EQUAL: return "equal";
1637 case EXC_DV_COND_NOTEQUAL: return "notEqual";
1638 case EXC_DV_COND_GREATER: return "greaterThan";
1639 case EXC_DV_COND_LESS: return "lessThan";
1640 case EXC_DV_COND_EQGREATER: return "greaterThanOrEqual";
1641 case EXC_DV_COND_EQLESS: return "lessThanOrEqual";
1642 }
1643 return nullptr;
1644}
1645
1646const char* lcl_GetErrorType( sal_uInt32 nFlags )
1647{
1648 switch (nFlags & EXC_DV_ERROR_MASK)
1649 {
1650 case EXC_DV_ERROR_STOP: return "stop";
1651 case EXC_DV_ERROR_WARNING: return "warning";
1652 case EXC_DV_ERROR_INFO: return "information";
1653 }
1654 return nullptr;
1655}
1656
1657void lcl_SetValidationText(const OUString& rText, XclExpString& rValidationText)
1658{
1659 if ( !rText.isEmpty() )
1660 {
1661 // maximum length allowed in Excel is 255 characters
1662 if ( rText.getLength() > 255 )
1663 {
1664 OUStringBuffer aBuf( rText );
1665 rValidationText.Assign(
1666 comphelper::string::truncateToLength(aBuf, 255).makeStringAndClear() );
1667 }
1668 else
1669 rValidationText.Assign( rText );
1670 }
1671 else
1672 rValidationText.Assign( '\0' );
1673}
1674
1675} // namespace
1676
1677XclExpDV::XclExpDV( const XclExpRoot& rRoot, sal_uInt32 nScHandle ) :
1679 XclExpRoot( rRoot ),
1680 mnFlags( 0 ),
1681 mnScHandle( nScHandle )
1682{
1683 if( const ScValidationData* pValData = GetDoc().GetValidationEntry( mnScHandle ) )
1684 {
1685 // prompt box - empty string represented by single NUL character
1686 OUString aTitle, aText;
1687 bool bShowPrompt = pValData->GetInput( aTitle, aText );
1688 lcl_SetValidationText(aTitle, maPromptTitle);
1689 lcl_SetValidationText(aText, maPromptText);
1690
1691 // error box - empty string represented by single NUL character
1692 ScValidErrorStyle eScErrorStyle;
1693 bool bShowError = pValData->GetErrMsg( aTitle, aText, eScErrorStyle );
1694 lcl_SetValidationText(aTitle, maErrorTitle);
1695 lcl_SetValidationText(aText, maErrorText);
1696
1697 // flags
1698 switch( pValData->GetDataMode() )
1699 {
1700 case SC_VALID_ANY: mnFlags |= EXC_DV_MODE_ANY; break;
1703 case SC_VALID_LIST: mnFlags |= EXC_DV_MODE_LIST; break;
1704 case SC_VALID_DATE: mnFlags |= EXC_DV_MODE_DATE; break;
1705 case SC_VALID_TIME: mnFlags |= EXC_DV_MODE_TIME; break;
1708 default: OSL_FAIL( "XclExpDV::XclExpDV - unknown mode" );
1709 }
1710
1711 switch( pValData->GetOperation() )
1712 {
1722 default: OSL_FAIL( "XclExpDV::XclExpDV - unknown condition" );
1723 }
1724 switch( eScErrorStyle )
1725 {
1729 case SC_VALERR_MACRO:
1730 // set INFO for validity with macro call, delete title
1732 maErrorTitle.Assign( '\0' ); // contains macro name
1733 break;
1734 default: OSL_FAIL( "XclExpDV::XclExpDV - unknown error style" );
1735 }
1736 ::set_flag( mnFlags, EXC_DV_IGNOREBLANK, pValData->IsIgnoreBlank() );
1737 ::set_flag( mnFlags, EXC_DV_SUPPRESSDROPDOWN, pValData->GetListType() == css::sheet::TableValidationVisibility::INVISIBLE );
1738 ::set_flag( mnFlags, EXC_DV_SHOWPROMPT, bShowPrompt );
1739 ::set_flag( mnFlags, EXC_DV_SHOWERROR, bShowError );
1740
1741 // formulas
1743
1744 // first formula
1745 std::unique_ptr< ScTokenArray > xScTokArr = pValData->CreateFlatCopiedTokenArray( 0 );
1746 if (xScTokArr)
1747 {
1748 if( pValData->GetDataMode() == SC_VALID_LIST )
1749 {
1750 OUString aString;
1751 if( XclTokenArrayHelper::GetStringList( aString, *xScTokArr, '\n' ) )
1752 {
1753 bool bList = false;
1754 OUStringBuffer sListBuf;
1755 OUStringBuffer sFormulaBuf("\"");
1756 /* Formula is a list of string tokens -> build the Excel string.
1757 Data validity is BIFF8 only (important for the XclExpString object).
1758 Excel uses the NUL character as string list separator. */
1760 if (!aString.isEmpty())
1761 {
1762 sal_Int32 nStringIx = 0;
1763 for(;;)
1764 {
1765 const std::u16string_view aToken( o3tl::getToken(aString, 0, '\n', nStringIx ) );
1766 if (aToken.find(',') != std::u16string_view::npos)
1767 {
1768 sListBuf.append(OUString::Concat("\"") + aToken + "\"");
1769 bList = true;
1770 }
1771 else
1772 sListBuf.append(aToken);
1773 mxString1->Append( aToken );
1774 sFormulaBuf.append( aToken );
1775 if (nStringIx<0)
1776 break;
1777 sal_Unicode cUnicodeChar = 0;
1778 mxString1->Append( std::u16string_view(&cUnicodeChar, 1) );
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" );
1848 }
1849}
1850
1852{
1853}
1854
1856{
1857 maScRanges.Join( rRange );
1858}
1859
1861{
1863 return (mnScHandle != SAL_MAX_UINT32) && !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_uInt32 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_uInt32 nCurrScHandle = ::std::numeric_limits< sal_uInt32 >::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:458
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:512
const OUString & GetStyleName() const
Definition: conditio.hxx:514
const OUString & GetStyle() const
Definition: conditio.hxx:473
ScAddress GetValidSrcPos() const
Return a position that's adjusted to allow textual representation of expressions if possible.
Definition: conditio.cxx:1347
ScConditionMode GetOperation() const
Definition: conditio.hxx:369
std::unique_ptr< ScTokenArray > CreateFlatCopiedTokenArray(sal_uInt16 nPos) const
Create a flat copy using ScTokenArray copy-ctor with shared tokens.
Definition: conditio.cxx:1302
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:1256
const ScRangeList & GetRange() const
Definition: conditio.hxx:559
const ScFormatEntry * GetEntry(sal_uInt16 nPos) const
Definition: conditio.cxx:1802
size_t size() const
Definition: conditio.cxx:1788
const ScDataBarFormatData * GetDataBarData() const
Definition: colorscale.cxx:784
SC_DLLPUBLIC bool GetTable(const OUString &rName, SCTAB &rTab) const
Definition: document.cxx:244
ScRangePairListRef & GetRowNameRangesRef()
Definition: document.hxx:822
ScRangePairListRef & GetColNameRangesRef()
Definition: document.hxx:821
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:705
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 fillColor(model::ComplexColor &rComplexColor, const SfxItemSet &rItemSet, ScAutoFontColorMode eAutoMode, const SfxItemSet *pCondSet=nullptr, const Color *pBackConfigColor=nullptr, const Color *pTextConfigColor=nullptr)
Definition: patattr.cxx:435
static void fillFontOnly(vcl::Font &rFont, const SfxItemSet &rItemSet, const OutputDevice *pOutDev=nullptr, const Fraction *pScale=nullptr, const SfxItemSet *pCondSet=nullptr, SvtScriptType nScript=SvtScriptType::NONE)
Static helper function to fill a font object from the passed item set.
Definition: patattr.cxx:266
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:271
Represents a CF record that contains one condition of a conditional format.
Definition: xecontent.cxx:598
bool mbColorUsed
true = Font weight used.
Definition: xecontent.cxx:621
bool mbPattUsed
true = Border attribute used.
Definition: xecontent.cxx:626
const ScCondFormatEntry & mrFormatEntry
Definition: xecontent.cxx:607
XclTokenArrayRef mxTokArr1
Pattern formatting attributes.
Definition: xecontent.cxx:612
void SaveXml(XclExpXmlStream &rStrm)
Definition: xecontent.cxx:1033
void WriteBody(XclExpStream &rStrm)
Writes the body of the CF record.
Definition: xecontent.cxx:731
bool mbUnderlUsed
true = Font color used.
Definition: xecontent.cxx:622
bool mbHeightUsed
true = Any font attribute used.
Definition: xecontent.cxx:619
bool mbFontUsed
Priority of this entry; needed for oox export.
Definition: xecontent.cxx:618
XclTokenArrayRef mxTokArr2
Formula for first condition.
Definition: xecontent.cxx:613
XclExpCellBorder maBorder
Font formatting attributes.
Definition: xecontent.cxx:610
bool mbFormula2
true = Pattern attribute used.
Definition: xecontent.cxx:627
bool mbBorderUsed
true = Font strikeout used.
Definition: xecontent.cxx:625
sal_uInt32 mnFontColorId
Formula for second condition.
Definition: xecontent.cxx:614
XclExpCFImpl(const XclExpRoot &rRoot, const ScCondFormatEntry &rFormatEntry, sal_Int32 nPriority, ScAddress aOrigin)
Definition: xecontent.cxx:630
sal_uInt8 mnType
Font color ID.
Definition: xecontent.cxx:615
bool mbStrikeUsed
true = Font posture used.
Definition: xecontent.cxx:624
sal_uInt8 mnOperator
Type of the condition (cell/formula).
Definition: xecontent.cxx:616
bool mbWeightUsed
true = Font height used.
Definition: xecontent.cxx:620
bool mbItalicUsed
true = Font underline type used.
Definition: xecontent.cxx:623
ScAddress maOrigin
Calc conditional format entry.
Definition: xecontent.cxx:608
XclExpCellArea maArea
Border formatting attributes.
Definition: xecontent.cxx:611
sal_Int32 mnPriority
Comparison operator for cell type.
Definition: xecontent.cxx:617
XclFontData maFontData
Top left cell of the combined range.
Definition: xecontent.cxx:609
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:1103
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1119
virtual void WriteBody(XclExpStream &rStrm) override
Writes the body of the CF record.
Definition: xecontent.cxx:1114
virtual ~XclExpCF() override
Definition: xecontent.cxx:1110
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1224
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:1186
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1257
const Color & mrColor
Definition: xecontent.hxx:217
XclExpColScaleCol(const XclExpRoot &rRoot, const Color &rColor)
Definition: xecontent.cxx:1247
virtual ~XclExpColScaleCol() override
Definition: xecontent.cxx:1253
XclExpColorScale(const XclExpRoot &rRoot, const ScColorScaleFormat &rFormat, sal_Int32 nPriority)
Definition: xecontent.cxx:1443
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1460
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:1566
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1586
virtual void Save(XclExpStream &rStrm) override
Writes all contained CONDFMT records with their CF records.
Definition: xecontent.cxx:1581
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:1392
XclExpCondfmt(const XclExpRoot &rRoot, const ScConditionalFormat &rCondFormat, const XclExtLstRef &xExtLst, sal_Int32 &rIndex)
Definition: xecontent.cxx:1299
XclRangeList maXclRanges
List of CF records.
Definition: xecontent.hxx:243
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1427
virtual void Save(XclExpStream &rStrm) override
Writes the CONDFMT record with following CF records, if there is valid data.
Definition: xecontent.cxx:1407
bool IsValidForXml() const
Definition: xecontent.cxx:1402
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:1388
virtual void WriteBody(XclExpStream &rStrm) override
Writes the body of the CONDFMT record.
Definition: xecontent.cxx:1416
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
XclExpDV(const XclExpRoot &rRoot, sal_uInt32 nScHandle)
Definition: xecontent.cxx:1677
OUString msFormula2
Formula for second condition.
Definition: xecontent.hxx:347
sal_uInt32 mnScHandle
Miscellaneous flags.
Definition: xecontent.hxx:349
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
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
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
XclExpDataBar(const XclExpRoot &rRoot, const ScDataBarFormat &rFormat, sal_Int32 nPriority, OString aGUID)
Definition: xecontent.cxx:1478
OString maGUID
Definition: xecontent.hxx:275
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:1495
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:1170
XclExpDateFormat(const XclExpRoot &rRoot, const ScCondDateFormatEntry &rFormatEntry, sal_Int32 nPriority)
Definition: xecontent.cxx:1124
virtual ~XclExpDateFormat() override
Definition: xecontent.cxx:1132
void InsertCellRange(const ScRange &rRange, sal_uInt32 nScHandle)
Inserts the cell range into the range list of the DV record with the specified handle.
Definition: xecontent.cxx:1940
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
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
XclExpDV & SearchOrCreateDv(sal_uInt32 nScHandle)
Searches for or creates a XclExpDV record object with the specified handle.
Definition: xecontent.cxx:1985
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:2656
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1546
XclExpIconSet(const XclExpRoot &rRoot, const ScIconSetFormat &rFormat, sal_Int32 nPriority)
Definition: xecontent.cxx:1530
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:551
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:568
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:580
virtual void Save(XclExpStream &rStrm) override
Writes the record, if it contains at least one merged cell range.
Definition: xecontent.cxx:291
void AppendRange(const ScRange &rRange, sal_uInt32 nBaseXFId)
Appends a new range to the list of merged cell ranges.
Definition: xecontent.cxx:268
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:311
ScfUInt32Vec maBaseXFIds
All merged cell ranges of the sheet.
Definition: xecontent.hxx:89
XclExpMergedcells(const XclExpRoot &rRoot)
Definition: xecontent.cxx:263
sal_uInt32 GetBaseXFId(const ScAddress &rPos) const
Returns the XF identifier of the top-left cell in a merged range.
Definition: xecontent.cxx:277
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:831
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:847
sal_uInt32 InsertColor(const Color &rColor, XclExpColorType eType, sal_uInt16 nAutoDefault=0)
Inserts the color into the list and updates weighting.
Definition: xestyle.cxx:768
sal_uInt16 GetColorIndex(sal_uInt32 nColorId) const
Returns the Excel palette index of the color with passed color ID.
Definition: xestyle.cxx:783
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:142
XclExpFormulaCompiler & GetFormulaCompiler() const
Returns the formula compiler to produce formula token arrays.
Definition: xeroot.cxx:88
XclExpDxfs & GetDxfs() const
Returns the differential formatting list.
Definition: xeroot.cxx:160
XclExpAddressConverter & GetAddressConverter() const
Returns the address converter.
Definition: xeroot.cxx:82
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:106
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:95
sal_uInt32 mnSize
Total count of strings (including doubles).
Definition: xecontent.cxx:113
std::vector< XclExpHashVec > maHashTab
List of unique strings (in SST ID order).
Definition: xecontent.cxx:111
sal_uInt32 mnTotal
Hashed table that manages string pointers.
Definition: xecontent.cxx:112
void SaveXml(XclExpXmlStream &rStrm)
Definition: xecontent.cxx:207
std::vector< XclExpStringRef > maStringVector
Definition: xecontent.cxx:109
sal_uInt32 Insert(XclExpStringRef xString)
Inserts the passed string, if not already inserted, and returns the unique SST index.
Definition: xecontent.cxx:125
void Save(XclExpStream &rStrm)
Writes the complete SST and EXTSST records.
Definition: xecontent.cxx:156
::std::vector< XclExpHashEntry > XclExpHashVec
Definition: xecontent.cxx:107
virtual ~XclExpSst() override
Definition: xecontent.cxx:242
virtual void Save(XclExpStream &rStrm) override
Writes the complete SST and EXTSST records.
Definition: xecontent.cxx:251
sal_uInt32 Insert(const XclExpStringRef &xString)
Inserts a new string into the table.
Definition: xecontent.cxx:246
XclExpSstImplPtr mxImpl
Definition: xecontent.hxx:67
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:256
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:265
std::size_t Write(const void *pData, std::size_t nBytes)
Writes nBytes bytes from memory.
Definition: xestream.cxx:224
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:249
std::size_t GetBufferSize() const
Returns the byte count the character buffer will take on export.
Definition: xestring.cxx:244
void WriteBuffer(XclExpStream &rStrm) const
Writes the raw character buffer.
Definition: xestring.cxx:305
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:712
static OUString ToOUString(const char *s)
Definition: xestream.cxx:788
Color const & getFinalColor() const
@ 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:485
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
@ Raw
COL_AUTO is returned.
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
#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:340
bool mbReverse
Specifies whether the icons should be shown in reverse order.
Definition: colorscale.hxx:345
Extends the XclCellArea struct for export.
Definition: xestyle.hxx:378
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:1959
void SetFinalColors(const XclExpPalette &rPalette)
Fills the mn***Color base members from the mn***ColorId members.
Definition: xestyle.cxx:1940
bool FillFromItemSet(const SfxItemSet &rItemSet, XclExpPalette &rPalette, bool bStyle)
Fills the area attributes from the passed item set.
Definition: xestyle.cxx:1918
Extends the XclCellBorder struct for export.
Definition: xestyle.hxx:341
void SetFinalColors(const XclExpPalette &rPalette)
Fills the mn***Color base members from the mn***ColorId members.
Definition: xestyle.cxx:1777
bool FillFromItemSet(const SfxItemSet &rItemSet, XclExpPalette &rPalette, XclBiff eBiff, bool bStyle=false)
Fills the border attributes from the passed item set.
Definition: xestyle.cxx:1715
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:1814
const ScFormatEntry * pEntry
Definition: xeextlst.hxx:31
This struct helps reading and writing Excel fonts.
Definition: xlstyle.hxx:285
void FillFromVclFont(const vcl::Font &rFont, model::ComplexColor const &rComplexColor)
Fills all members (except color and escapement) from the passed font.
Definition: xlstyle.cxx:202
sal_uInt16 mnHeight
String with styles (bold, italic).
Definition: xlstyle.hxx:288
sal_uInt16 mnWeight
Font height in twips (1/20 of a point).
Definition: xlstyle.hxx:289
bool mbItalic
Underline style.
Definition: xlstyle.hxx:294
sal_uInt8 mnUnderline
Windows character set.
Definition: xlstyle.hxx:293
bool mbStrikeout
true = Italic.
Definition: xlstyle.hxx:295
model::ComplexColor maComplexColor
true = Shadowed.
Definition: xlstyle.hxx:299
unsigned char sal_uInt8
sal_uInt16 sal_Unicode
#define SAL_MAX_UINT32
sal_Int16 SCTAB
Definition: types.hxx:22
OUString sId
constexpr OUStringLiteral SC_UNONAME_FILTER
Definition: unonames.hxx:375
constexpr OUStringLiteral SC_UNONAME_REFDELAY
Definition: unonames.hxx:379
constexpr OUStringLiteral SC_UNONAME_LINKURL
Definition: unonames.hxx:377
constexpr OUStringLiteral SC_UNO_AREALINKS
Definition: unonames.hxx:39
INetProtocol
constexpr OUStringLiteral INET_FILE_SCHEME
@ SC_VALID_TEXTLEN
Definition: validat.hxx:47
@ SC_VALID_TIME
Definition: validat.hxx:46
@ SC_VALID_CUSTOM
Definition: validat.hxx:49
@ SC_VALID_ANY
Definition: validat.hxx:42
@ SC_VALID_DECIMAL
Definition: validat.hxx:44
@ SC_VALID_WHOLE
Definition: validat.hxx:43
@ SC_VALID_DATE
Definition: validat.hxx:45
@ SC_VALID_LIST
Definition: validat.hxx:48
ScValidErrorStyle
Definition: validat.hxx:53
@ SC_VALERR_MACRO
Definition: validat.hxx:57
@ SC_VALERR_STOP
Definition: validat.hxx:54
@ SC_VALERR_WARNING
Definition: validat.hxx:55
@ SC_VALERR_INFO
Definition: validat.hxx:56
std::unique_ptr< char[]> aBuffer
const sal_uInt32 EXC_SST_HASHTABLE_SIZE
Definition: xecontent.cxx:116
@ 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:49
@ 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:126
const sal_uInt32 EXC_XFID_NOTFOUND
Special index for "not found" state.
Definition: xlstyle.hxx:143