21 #include <document.hxx>
23 #include <globstr.hrc>
26 #include <progress.hxx>
27 #include <rtl/tencinfo.h>
30 #include <rtl/strbuf.hxx>
31 #include <osl/diagnose.h>
36 const ScAddress& rOutPos,
const rtl_TextEncoding eNach )
44 aStart.PutInOrder( aEnd );
50 const ScRange&rRange,
const rtl_TextEncoding eCharSet )
52 OSL_ENSURE( rRange.
aStart <= rRange.
aEnd,
"*ScExportDif(): Range not sorted!" );
54 "ScExportDif(): only one table please!" );
57 if ( eStreamCharSet != eCharSet )
61 OString aStrDelimEncoded;
62 OUString aStrDelimDecoded;
63 bool bContextOrNotAsciiEncoding;
64 if ( eCharSet == RTL_TEXTENCODING_UNICODE )
67 bContextOrNotAsciiEncoding =
false;
71 aStrDelimEncoded = OString(&cStrDelim, 1, eCharSet);
72 rtl_TextEncodingInfo aInfo;
73 aInfo.StructSize =
sizeof(aInfo);
74 if ( rtl_getTextEncodingInfo( eCharSet, &aInfo ) )
76 bContextOrNotAsciiEncoding =
77 (((aInfo.Flags & RTL_TEXTENCODING_INFO_CONTEXT) != 0) ||
78 ((aInfo.Flags & RTL_TEXTENCODING_INFO_ASCII) == 0));
79 if ( bContextOrNotAsciiEncoding )
80 aStrDelimDecoded = OStringToOUString(aStrDelimEncoded, eCharSet);
83 bContextOrNotAsciiEncoding =
false;
86 const char p2DoubleQuotes_LF[] =
"\"\"\n";
87 const char pSpecDataType_LF[] =
"-1,0\n";
88 const char pEmptyData[] =
"1,0\n\"\"\n";
89 const char pStringData[] =
"1,0\n";
90 const char pNumData[] =
"0,";
91 const char pNumDataERROR[] =
"0,0\nERROR\n";
106 OSL_ENSURE( pDoc->
HasTable( nTab ),
"*ScExportDif(): Table not existent!" );
109 aOS.append(
"\n0,1\n\"");
111 pDoc->
GetName( nTab, aString );
119 aOS.append(static_cast<sal_Int32>(nNumCols));
121 aOS.append(p2DoubleQuotes_LF);
127 aOS.append(static_cast<sal_Int32>(nNumRows));
129 aOS.append(p2DoubleQuotes_LF);
134 aOS.append(
"\n0,0\n");
135 aOS.append(p2DoubleQuotes_LF);
141 for( nRowCnt = rRange.
aStart.
Row() ; nRowCnt <= nEndRow ; nRowCnt++ )
143 assert( aOS.isEmpty() &&
"aOS should be empty");
144 aOS.append(pSpecDataType_LF);
148 for( nColCnt = rRange.
aStart.
Col() ; nColCnt <= nEndCol ; nColCnt++ )
150 assert( aOS.isEmpty() &&
"aOS should be empty");
151 bool bWriteStringData =
false;
157 aOS.append(pEmptyData);
160 aOS.append(pNumData);
168 bWriteStringData =
true;
172 aOS.append(pNumDataERROR);
175 aOS.append(pNumData);
183 bWriteStringData =
true;
190 if ( !bWriteStringData )
198 assert( aOS.isEmpty() &&
"aOS should be empty");
199 OUString aTmpStr = aString;
200 aOS.append(pStringData);
202 if ( eCharSet == RTL_TEXTENCODING_UNICODE )
204 sal_Int32
nPos = aTmpStr.indexOf( cStrDelim );
207 aTmpStr = aTmpStr.replaceAt( nPos, 0, rtl::OUStringChar(cStrDelim) );
208 nPos = aTmpStr.indexOf( cStrDelim, nPos+2 );
214 else if ( bContextOrNotAsciiEncoding )
219 OUString aStrDec = OStringToOUString(aStrEnc, eCharSet);
221 sal_Int32
nPos = aStrDec.indexOf(aStrDelimDecoded);
224 OUStringBuffer
aBuf(aStrDec);
225 aBuf.insert(nPos, aStrDelimDecoded);
226 aStrDec = aBuf.makeStringAndClear();
227 nPos = aStrDec.indexOf(
228 aStrDelimDecoded, nPos+1+aStrDelimDecoded.getLength());
239 sal_Int32
nPos = aStrEnc.indexOf(aStrDelimEncoded);
242 OStringBuffer
aBuf(aStrEnc);
243 aBuf.insert(nPos, aStrDelimEncoded);
244 aStrEnc = aBuf.makeStringAndClear();
245 nPos = aStrEnc.indexOf(
246 aStrDelimEncoded, nPos+1+aStrDelimEncoded.getLength());
249 rOut.
WriteBytes(aStrDelimEncoded.getStr(), aStrDelimEncoded.getLength());
250 rOut.
WriteBytes(aStrEnc.getStr(), aStrEnc.getLength());
251 rOut.
WriteBytes(aStrDelimEncoded.getStr(), aStrDelimEncoded.getLength());
256 aPrgrsBar.SetState( nRowCnt );
259 assert( aOS.isEmpty() &&
"aOS should be empty");
260 aOS.append(pSpecDataType_LF);
OUString getString() const
SC_DLLPUBLIC OUString GetInputString(SCCOL nCol, SCROW nRow, SCTAB nTab, bool bForceSystemLocale=false) const
OUString ScResId(TranslateId aId)
OUString getString(const ScDocument *pDoc) const
Retrieve string value.
const std::u16string_view pKeyVECTORS
This is very similar to ScCellValue, except that it references the original value instead of copying ...
const std::u16string_view pKeyTUPLES
void SetState(sal_uInt64 nVal, sal_uInt64 nNewRange=0)
SC_DLLPUBLIC bool HasTable(SCTAB nTab) const
ScFormulaCell * mpFormula
const std::u16string_view pKeyEOD
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
const std::u16string_view pKeyDATA
std::size_t WriteBytes(const void *pData, std::size_t nSize)
const std::u16string_view pKeyTABLE
void StartWritingUnicodeText()
SC_DLLPUBLIC bool GetTableArea(SCTAB nTab, SCCOL &rEndCol, SCROW &rEndRow, bool bCalcHiddens=false) const
const std::u16string_view pKeyBOT
void SetStreamCharSet(rtl_TextEncoding eCharSet)
rtl_TextEncoding GetStreamCharSet() const
SfxObjectShell * GetDocumentShell() const
bool WriteUniOrByteChar(sal_Unicode ch, rtl_TextEncoding eDestCharSet)
bool WriteUnicodeOrByteText(std::u16string_view rStr, rtl_TextEncoding eDestCharSet)
SC_DLLPUBLIC bool GetName(SCTAB nTab, OUString &rName) const
std::size_t write_uInt16s_FromOUString(SvStream &rStrm, std::u16string_view rStr, std::size_t nUnits)