[Libreoffice-commits] core.git: 2 commits - sc/qa sc/source

Markus Mohrhard markus.mohrhard at collabora.co.uk
Mon Dec 29 16:22:24 PST 2014


 dev/null                                              |binary
 sc/qa/unit/data/xls/shared-formula/relative-refs1.xls |binary
 sc/qa/unit/data/xls/shared-formula/relative-refs2.xls |binary
 sc/qa/unit/subsequent_filters-test.cxx                |   61 ++++++++++++++----
 sc/source/filter/excel/excform8.cxx                   |   11 ++-
 sc/source/filter/excel/impop.cxx                      |   12 +--
 6 files changed, 64 insertions(+), 20 deletions(-)

New commits:
commit 11109ded381e0cc4f44f7837af995c8c82b3df09
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Tue Dec 30 01:17:29 2014 +0100

    add test for fdo#84556
    
    Change-Id: I9b3af4f66513fff437facd17c0758ee92ac5744d

diff --git a/sc/qa/unit/data/xls/shared-formula/relative-refs.xls b/sc/qa/unit/data/xls/shared-formula/relative-refs1.xls
similarity index 100%
rename from sc/qa/unit/data/xls/shared-formula/relative-refs.xls
rename to sc/qa/unit/data/xls/shared-formula/relative-refs1.xls
diff --git a/sc/qa/unit/data/xls/shared-formula/relative-refs2.xls b/sc/qa/unit/data/xls/shared-formula/relative-refs2.xls
new file mode 100644
index 0000000..56ff822
Binary files /dev/null and b/sc/qa/unit/data/xls/shared-formula/relative-refs2.xls differ
diff --git a/sc/qa/unit/subsequent_filters-test.cxx b/sc/qa/unit/subsequent_filters-test.cxx
index 529486d..703f905 100644
--- a/sc/qa/unit/subsequent_filters-test.cxx
+++ b/sc/qa/unit/subsequent_filters-test.cxx
@@ -2583,23 +2583,58 @@ void ScFiltersTest::testSharedFormulaXLSB()
 
 void ScFiltersTest::testSharedFormulaXLS()
 {
-    ScDocShellRef xDocSh = loadDoc("shared-formula/relative-refs.", XLS);
-    CPPUNIT_ASSERT(xDocSh.Is());
-    ScDocument& rDoc = xDocSh->GetDocument();
-    rDoc.CalcAll();
+    {
+        // fdo#80091
+        ScDocShellRef xDocSh = loadDoc("shared-formula/relative-refs1.", XLS);
+        CPPUNIT_ASSERT(xDocSh.Is());
+        ScDocument& rDoc = xDocSh->GetDocument();
+        rDoc.CalcAll();
 
-    // A1:A30 should be all formulas, and they should belong to the same group.
-    const ScFormulaCell* pFC = rDoc.GetFormulaCell(ScAddress(0,1,0));
-    CPPUNIT_ASSERT(pFC);
-    CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(1), pFC->GetSharedTopRow());
-    CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(29), pFC->GetSharedLength());
+        // A1:A30 should be all formulas, and they should belong to the same group.
+        const ScFormulaCell* pFC = rDoc.GetFormulaCell(ScAddress(0,1,0));
+        CPPUNIT_ASSERT(pFC);
+        CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(1), pFC->GetSharedTopRow());
+        CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(29), pFC->GetSharedLength());
 
-    for(SCROW nRow = 0; nRow < 30; ++nRow)
-    {
-        ASSERT_DOUBLES_EQUAL(double(nRow+1), rDoc.GetValue(0, nRow, 0));
+        for(SCROW nRow = 0; nRow < 30; ++nRow)
+        {
+            ASSERT_DOUBLES_EQUAL(double(nRow+1), rDoc.GetValue(0, nRow, 0));
+        }
+
+        xDocSh->DoClose();
     }
 
