diff options
author | Eike Rathke <erack@redhat.com> | 2018-02-16 22:47:02 +0100 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2018-02-16 22:48:58 +0100 |
commit | 40530d0ce4883ac999d53f86c0483e1a47c9fd74 (patch) | |
tree | 70a195877c43699acc1c13daf9502f257a45e66e /sc | |
parent | 608272840a799e783fd15197c78bfa2b58145cf4 (diff) |
Resolves: tdf#114995 support CSV as Link to External Data
... with one CSV_all range for all data.
Change-Id: Ibe7a8f5141394eb4592e83a69e620e4b1a6b5221
Diffstat (limited to 'sc')
-rw-r--r-- | sc/source/ui/docshell/arealink.cxx | 79 | ||||
-rw-r--r-- | sc/source/ui/miscdlgs/linkarea.cxx | 7 |
2 files changed, 52 insertions, 34 deletions
diff --git a/sc/source/ui/docshell/arealink.cxx b/sc/source/ui/docshell/arealink.cxx index cc98d0744adc..81e2c7cf5b0d 100644 --- a/sc/source/ui/docshell/arealink.cxx +++ b/sc/source/ui/docshell/arealink.cxx @@ -270,16 +270,32 @@ bool ScAreaLink::Refresh( const OUString& rNewFile, const OUString& rNewFilter, // find total size of source area SCCOL nWidth = 0; SCROW nHeight = 0; + ScRangeList aSourceRanges; + + if (rNewFilter == "Text - txt - csv (StarCalc)" && aTempArea == "CSV_all") + { + // The dummy All range. All data, including top/left empty + // rows/columns. + aTempArea.clear(); + SCCOL nEndCol = 0; + SCROW nEndRow = 0; + if (rSrcDoc.GetCellArea( 0, nEndCol, nEndRow)) + { + aSourceRanges.Append( ScRange( 0,0,0, nEndCol, nEndRow, 0)); + nWidth = nEndCol + 1; + nHeight = nEndRow + 2; + } + } + sal_Int32 nTokenCnt = comphelper::string::getTokenCount(aTempArea, ';'); sal_Int32 nStringIx = 0; - sal_Int32 nToken; - - for( nToken = 0; nToken < nTokenCnt; nToken++ ) + for (sal_Int32 nToken = 0; nToken < nTokenCnt; ++nToken) { OUString aToken( aTempArea.getToken( 0, ';', nStringIx ) ); ScRange aTokenRange; if( FindExtRange( aTokenRange, &rSrcDoc, aToken ) ) { + aSourceRanges.Append( aTokenRange); // columns: find maximum nWidth = std::max( nWidth, static_cast<SCCOL>(aTokenRange.aEnd.Col() - aTokenRange.aStart.Col() + 1) ); // rows: add row range + 1 empty row @@ -355,40 +371,35 @@ bool ScAreaLink::Refresh( const OUString& rNewFile, const OUString& rNewFilter, { ScDocument aClipDoc( SCDOCMODE_CLIP ); ScRange aNewTokenRange( aNewRange.aStart ); - nStringIx = 0; - for( nToken = 0; nToken < nTokenCnt; nToken++ ) + for (size_t nRange = 0; nRange < aSourceRanges.size(); ++nRange) { - OUString aToken( aTempArea.getToken( 0, ';', nStringIx ) ); - ScRange aTokenRange; - if( FindExtRange( aTokenRange, &rSrcDoc, aToken ) ) + ScRange aTokenRange( *aSourceRanges[nRange]); + SCTAB nSrcTab = aTokenRange.aStart.Tab(); + ScMarkData aSourceMark; + aSourceMark.SelectOneTable( nSrcTab ); // selecting for CopyToClip + aSourceMark.SetMarkArea( aTokenRange ); + + ScClipParam aClipParam(aTokenRange, false); + rSrcDoc.CopyToClip(aClipParam, &aClipDoc, &aSourceMark, false, false); + + if ( aClipDoc.HasAttrib( 0,0,nSrcTab, MAXCOL,MAXROW,nSrcTab, + HasAttrFlags::Merged | HasAttrFlags::Overlapped ) ) { - SCTAB nSrcTab = aTokenRange.aStart.Tab(); - ScMarkData aSourceMark; - aSourceMark.SelectOneTable( nSrcTab ); // selecting for CopyToClip - aSourceMark.SetMarkArea( aTokenRange ); - - ScClipParam aClipParam(aTokenRange, false); - rSrcDoc.CopyToClip(aClipParam, &aClipDoc, &aSourceMark, false, false); - - if ( aClipDoc.HasAttrib( 0,0,nSrcTab, MAXCOL,MAXROW,nSrcTab, - HasAttrFlags::Merged | HasAttrFlags::Overlapped ) ) - { - //! ResetAttrib at document !!! - - ScPatternAttr aPattern( rSrcDoc.GetPool() ); - aPattern.GetItemSet().Put( ScMergeAttr() ); // Defaults - aPattern.GetItemSet().Put( ScMergeFlagAttr() ); - aClipDoc.ApplyPatternAreaTab( 0,0, MAXCOL,MAXROW, nSrcTab, aPattern ); - } - - aNewTokenRange.aEnd.SetCol( aNewTokenRange.aStart.Col() + (aTokenRange.aEnd.Col() - aTokenRange.aStart.Col()) ); - aNewTokenRange.aEnd.SetRow( aNewTokenRange.aStart.Row() + (aTokenRange.aEnd.Row() - aTokenRange.aStart.Row()) ); - ScMarkData aDestMark; - aDestMark.SelectOneTable( nDestTab ); - aDestMark.SetMarkArea( aNewTokenRange ); - rDoc.CopyFromClip( aNewTokenRange, aDestMark, InsertDeleteFlags::ALL, nullptr, &aClipDoc, false ); - aNewTokenRange.aStart.SetRow( aNewTokenRange.aEnd.Row() + 2 ); + //! ResetAttrib at document !!! + + ScPatternAttr aPattern( rSrcDoc.GetPool() ); + aPattern.GetItemSet().Put( ScMergeAttr() ); // Defaults + aPattern.GetItemSet().Put( ScMergeFlagAttr() ); + aClipDoc.ApplyPatternAreaTab( 0,0, MAXCOL,MAXROW, nSrcTab, aPattern ); } + + aNewTokenRange.aEnd.SetCol( aNewTokenRange.aStart.Col() + (aTokenRange.aEnd.Col() - aTokenRange.aStart.Col()) ); + aNewTokenRange.aEnd.SetRow( aNewTokenRange.aStart.Row() + (aTokenRange.aEnd.Row() - aTokenRange.aStart.Row()) ); + ScMarkData aDestMark; + aDestMark.SelectOneTable( nDestTab ); + aDestMark.SetMarkArea( aNewTokenRange ); + rDoc.CopyFromClip( aNewTokenRange, aDestMark, InsertDeleteFlags::ALL, nullptr, &aClipDoc, false ); + aNewTokenRange.aStart.SetRow( aNewTokenRange.aEnd.Row() + 2 ); } } else diff --git a/sc/source/ui/miscdlgs/linkarea.cxx b/sc/source/ui/miscdlgs/linkarea.cxx index 430af73633f2..96f613ffa7a1 100644 --- a/sc/source/ui/miscdlgs/linkarea.cxx +++ b/sc/source/ui/miscdlgs/linkarea.cxx @@ -257,6 +257,13 @@ void ScLinkedAreaDlg::UpdateSourceRanges() m_pLbRanges->Clear(); if ( pSourceShell ) { + std::shared_ptr<const SfxFilter> pFilter = pSourceShell->GetMedium()->GetFilter(); + if (pFilter && pFilter->GetFilterName() == "Text - txt - csv (StarCalc)") + { + // Insert dummy All range to have something selectable. + m_pLbRanges->InsertEntry("CSV_all"); + } + ScAreaNameIterator aIter( &pSourceShell->GetDocument() ); ScRange aDummy; OUString aName; |