diff options
Diffstat (limited to 'sc/source/core/data/column2.cxx')
-rw-r--r-- | sc/source/core/data/column2.cxx | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx index c2068671ed01..9b0b5efb358d 100644 --- a/sc/source/core/data/column2.cxx +++ b/sc/source/core/data/column2.cxx @@ -2066,16 +2066,23 @@ namespace { struct CellBucket { + SCSIZE mnEmpValStart; SCSIZE mnNumValStart; SCSIZE mnStrValStart; + SCSIZE mnEmpValCount; std::vector<double> maNumVals; std::vector<svl::SharedString> maStrVals; - CellBucket() : mnNumValStart(0), mnStrValStart(0) {} + CellBucket() : mnEmpValStart(0), mnNumValStart(0), mnStrValStart(0), mnEmpValCount(0) {} void flush(ScMatrix& rMat, SCSIZE nCol) { - if (!maNumVals.empty()) + if (mnEmpValCount) + { + rMat.PutEmptyResultVector(mnEmpValCount, nCol, mnEmpValStart); + reset(); + } + else if (!maNumVals.empty()) { const double* p = &maNumVals[0]; rMat.PutDouble(p, maNumVals.size(), nCol, mnNumValStart); @@ -2091,7 +2098,8 @@ struct CellBucket void reset() { - mnNumValStart = mnStrValStart = 0; + mnEmpValStart = mnNumValStart = mnStrValStart = 0; + mnEmpValCount = 0; maNumVals.clear(); maStrVals.clear(); } @@ -2163,7 +2171,18 @@ public: if (rCell.IsEmpty()) { - aBucket.flush(mrMat, mnMatCol); + if (aBucket.mnEmpValCount && nThisRow == nPrevRow + 1) + { + // Secondary empty results. + ++aBucket.mnEmpValCount; + } + else + { + // First empty result. + aBucket.flush(mrMat, mnMatCol); + aBucket.mnEmpValStart = nThisRow - mnTopRow; + ++aBucket.mnEmpValCount; + } continue; } |