-    xDocSh->DoClose();
+    {
+        // fdo#84556 and some related tests
+        ScDocShellRef xDocSh = loadDoc("shared-formula/relative-refs2.", XLS);
+        CPPUNIT_ASSERT(xDocSh.Is());
+        ScDocument& rDoc = xDocSh->GetDocument();
+        rDoc.CalcAll();
+
+        {
+            const ScFormulaCell* pFC = rDoc.GetFormulaCell(ScAddress(2,1,0));
+            CPPUNIT_ASSERT(pFC);
+            CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(1), pFC->GetSharedTopRow());
+            CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(10), pFC->GetSharedLength());
+
+            OUString aFormula;
+            rDoc.GetFormula(2, 1, 0, aFormula);
+            CPPUNIT_ASSERT_EQUAL(OUString("=SUM(B9:D9)"), aFormula);
+        }
+
+        {
+            const ScFormulaCell* pFC = rDoc.GetFormulaCell(ScAddress(4,8,0));
+            CPPUNIT_ASSERT(pFC);
+            CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(8), pFC->GetSharedTopRow());
+            CPPUNIT_ASSERT_EQUAL(static_cast<SCROW>(10), pFC->GetSharedLength());
+
+            OUString aFormula;
+            rDoc.GetFormula(4, 8, 0, aFormula);
+            CPPUNIT_ASSERT_EQUAL(OUString("=SUM(G9:EY9)"), aFormula);
+        }
+
+        xDocSh->DoClose();
+    }
 }
 
 void ScFiltersTest::testExternalRefCacheXLSX()
commit b010e6724fa5cd519daafd3abf57f0a3257025bb
Author: Markus Mohrhard <markus.mohrhard at collabora.co.uk>
Date:   Tue Dec 30 01:16:53 2014 +0100

    relative refs wrap around in xls, fdo#84556
    
    Change-Id: If84d468d4bd55ed55ccd517d0b078d283a1a9c38

diff --git a/sc/source/filter/excel/excform8.cxx b/sc/source/filter/excel/excform8.cxx
index 042d79b..ff4bd6c 100644
--- a/sc/source/filter/excel/excform8.cxx
+++ b/sc/source/filter/excel/excform8.cxx
@@ -1464,7 +1464,16 @@ void ExcelToSc8::ExcRelToScRel8( sal_uInt16 nRow, sal_uInt16 nC, ScSingleRefData
     {
         // C O L
         if( bColRel )
-            rSRD.SetRelCol(static_cast<SCCOL>(static_cast<sal_Int8>(nC)));
+        {
+            SCCOL nRelCol = static_cast<sal_Int8>(nC);
+            sal_Int16 nDiff = aEingPos.Col() + nRelCol;
+            if ( nDiff < 0)
+            {
+                // relative column references wrap around
+                nRelCol = static_cast<sal_Int16>(256 + (int)nRelCol);
+            }
+            rSRD.SetRelCol(static_cast<SCCOL>(nRelCol));
+        }
         else
             rSRD.SetAbsCol(static_cast<SCCOL>(nCol));
 
diff --git a/sc/source/filter/excel/impop.cxx b/sc/source/filter/excel/impop.cxx
index b000fa0..0629bca 100644
--- a/sc/source/filter/excel/impop.cxx
+++ b/sc/source/filter/excel/impop.cxx
@@ -842,17 +842,17 @@ void ImportExcel::Shrfmla( void )
 
     const ScTokenArray* pErgebnis;
 
-    pFormConv->Reset();
-    pFormConv->Convert( pErgebnis, maStrm, nLenExpr, true, FT_SharedFormula );
-
-    OSL_ENSURE( pErgebnis, "+ImportExcel::Shrfmla(): ScTokenArray is NULL!" );
-
     // The shared range in this record is erroneous more than half the time.
-    // Don't ever rely on it.
+    // Don't ever rely on it. Use the one from the formula cell above.
     SCCOL nCol1 = mpLastFormula->mnCol;
     SCROW nRow1 = mpLastFormula->mnRow;
 
     ScAddress aPos(nCol1, nRow1, GetCurrScTab());
+    pFormConv->Reset(aPos);
+    pFormConv->Convert( pErgebnis, maStrm, nLenExpr, true, FT_SharedFormula );
+
+    OSL_ENSURE( pErgebnis, "+ImportExcel::Shrfmla(): ScTokenArray is NULL!" );
+
     pExcRoot->pShrfmlaBuff->Store(aPos, *pErgebnis);
 
     // Create formula cell for the last formula record.


More information about the Libreoffice-commits mailing list