Kaydet (Commit) 1c7fa952 authored tarafından Kohei Yoshida's avatar Kohei Yoshida Kaydeden (comit) Kohei Yoshida

Defer cell value insertion until later.

Because Calc's formula engine expects all named expressions to be
present at the time of re-calculations, we need to delay insertion
of cell values until after the named expressions are inserted into
the document.

Change-Id: I54c7d3dc86b3e2c5c192337b1cebfbdfb901ab1f
Reviewed-on: https://gerrit.libreoffice.org/46665Reviewed-by: 's avatarKohei Yoshida <libreoffice@kohei.us>
Tested-by: 's avatarKohei Yoshida <libreoffice@kohei.us>
üst a72f3d40
......@@ -96,7 +96,15 @@ public:
void setNumericCell(const ScAddress& rPos, double fVal);
void setStringCell(const ScAddress& rPos, const OUString& rStr);
void setEditCell(const ScAddress& rPos, EditTextObject* pEditText);
void setFormulaCell(const ScAddress& rPos, const OUString& rFormula, formula::FormulaGrammar::Grammar eGrammar);
void setFormulaCell(
const ScAddress& rPos, const OUString& rFormula, formula::FormulaGrammar::Grammar eGrammar,
const double* pResult = nullptr );
void setFormulaCell(
const ScAddress& rPos, const OUString& rFormula, formula::FormulaGrammar::Grammar eGrammar,
const OUString& rResult );
void setFormulaCell(const ScAddress& rPos, ScTokenArray* pArray);
void setFormulaCell(const ScAddress& rPos, ScFormulaCell* pCell);
......
......@@ -25,9 +25,7 @@
#include <svl/sharedstringpool.hxx>
#include <svl/languageoptions.hxx>
#include <memory>
#include <vector>
#include <o3tl/make_unique.hxx>
namespace {
......@@ -271,7 +269,35 @@ void ScDocumentImport::setEditCell(const ScAddress& rPos, EditTextObject* pEditT
}
void ScDocumentImport::setFormulaCell(
const ScAddress& rPos, const OUString& rFormula, formula::FormulaGrammar::Grammar eGrammar)
const ScAddress& rPos, const OUString& rFormula, formula::FormulaGrammar::Grammar eGrammar,
const double* pResult )
{
ScTable* pTab = mpImpl->mrDoc.FetchTable(rPos.Tab());
if (!pTab)
return;
sc::ColumnBlockPosition* pBlockPos = mpImpl->getBlockPosition(rPos.Tab(), rPos.Col());
if (!pBlockPos)
return;
std::unique_ptr<ScFormulaCell> pFC =
o3tl::make_unique<ScFormulaCell>(&mpImpl->mrDoc, rPos, rFormula, eGrammar);
if (pResult)
{
// Set cached result to this formula cell.
pFC->SetResultDouble(*pResult);
}
sc::CellStoreType& rCells = pTab->aCol[rPos.Col()].maCells;
pBlockPos->miCellPos =
rCells.set(pBlockPos->miCellPos, rPos.Row(), pFC.release());
}
void ScDocumentImport::setFormulaCell(
const ScAddress& rPos, const OUString& rFormula, formula::FormulaGrammar::Grammar eGrammar,
const OUString& rResult )
{
ScTable* pTab = mpImpl->mrDoc.FetchTable(rPos.Tab());
if (!pTab)
......@@ -282,9 +308,15 @@ void ScDocumentImport::setFormulaCell(
if (!pBlockPos)
return;
std::unique_ptr<ScFormulaCell> pFC =
o3tl::make_unique<ScFormulaCell>(&mpImpl->mrDoc, rPos, rFormula, eGrammar);
// Set cached result to this formula cell.
pFC->SetHybridString(mpImpl->mrDoc.GetSharedStringPool().intern(rResult));
sc::CellStoreType& rCells = pTab->aCol[rPos.Col()].maCells;
pBlockPos->miCellPos =
rCells.set(pBlockPos->miCellPos, rPos.Row(), new ScFormulaCell(&mpImpl->mrDoc, rPos, rFormula, eGrammar));
rCells.set(pBlockPos->miCellPos, rPos.Row(), pFC.release());
}
void ScDocumentImport::setFormulaCell(const ScAddress& rPos, ScTokenArray* pArray)
......
......@@ -273,6 +273,8 @@ public:
virtual orcus::spreadsheet::range_size_t get_sheet_size() const override;
SCTAB getIndex() const { return mnTab; }
const sc::SharedFormulaGroups& getSharedFormulaGroups() const;
};
class ScOrcusStyles : public orcus::spreadsheet::iface::import_styles
......@@ -508,28 +510,51 @@ public:
class ScOrcusFactory : public orcus::spreadsheet::iface::import_factory
{
struct StringCellCache
struct CellStoreToken
{
enum class Type
{
Auto,
Numeric,
String,
Formula,
FormulaWithResult,
SharedFormula,
SharedFormulaWithResult,
Matrix
};
ScAddress maPos;
size_t mnIndex;
Type meType;
StringCellCache(const ScAddress& rPos, size_t nIndex);
OUString maStr1;
OUString maStr2;
double mfValue;
uint32_t mnIndex1;
uint32_t mnIndex2;
formula::FormulaGrammar::Grammar meGrammar;
CellStoreToken( const ScAddress& rPos, Type eType );
CellStoreToken( const ScAddress& rPos, double fValue );
CellStoreToken( const ScAddress& rPos, uint32_t nIndex );
CellStoreToken( const ScAddress& rPos, const OUString& rFormula, formula::FormulaGrammar::Grammar eGrammar );
};
typedef std::unordered_map<OUString, size_t> StringHashType;
typedef std::vector<StringCellCache> StringCellCaches;
typedef std::vector<CellStoreToken> CellStoreTokensType;
ScDocumentImport maDoc;
std::vector<OUString> maStrings;
StringHashType maStringHash;
StringCellCaches maStringCells;
CellStoreTokensType maCellStoreTokens;
ScOrcusGlobalSettings maGlobalSettings;
ScOrcusRefResolver maRefResolver;
ScOrcusSharedStrings maSharedStrings;
ScOrcusNamedExpression maNamedExpressions;
std::vector< std::unique_ptr<ScOrcusSheet> > maSheets;
std::vector<std::unique_ptr<ScOrcusSheet>> maSheets;
ScOrcusStyles maStyles;
int mnProgress;
......@@ -552,7 +577,19 @@ public:
size_t appendString(const OUString& rStr);
size_t addString(const OUString& rStr);
void pushStringCell(const ScAddress& rPos, size_t nStrIndex);
void pushCellStoreAutoToken( const ScAddress& rPos, const OUString& rVal );
void pushCellStoreToken( const ScAddress& rPos, uint32_t nStrIndex );
void pushCellStoreToken( const ScAddress& rPos, double fValue );
void pushCellStoreToken(
const ScAddress& rPos, const OUString& rFormula, formula::FormulaGrammar::Grammar eGrammar );
void pushSharedFormulaToken( const ScAddress& rPos, uint32_t nIndex );
void pushMatrixFormulaToken(
const ScAddress& rPos, const OUString& rFormula, formula::FormulaGrammar::Grammar eGrammar,
uint32_t nRowRange, uint32_t nColRange );
void pushFormulaResult( const ScAddress& rPos, double fValue );
void pushFormulaResult( const ScAddress& rPos, const OUString& rValue );
void incrementProgress();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment