use DocumentImport for csv import, related fdo#69006
Change-Id: Ib904510b6e897feb787497a4c8ff4204387cf6a4
diff --git a/sc/inc/documentimport.hxx b/sc/inc/documentimport.hxx
index 06203019..25d4a03 100644
--- a/sc/inc/documentimport.hxx
+++ b/sc/inc/documentimport.hxx
@@ -23,6 +23,7 @@ class ScColumn;
class ScAddress;
class ScTokenArray;
class ScFormulaCell;
struct ScSetStringParam;
struct ScDocumentImportImpl;
/**
@@ -59,7 +60,8 @@ public:
void setOriginDate(sal_uInt16 nYear, sal_uInt16 nMonth, sal_uInt16 nDay);
void setAutoInput(const ScAddress& rPos, const OUString& rStr);
void setAutoInput(const ScAddress& rPos, const OUString& rStr,
ScSetStringParam* pStringParam = NULL);
void setNumericCell(const ScAddress& rPos, double fVal);
void setStringCell(const ScAddress& rPos, const OUString& rStr);
void setEditCell(const ScAddress& rPos, EditTextObject* pEditText);
diff --git a/sc/source/core/data/documentimport.cxx b/sc/source/core/data/documentimport.cxx
index 03f5842..99e9b36 100644
--- a/sc/source/core/data/documentimport.cxx
+++ b/sc/source/core/data/documentimport.cxx
@@ -16,6 +16,7 @@
#include "globalnames.hxx"
#include "mtvelements.hxx"
#include "tokenarray.hxx"
#include "stringutil.hxx"
#include "svl/sharedstringpool.hxx"
@@ -81,7 +82,7 @@ void ScDocumentImport::setOriginDate(sal_uInt16 nYear, sal_uInt16 nMonth, sal_uI
mpImpl->mrDoc.pDocOptions->SetDate(nDay, nMonth, nYear);
}
void ScDocumentImport::setAutoInput(const ScAddress& rPos, const OUString& rStr)
void ScDocumentImport::setAutoInput(const ScAddress& rPos, const OUString& rStr, ScSetStringParam* pStringParam)
{
ScTable* pTab = mpImpl->mrDoc.FetchTable(rPos.Tab());
if (!pTab)
@@ -95,7 +96,7 @@ void ScDocumentImport::setAutoInput(const ScAddress& rPos, const OUString& rStr)
ScCellValue aCell;
pTab->aCol[rPos.Col()].ParseString(
aCell, rPos.Row(), rPos.Tab(), rStr, mpImpl->mrDoc.GetAddressConvention(), NULL);
aCell, rPos.Row(), rPos.Tab(), rStr, mpImpl->mrDoc.GetAddressConvention(), pStringParam);
sc::CellStoreType& rCells = pTab->aCol[rPos.Col()].maCells;
switch (aCell.meType)
diff --git a/sc/source/ui/docshell/impex.cxx b/sc/source/ui/docshell/impex.cxx
index fccafbe..1399da2 100644
--- a/sc/source/ui/docshell/impex.cxx
+++ b/sc/source/ui/docshell/impex.cxx
@@ -49,6 +49,7 @@
#include "stringutil.hxx"
#include "cellvalue.hxx"
#include "tokenarray.hxx"
#include "documentimport.hxx"
#include "globstr.hrc"
#include <vcl/svapp.hxx>
@@ -954,11 +955,12 @@ bool ScImportExport::Text2Doc( SvStream& rStrm )
static bool lcl_PutString(
ScDocument* pDoc, SCCOL nCol, SCROW nRow, SCTAB nTab, const OUString& rStr, sal_uInt8 nColFormat,
ScDocumentImport& rDocImport, SCCOL nCol, SCROW nRow, SCTAB nTab, const OUString& rStr, sal_uInt8 nColFormat,
SvNumberFormatter* pFormatter, bool bDetectNumFormat,
::utl::TransliterationWrapper& rTransliteration, CalendarWrapper& rCalendar,
::utl::TransliterationWrapper* pSecondTransliteration, CalendarWrapper* pSecondCalendar )
{
ScDocument* pDoc = &rDocImport.getDoc();
bool bMultiLine = false;
if ( nColFormat == SC_COL_SKIP || rStr.isEmpty() || !ValidCol(nCol) || !ValidRow(nRow) )
return bMultiLine;
@@ -977,8 +979,18 @@ static bool lcl_PutString(
pDoc->ApplyPattern(nCol, nRow, nTab, aNewAttrs);
}
pDoc->SetTextCell(ScAddress(nCol,nRow,nTab), rStr);
return bMultiLine;
if(ScStringUtil::isMultiline(rStr))
{
ScFieldEditEngine& rEngine = pDoc->GetEditEngine();
rEngine.SetText(rStr);
rDocImport.setEditCell(ScAddress(nCol, nRow, nTab), rEngine.CreateTextObject());
return true;
}
else
{
rDocImport.setStringCell(ScAddress(nCol, nRow, nTab), rStr);
return false;
}
}
if ( nColFormat == SC_COL_ENGLISH )
@@ -991,7 +1003,7 @@ static bool lcl_PutString(
if ( pDocFormatter->IsNumberFormat( rStr, nEnglish, fVal ) )
{
// Zahlformat wird nicht auf englisch gesetzt
pDoc->SetValue( nCol, nRow, nTab, fVal );
rDocImport.setNumericCell( ScAddress( nCol, nRow, nTab ), fVal );
return bMultiLine;
}
// sonst weiter mit SetString
@@ -1180,7 +1192,7 @@ static bool lcl_PutString(
nFormat = pDocFormatter->GetStandardFormat( fDays, nFormat, nType, eDocLang);
ScAddress aPos(nCol,nRow,nTab);
pDoc->SetValue(aPos, fDays);
rDocImport.setNumericCell(aPos, fDays);
pDoc->SetNumberFormat(aPos, nFormat);
return bMultiLine; // success
@@ -1197,14 +1209,14 @@ static bool lcl_PutString(
aParam.mbDetectNumberFormat = bDetectNumFormat;
aParam.meSetTextNumFormat = ScSetStringParam::SpecialNumberOnly;
aParam.mbHandleApostrophe = false;
pDoc->SetString( nCol, nRow, nTab, rStr, &aParam );
rDocImport.setAutoInput(ScAddress(nCol, nRow, nTab), rStr, &aParam);
}
else
{
bMultiLine = true;
ScFieldEditEngine& rEngine = pDoc->GetEditEngine();
rEngine.SetText(rStr);
pDoc->SetEditText(ScAddress(nCol,nRow,nTab), rEngine.CreateTextObject());
rDocImport.setEditCell(ScAddress(nCol, nRow, nTab), rEngine.CreateTextObject());
}
return bMultiLine;
}
@@ -1327,6 +1339,7 @@ bool ScImportExport::ExtText2Doc( SvStream& rStrm )
sal_uLong nOriginalStreamPos = rStrm.Tell();
ScDocumentImport aDocImport(*pDoc);
do
{
for( ;; )
@@ -1363,7 +1376,7 @@ bool ScImportExport::ExtText2Doc( SvStream& rStrm )
nFmt = SC_COL_TEXT;
bMultiLine |= lcl_PutString(
pDoc, nCol, nRow, nTab, aCell, nFmt,
aDocImport, nCol, nRow, nTab, aCell, nFmt,
&aNumFormatter, bDetectNumFormat, aTransliteration, aCalendar,
pEnglishTransliteration.get(), pEnglishCalendar.get());
}
@@ -1406,7 +1419,7 @@ bool ScImportExport::ExtText2Doc( SvStream& rStrm )
nFmt = SC_COL_TEXT;
bMultiLine |= lcl_PutString(
pDoc, nCol, nRow, nTab, aCell, nFmt,
aDocImport, nCol, nRow, nTab, aCell, nFmt,
&aNumFormatter, bDetectNumFormat, aTransliteration,
aCalendar, pEnglishTransliteration.get(), pEnglishCalendar.get());
}
@@ -1464,6 +1477,7 @@ bool ScImportExport::ExtText2Doc( SvStream& rStrm )
bDetermineRange = !bDetermineRange; // toggle
} while (!bDetermineRange);
aDocImport.finalize();
xProgress.reset(); // make room for AdjustRowHeight progress
if (bRangeIsDetermined)