25 #include <rtl/ustring.hxx>
26 #include <rtl/ustrbuf.hxx>
27 #include <rtl/random.h>
34 #include <officecfg/Office/Calc.hxx>
44 #include <compiler.hxx>
46 #include <tokenarray.hxx>
49 #include <globstr.hrc>
58 #include <oox/token/tokens.hxx>
65 #include <com/sun/star/task/XStatusIndicator.hpp>
71 #define DEBUG_XL_ENCRYPTION 0
73 using ::com::sun::star::uno::XInterface;
83 using namespace ::
oox;
88 mbUseEncrypter( false ),
89 mnMaxRecSize( nMaxRecSize ),
111 OSL_ENSURE( !
mbInRec,
"XclExpStream::StartRecord - another record still open" );
123 OSL_ENSURE(
mbInRec,
"XclExpStream::EndRecord - no record open" );
218 std::size_t nRet = 0;
219 if( pData && (nBytes > 0) )
224 std::size_t nBytesLeft = nBytes;
227 while( bValid && (nBytesLeft > 0) )
229 std::size_t nWriteLen = ::std::min< std::size_t >(
PrepareWrite(), nBytesLeft );
230 std::size_t nWriteRet = nWriteLen;
233 OSL_ENSURE(nWriteLen > 0,
"XclExpStream::Write: write length is 0!");
234 vector<sal_uInt8> aBytes(nWriteLen);
235 memcpy(aBytes.data(), pBuffer, nWriteLen);
242 bValid = (nWriteLen == nWriteRet);
243 OSL_ENSURE( bValid,
"XclExpStream::Write - stream write error" );
245 pBuffer += nWriteRet;
247 nBytesLeft -= nWriteRet;
261 std::size_t nBytesLeft = nBytes;
262 while( nBytesLeft > 0 )
264 std::size_t nWriteLen = ::std::min< std::size_t >(
PrepareWrite(), nBytesLeft );
266 nBytesLeft -= nWriteLen;
280 for (std::size_t
i = 0;
i < nBytes; ++
i)
287 sal_uInt64 nBytesLeft = ::std::min(nBytes, nRemaining);
288 if( nBytesLeft <= 0 )
291 const std::size_t nMaxBuffer = 4096;
292 std::unique_ptr<sal_uInt8[]> pBuffer(
293 new sal_uInt8[ ::std::min<std::size_t>(nBytesLeft, nMaxBuffer) ]);
296 while( bValid && (nBytesLeft > 0) )
298 std::size_t nWriteLen = ::std::min<std::size_t>(nBytesLeft, nMaxBuffer);
299 rInStrm.
ReadBytes(pBuffer.get(), nWriteLen);
300 std::size_t nWriteRet =
Write( pBuffer.get(), nWriteLen );
301 bValid = (nWriteLen == nWriteRet);
302 nBytesLeft -= nWriteRet;
310 sal_uInt16 nCharLen = nFlags ? 2 : 1;
312 for(
const auto& rItem : rBuffer )
322 operator<<( static_cast< sal_uInt8 >( rItem ) );
332 std::size_t nLen = ::std::min< std::size_t >( rString.getLength(), 0x00FF );
333 nLen = ::std::min< std::size_t >( nLen, 0xFF );
339 operator<<( static_cast< sal_uInt8 >( nLen ) );
340 Write( rString.getStr(), nLen );
346 Write( rBuffer.data(), rBuffer.size() );
371 OSL_ENSURE( !
mbInRec,
"XclExpStream::SetSvStreamPos - not allowed inside of a record" );
447 const sal_uInt32 nData = 0;
448 std::size_t nBytesLeft = nBytes;
449 while( nBytesLeft >=
sizeof( nData ) )
452 nBytesLeft -=
sizeof( nData );
463 if( !aEncryptionData.hasElements() )
466 Init( aEncryptionData );
493 vector<sal_uInt8> aByte(1);
500 ::std::vector<sal_uInt8> pnBytes(2);
501 pnBytes[0] = nData & 0xFF;
502 pnBytes[1] = (nData >> 8) & 0xFF;
508 ::std::vector<sal_uInt8> pnBytes(4);
509 pnBytes[0] = nData & 0xFF;
510 pnBytes[1] = (nData >> 8) & 0xFF;
511 pnBytes[2] = (nData >> 16) & 0xFF;
512 pnBytes[3] = (nData >> 24) & 0xFF;
518 ::std::vector<sal_uInt8> pnBytes(4);
519 memcpy(pnBytes.data(), &fValue, 4);
525 ::std::vector<sal_uInt8> pnBytes(8);
526 memcpy(pnBytes.data(), &fValue, 8);
532 Encrypt(rStrm, static_cast<sal_uInt8>(nData));
537 Encrypt(rStrm, static_cast<sal_uInt16>(nData));
542 Encrypt(rStrm, static_cast<sal_uInt32>(nData));
556 rtl_random_getBytes( aRandomPool,
mpnSalt, 16 );
557 rtl_random_destroyPool( aRandomPool );
582 sal_uInt64 nStrmPos = rStrm.
Tell();
586 #if DEBUG_XL_ENCRYPTION
587 fprintf(stdout,
"XclExpBiff8Encrypter::EncryptBytes: stream pos = %ld offset in block = %d block pos = %ld\n",
588 nStrmPos, nBlockOffset, nBlockPos);
591 sal_uInt16 nSize =
static_cast< sal_uInt16
>( aBytes.size() );
595 #if DEBUG_XL_ENCRYPTION
596 fprintf(stdout,
"RAW: ");
597 for (sal_uInt16
i = 0;
i < nSize; ++
i)
598 fprintf(stdout,
"%2.2X ", aBytes[
i]);
599 fprintf(stdout,
"\n");
607 if ( (nBlockPos != nOldBlockPos) || (nBlockOffset < nOldOffset) )
613 if (nBlockOffset > nOldOffset)
617 sal_uInt16 nBytesLeft = nSize;
619 while (nBytesLeft > 0)
622 sal_uInt16 nEncBytes = ::std::min(nBlockLeft, nBytesLeft);
624 bool bRet =
maCodec.
Encode(&aBytes[nPos], nEncBytes, &aBytes[nPos], nEncBytes);
625 OSL_ENSURE(bRet,
"XclExpBiff8Encrypter::EncryptBytes: encryption failed!!");
627 std::size_t nRet = rStrm.
WriteBytes(&aBytes[nPos], nEncBytes);
628 OSL_ENSURE(nRet == nEncBytes,
"XclExpBiff8Encrypter::EncryptBytes: fail to write to stream!!");
630 nStrmPos = rStrm.
Tell();
633 if (nBlockOffset == 0)
636 nBytesLeft -= nEncBytes;
645 switch( nXclErrCode )
654 default:
return "#N/A";
670 rsValue = OUString::number(aResValue.
mfValue);
679 rsType =
"inlineStr";
688 sBuf.appendAscii( sStreamDir );
689 sBuf.appendAscii( sStream );
692 if( strstr(sStream,
"vml") )
693 sBuf.append(
".vml" );
695 sBuf.append(
".xml" );
696 return sBuf.makeStringAndClear();
718 const sal_uInt16* pBuffer = rBuffer.data();
720 reinterpret_cast<sal_Unicode const *>(pBuffer), rBuffer.size(),
721 RTL_TEXTENCODING_UTF8);
728 bFullAddressNotation ) );
729 return sRange.toUtf8();
748 aAddress.
SetCol( static_cast<sal_Int16>(std::min<sal_Int32>( rAddress.
mnCol,
MAXCOL )) );
760 OSL_ENSURE( !s.
IsRich(),
"XclXmlUtils::ToOString(XclExpString): rich text string found!" );
777 for(
const auto& rRange : rRanges )
786 return OUString( s, static_cast<sal_Int32>(strlen( s )), RTL_TEXTENCODING_ASCII_US );
791 if( nLength == -1 || ( nLength > (static_cast<sal_Int32>(rBuf.size()) - nStart) ) )
792 nLength = (rBuf.size() - nStart);
796 reinterpret_cast<sal_Unicode const *>(&rBuf[nStart]), nLength)
804 ScCompiler aCompiler( rCtx, rAddress, const_cast<ScTokenArray&>(*pTokenArray));
807 aCompiler.
SetGrammar(FormulaGrammar::GRAM_OOXML);
809 sal_Int32 nLen = pTokenArray->
GetLen();
810 OUStringBuffer
aBuffer( nLen ? (nLen * 5) : 8 );
815 if (nErrCode != FormulaError::NONE)
821 assert(!
"No code and no error.");
825 return aBuffer.makeStringAndClear();
830 OSL_ENSURE( !s.
IsRich(),
"XclXmlUtils::ToOString(XclExpString): rich text string found!" );
838 rStream->singleElement(nElement, XML_val, pValue);
843 bHaveUnderline =
true;
851 default: bHaveUnderline =
false;
return "none";
857 bHaveAlignment =
true;
858 switch( eEscapement )
860 case SvxEscapement::Superscript:
return "superscript";
861 case SvxEscapement::Subscript:
return "subscript";
862 case SvxEscapement::Off:
863 default: bHaveAlignment =
false;
return "baseline";
869 bool bHaveUnderline, bHaveVertAlign;
880 lcl_WriteValue( pStream, XML_u, bHaveUnderline ? pUnderline :
nullptr );
881 lcl_WriteValue( pStream, XML_vertAlign, bHaveVertAlign ? pVertAlign :
nullptr );
883 if( rFontData.
maColor !=
Color( 0xFF, 0xFF, 0xFF, 0xFF ) )
884 pStream->singleElement( XML_color,
899 : XmlFilterBase( rCC ),
901 mbExportVBA(bExportVBA),
902 mbExportTemplate(bExportTemplate)
913 OSL_ENSURE( !
maStreams.empty(),
"XclExpXmlStream::GetCurrentStream - no current stream" );
924 OSL_ENSURE( !
maStreams.empty(),
"XclExpXmlStream::PopStream - stack is empty!" );
937 GetCurrentStream()->write(
" ")->writeId(nAttr)->write(
"=\"")->writeEscaped(sVal)->write(
"\"");
941 const OUString& sFullStream,
942 const OUString& sRelativeStream,
943 const uno::Reference< XOutputStream >& xParentRelation,
944 const char* sContentType,
945 std::u16string_view sRelationshipType,
946 OUString* pRelationshipId )
948 OUString sRelationshipId;
949 if (xParentRelation.is())
950 sRelationshipId =
addRelation( xParentRelation, OUString(sRelationshipType), sRelativeStream );
952 sRelationshipId =
addRelation( OUString(sRelationshipType), sRelativeStream );
954 if( pRelationshipId )
955 *pRelationshipId = sRelationshipId;
1008 const bool bValidateTabNames = officecfg::Office::Calc::Filter::Export::MS_Excel::TruncateLongSheetNames::get();
1009 std::vector<OUString> aOriginalTabNames;
1010 if (bValidateTabNames)
1017 if (xStatusIndicator.is())
1018 xStatusIndicator->start(
ScResId(STR_SAVE_DOC), 100);
1024 drawingml::DrawingML::ResetMlCounters();
1032 aData.maMaxPos.SetCol( ::std::min(
aData.maScMaxPos.Col(),
aData.maXclMaxPos.Col() ) );
1033 aData.maMaxPos.SetRow( ::std::min(
aData.maScMaxPos.Row(),
aData.maXclMaxPos.Row() ) );
1034 aData.maMaxPos.SetTab( ::std::min(
aData.maScMaxPos.Tab(),
aData.maXclMaxPos.Tab() ) );
1035 aData.mpCompileFormulaCxt = std::make_shared<sc::CompileFormulaContext>(rDoc);
1038 aData.maBasePath = OUString(
"file:///" + aPath.GetPath() +
"\\").replace(
'\\',
'/')
1040 .replaceFirst(
"file:////",
"file:///");
1051 OUString
const workbook =
"xl/workbook.xml";
1052 const char* pWorkbookContentType =
nullptr;
1057 pWorkbookContentType =
"application/vnd.ms-excel.template.macroEnabled.main+xml";
1061 pWorkbookContentType =
"application/vnd.ms-excel.sheet.macroEnabled.main+xml";
1068 pWorkbookContentType =
"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml";
1072 pWorkbookContentType =
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml";
1077 uno::Reference <XOutputStream>(),
1078 pWorkbookContentType,
1090 css::uno::Reference<css::io::XInputStream> xVBAStream(
1092 css::uno::Reference<css::io::XOutputStream> xVBAOutput =
1103 if (xStatusIndicator.is())
1104 xStatusIndicator->setValue(10);
1106 if (xStatusIndicator.is())
1107 xStatusIndicator->setValue(40);
1109 rDoc.GetExternalRefManager()->disableSkipUnusedFileIds();
1118 if (bValidateTabNames)
1123 if (xStatusIndicator.is())
1124 xStatusIndicator->end();
1141 const int MAX_TAB_NAME_LENGTH = 31;
1150 rDoc.
GetName(nTab, aOriginalTabNames[nTab]);
1154 std::vector<OUString> aNewTabNames;
1160 const OUString& rOriginalName = aOriginalTabNames[nTab];
1161 if (rOriginalName.getLength() > MAX_TAB_NAME_LENGTH)
1166 if (aNewName.isEmpty())
1168 aNewName = rOriginalName.copy(0, MAX_TAB_NAME_LENGTH);
1169 if (aNewTabNames.end() != std::find(aNewTabNames.begin(), aNewTabNames.end(), aNewName) ||
1170 aOriginalTabNames.end() != std::find(aOriginalTabNames.begin(), aOriginalTabNames.end(), aNewName))
1178 for (
int digits=1; digits<10 && aNewName.isEmpty(); digits++)
1180 const int rangeStart = pow(10, digits - 1);
1181 const int rangeEnd = pow(10, digits);
1183 for (
int i=rangeStart;
i<rangeEnd && aNewName.isEmpty();
i++)
1185 aNewName = OUString::Concat(rOriginalName.subView(0, MAX_TAB_NAME_LENGTH - 1 - digits)) +
"-" + OUString::number(
i);
1186 if (aNewTabNames.end() != std::find(aNewTabNames.begin(), aNewTabNames.end(), aNewName) ||
1187 aOriginalTabNames.end() != std::find(aOriginalTabNames.begin(), aOriginalTabNames.end(), aNewName))
1195 if (!aNewName.isEmpty())
1199 aNewTabNames.push_back(aNewName);
1204 aNewTabNames.push_back(rOriginalName);
1210 aNewTabNames.push_back(rOriginalName);
1222 const OUString& rOriginalName = aOriginalTabNames[nTab];
1224 OUString rModifiedName;
1225 rDoc.
GetName(nTab, rModifiedName);
1227 if (rOriginalName != rModifiedName)
virtual const oox::drawingml::Theme * getCurrentTheme() const override
This class stores an unformatted or formatted string for Excel export.
const sal_uInt8 EXC_ERR_NULL
DDE application-topic delimiter.
void GetSaltDigest(sal_uInt8 pnSaltDigest[16]) const
void EnableIdle(bool bDo)
virtual oox::vml::Drawing * getVmlDrawing() override
bool InitCodec(const css::uno::Sequence< css::beans::NamedValue > &aData)
void StartContinue()
Writes CONTINUE header, internal setup.
SC_DLLPUBLIC void Format(OStringBuffer &r, ScRefFlags nFlags, const ScDocument *pDocument=nullptr, const Details &rDetails=detailsOOOa1) const
std::size_t Write(const void *pData, std::size_t nBytes)
Writes nBytes bytes from memory.
static void GetFormulaTypeAndValue(ScFormulaCell &rCell, const char *&sType, OUString &rValue)
static OString ToOString(const Color &rColor)
void SetGrammar(const formula::FormulaGrammar::Grammar eGrammar)
OUString getString() const
sal_uInt8 mnCharSet
Windows font family.
Stores global buffers and data needed for Excel export filter.
virtual bool InitCipher(sal_uInt32 nCounter) override
sal_uInt8 GetAlpha() const
const sal_uInt8 EXC_ERR_NA
sal_uInt16 mnCurrSize
Record size written in last record header.
bool mbShadow
true = Outlined.
void SetEncrypter(XclExpEncrypterRef const &xEncrypter)
SvStream & WriteUInt16(sal_uInt16 nUInt16)
This class is used to export Excel record streams.
std::unique_ptr< ScRefreshTimerControl > const & GetRefreshTimerControlAddress() const
SvStream & WriteInt32(sal_Int32 nInt32)
static void CopyInputToOutput(const css::uno::Reference< css::io::XInputStream > &xInput, const css::uno::Reference< css::io::XOutputStream > &xOutput)
sal_uInt16 mnMaxContSize
Maximum size of record content.
static OUString ToOUString(const char *s)
void Format(OUString &, ScRefFlags nFlags, const ScDocument &, formula::FormulaGrammar::AddressConvention eConv=formula::FormulaGrammar::CONV_OOO, sal_Unicode cDelimiter=0, bool bFullAddressNotation=false) const
virtual OUString SAL_CALL getImplementationName() override
std::shared_ptr< TableStyleList > TableStyleListPtr
sal_uInt16 mnCurrMaxSize
Maximum size of CONTINUE content.
static const AllSettings & GetSettings()
virtual bool exportDocument() override
bool mbInRec
Stream position of size field in current header.
This struct helps reading and writing Excel fonts.
SvxEscapement GetScEscapement() const
Returns the Calc escapement style.
bool HasValidEncrypter() const
#define STREAM_SEEK_TO_END
sal_uInt16 mnHeight
Font color.
sal_uInt64 Seek(sal_uInt64 nPos)
std::shared_ptr< XclExpBiff8Encrypter > XclExpEncrypterRef
const sal_uInt16 EXC_ENCR_BLOCKSIZE
rtl_TextEncoding getBestTextEncodingFromLocale(const css::lang::Locale &rLocale)
css::uno::Reference< css::io::XOutputStream > openFragmentStream(const OUString &rStreamName, const OUString &rMediaType)
const sal_uInt16 EXC_MAXRECSIZE_BIFF8
void EncryptBytes(SvStream &rStrm,::std::vector< sal_uInt8 > &aBytes)
::msfilter::MSCodec_Std97 maCodec
sal_uInt16 mnMaxSliceSize
Current maximum, either mnMaxRecSize or mnMaxContSize.
XclExpXmlStream(const css::uno::Reference< css::uno::XComponentContext > &rCC, bool bExportVBA, bool bExportTemplate)
sal_uInt16 mnSliceSize
Count of bytes already written in current record.
virtual ~XclExpXmlStream() override
RootData & GetOldRoot() const
Returns old RootData struct.
void Encrypt(SvStream &rStrm, sal_uInt8 nData)
SfxApplication * SfxGetpApp()
const SCCOL EXC_MAXCOL_XML_2007
sax_fastparser::FSHelperPtr GetStreamForPath(const OUString &rPath)
const XclExpRoot * mpRoot
Access to global data from other classes.
static css::uno::Sequence< css::beans::NamedValue > GenerateDefaultEncryptionData()
SC_DLLPUBLIC bool RenameTab(SCTAB nTab, const OUString &rName, bool bExternalDocument=false)
virtual bool importDocument() override
void WriteExtOptions(ScExtDocOptions &rOpt) const
const SCROW EXC_MAXROW_XML_2007
const sal_uInt8 EXC_ERR_NUM
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
SC_DLLPUBLIC SCTAB GetTableCount() const
const sal_uInt16 EXC_ID_CONT
SvStream & WriteSChar(signed char nChar)
bool mbOutline
true = Struck out.
void PushStream(sax_fastparser::FSHelperPtr const &aStream)
static sax_fastparser::FSHelperPtr WriteFontData(sax_fastparser::FSHelperPtr pStream, const XclFontData &rFontData, sal_Int32 nNameId)
void push_back(const ScRange &rRange)
bool IsAutoCalcShellDisabled() const
void WriteAttribute(sal_Int32 nAttr, std::u16string_view sVal)
SvStream & WriteUInt32(sal_uInt32 nUInt32)
void validateTabNames(std::vector< OUString > &aOriginalTabNames)
ScDocShell * getDocShell()
const XclExpRoot & mrRoot
Reference to the system output stream.
sal_uInt16 mnHeaderSize
Maximum size of data slices (parts that cannot be split).
sal_uInt64 remainingSize()
bool mbItalic
Underline style.
sax_fastparser::FSHelperPtr & GetCurrentStream()
static ScRange lcl_ToRange(const XclRange &rRange)
OUString getRelationship(Relationship eRelationship)
sal_uInt8 GetBlue() const
void UpdateRecSize()
Rewrites correct record length, if different from calculated.
bool getOutputStream(ProgramOptions const &options, OString const &extension, std::ostream **ppOutputStream, OString &targetSourceFileName, OString &tmpSourceFileName)
const sal_uInt8 EXC_ERR_REF
void SetSliceSize(sal_uInt16 nSize)
Sets data slice length.
static const char * lcl_GetErrorString(FormulaError nScErrCode)
constexpr OUStringLiteral aData
void Init(const css::uno::Sequence< css::beans::NamedValue > &aEncryptionData)
XclExpEncrypterRef mxEncrypter
void CreateSaltDigest(const sal_uInt8 nSaltData[16], sal_uInt8 nSaltDigest[16])
static sal_uInt32 GetBlockPos(std::size_t nStrmPos)
::sax_fastparser::FSHelperPtr openFragmentStreamWithSerializer(const OUString &rStreamName, const OUString &rMediaType)
MS Excel 5.0, MS Excel 7.0 (95)
void restoreTabNames(const std::vector< OUString > &aOriginalTabNames)
std::size_t mnPredictSize
Count of bytes already written in current slice.
XclExpXmlPathToStateMap maOpenedStreamMap
const sal_uInt8 EXC_ERR_VALUE
ScExtDocOptions & GetExtDocOptions() const
Returns the extended document options.
SfxObjectShell * GetEmbeddedObject() const
virtual oox::drawingml::chart::ChartConverter * getChartConverter() override
SC_DLLPUBLIC OUString Format(const ScDocument &rDocument, ScRefFlags nFlags=ScRefFlags::ZERO, const ScAddress::Details &rDetails=ScAddress::detailsOOOa1, bool bFullAddressNotation=false) const
Returns string with formatted cell range from aStart to aEnd, according to provided address conventio...
sal_uInt8 mpnSaltDigest[16]
bool Encode(const void *pData, std::size_t nDatLen, sal_uInt8 *pBuffer, std::size_t nBufLen)
A 2D cell range address list with Excel column and row indexes.
std::size_t WriteBytes(const void *pData, std::size_t nSize)
OUString ScResId(const char *pId)
void EndRecord()
Checks and corrects real record length.
const css::uno::Reference< css::uno::XComponentContext > & getComponentContext() const
const SCTAB EXC_MAXTAB_XML_2007
sal_uInt8 mpnDocId[16]
Crypto algorithm implementation.
virtual ::oox::ole::VbaProject * implCreateVbaProject() const override
const ScfUInt16Vec & GetUnicodeBuffer() const
void GetDocId(sal_uInt8 pnDocId[16]) const
const sal_uInt8 EXC_STRF_16BIT
A 2D cell address struct with Excel column and row indexes.
XclExpStream & operator<<(sal_Int8 nValue)
void CopyFromStream(SvStream &rInStrm, sal_uInt64 nBytes=STREAM_SEEK_TO_END)
Copies nBytes bytes from current position of the stream rInStrm.
static ScViewData * GetViewData()
std::shared_ptr< FastSerializerHelper > FSHelperPtr
static sal_uInt16 GetOffsetInBlock(std::size_t nStrmPos)
void WriteByteString(const OString &rString)
Writes string length field and OString buffer.
const css::uno::Reference< css::frame::XModel > & getModel() const
static void lcl_WriteValue(const sax_fastparser::FSHelperPtr &rStream, sal_Int32 nElement, const char *pValue)
void SetSvStreamPos(sal_uInt64 nPos)
Sets position of system stream (only allowed outside of records).
std::size_t ReadBytes(void *pData, std::size_t nSize)
static OUString GetStreamName(const char *sStreamDir, const char *sStream, sal_Int32 nId)
std::stack< sax_fastparser::FSHelperPtr > maStreams
const LanguageTag & getLocale()
sal_uInt8 GetGreen() const
const OUString & getFileUrl() const
OUString addRelation(const OUString &rType, const OUString &rTarget)
static const char * lcl_GetUnderlineStyle(FontLineStyle eUnderline, bool &bHaveUnderline)
std::unique_ptr< char[]> aBuffer
FontLineStyle GetScUnderline() const
Returns the Calc font underline style.
void WriteZeroBytesToRecord(std::size_t nBytes)
void GetSalt(sal_uInt8 pnSalt[16]) const
void InitRecord(sal_uInt16 nRecId)
Writes header data, internal setup.
XclExpStream(SvStream &rOutStrm, const XclExpRoot &rRoot, sal_uInt16 nMaxRecSize=0)
Constructs the Excel record export stream.
static ScAddress lcl_ToAddress(const XclAddress &rAddress)
bool IsRich() const
Returns true, if the string contains formatting information.
const sal_uInt8 EXC_ERR_NAME
bool VerifyKey(const sal_uInt8 *pSaltData, const sal_uInt8 *pSaltDigest)
sal_uInt8 mnFamily
Escapement type.
SvStream & WriteFloat(float nFloat)
virtual oox::drawingml::table::TableStyleListPtr getTableStyles() override
const css::uno::Reference< css::task::XStatusIndicator > & getStatusIndicator() const
std::size_t mnLastSizePos
Predicted size received from calling function.
SvStream & WriteUChar(unsigned char nChar)
void WriteRawZeroBytes(std::size_t nBytes)
Writes a raw sequence of zero bytes.
sax_fastparser::FSHelperPtr CreateOutputStream(const OUString &sFullStream, const OUString &sRelativeStream, const css::uno::Reference< css::io::XOutputStream > &xParentRelation, const char *sContentType, std::u16string_view sRelationshipType, OUString *pRelationshipId=nullptr)
sal_uInt16 mnWeight
Font height in twips (1/20 of a point).
void UpdateSizeVars(std::size_t nSize)
Recalculates mnCurrSize and mnSliceSize.
SvStream & WriteInt16(sal_Int16 nInt16)
const sal_uInt8 EXC_ERR_DIV0
const sal_uInt16 EXC_MAXRECSIZE_BIFF5
css::uno::Sequence< css::beans::NamedValue > GetEncryptionData() const
void SetAutoCalcShellDisabled(bool bNew)
const ScDocument & GetDocument() const
void WriteCharBuffer(const ScfUInt8Vec &rBuffer)
Writes 8-bit character buffer.
XclBiff GetBiff() const
Returns the current BIFF version of the importer/exporter.
bool mbValid
Last known stream position.
void renameTab(SCTAB aTab, OUString aNewName)
void commitStorage() const
void StartRecord(sal_uInt16 nRecId, std::size_t nRecSize)
Starts a new record: writes header data, stores calculated record size.
void WriteXml(XclExpXmlStream &)
void exportVBA(SotStorage *pRootStorage)
Reference< XModel > xModel
Color maColor
String with styles (bold, italic).
void EnableEncryption(bool bEnable=true)
SvStream & WriteDouble(const double &rDouble)
bool Skip(std::size_t nDatLen)
static const char * lcl_ToVerticalAlignmentRun(SvxEscapement eEscapement, bool &bHaveAlignment)
void GetDocId(sal_uInt8 pDocId[16])
bool containsVBAProject()
void WriteUnicodeBuffer(const ScfUInt16Vec &rBuffer, sal_uInt8 nFlags)
Writes Unicode buffer as 8/16 bit, repeats nFlags at start of a CONTINUE record.
bool mbStrikeout
true = Italic.
XclExpBiff8Encrypter(const XclExpRoot &rRoot)
bool IsIdleEnabled() const
SC_DLLPUBLIC bool GetName(SCTAB nTab, OUString &rName) const
A 2D cell range address struct with Excel column and row indexes.
bool mbUseEncrypter
Filter root data.
void WriteZeroBytes(std::size_t nBytes)
Writes a sequence of nBytes zero bytes (respects slice setting).
sal_uInt16 PrepareWrite()
Creates CONTINUE record at end of record.
SfxMedium * GetMedium() const