sc/qa/unit/data/contentCSV/matrix2.csv | 2 ++ sc/qa/unit/data/ods/matrix.ods |binary sc/qa/unit/subsequent_filters-test.cxx | 23 ++++++++++++++++++++++- sc/source/filter/xml/xmlcelli.cxx | 31 +++++++++++++++++-------------- 4 files changed, 41 insertions(+), 15 deletions(-)
New commits: commit 191c4bf8a6ee43bbac25f5a0f83181c74fac8390 Author: Daniel Bankston <[email protected]> Date: Sun Jul 8 12:57:36 2012 -0500 Fix problem with cached matrix formula results that contain errors Change-Id: I9277714780e00e311e6e81a9de6e4d39409d5c9b diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx index 67ca9c7..e5c81e0 100644 --- a/sc/source/filter/xml/xmlcelli.cxx +++ b/sc/source/filter/xml/xmlcelli.cxx @@ -795,7 +795,10 @@ void ScXMLTableRowCellContext::AddNumberCellToDoc( const ScAddress& rCurrentPos if ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA ) { ScFormulaCell* pFCell = static_cast<ScFormulaCell*>(pCell); - pFCell->SetHybridDouble( fValue ); + if( bFormulaTextResult && pOUTextValue && !pOUTextValue->isEmpty() ) + pFCell->SetHybridString( *pOUTextValue ); + else + pFCell->SetHybridDouble( fValue ); pFCell->ResetDirty(); } } @@ -1052,15 +1055,6 @@ void ScXMLTableRowCellContext::AddNonMatrixFormulaCell( const ScAddress& rCellPo } } -namespace{ - -bool isErrOrNA(const rtl::OUString& rStr) -{ - return (rStr.indexOf("Err:") > -1) || (rStr.indexOf("#N/A") > -1); -} - -} - void ScXMLTableRowCellContext::AddFormulaCell( const ScAddress& rCellPos ) { if( cellExists(rCellPos) ) @@ -1069,10 +1063,6 @@ void ScXMLTableRowCellContext::AddFormulaCell( const ScAddress& rCellPos ) OSL_ENSURE(((nColsRepeated == 1) && (nRepeatedRows == 1)), "repeated cells with formula not possible now"); rXMLImport.GetStylesImportHelper()->AddCell(rCellPos); - //if this is an "Err:###" or "#N/A" then use text:p value - if( bFormulaTextResult && pOUTextContent && isErrOrNA(*pOUTextContent) ) - pOUTextValue.reset(*pOUTextContent); - //add matrix if(bIsMatrix) { @@ -1115,6 +1105,15 @@ void ScXMLTableRowCellContext::AddFormulaCell( const ScAddress& rCellPos ) } } +namespace{ + +bool isErrOrNA(const rtl::OUString& rStr) +{ + return (rStr.indexOf("Err:") > -1) || (rStr.indexOf("#N/A") > -1); +} + +} + void ScXMLTableRowCellContext::EndElement() { if( bHasTextImport && rXMLImport.GetRemoveLastChar() ) @@ -1131,6 +1130,10 @@ void ScXMLTableRowCellContext::EndElement() } } + //if this is an "Err:###" or "#N/A" then use text:p value + if( bFormulaTextResult && pOUTextContent && isErrOrNA(*pOUTextContent) ) + pOUTextValue.reset(*pOUTextContent); + ScAddress aCellPos = rXMLImport.GetTables().GetCurrentCellPos(); if( aCellPos.Col() > 0 && nRepeatedRows > 1 ) aCellPos.SetRow( aCellPos.Row() - (nRepeatedRows - 1) ); commit 8fd6bdaa4fcffce595675f79e2e75bc8a795e0c2 Author: Daniel Bankston <[email protected]> Date: Sun Jul 8 12:45:52 2012 -0500 Add test for cached matrix formula results -Includes test case for cached formula result errors Change-Id: I446240daffdbd6cd7ebd3c3b8dc2305c789d8519 diff --git a/sc/qa/unit/data/contentCSV/matrix2.csv b/sc/qa/unit/data/contentCSV/matrix2.csv new file mode 100644 index 0000000..44b3f71 --- /dev/null +++ b/sc/qa/unit/data/contentCSV/matrix2.csv @@ -0,0 +1,2 @@ +Matrix with errors:,, +Err:502,Err:502,Err:502 diff --git a/sc/qa/unit/data/ods/matrix.ods b/sc/qa/unit/data/ods/matrix.ods index 3c9f16a..7b69691 100644 Binary files a/sc/qa/unit/data/ods/matrix.ods and b/sc/qa/unit/data/ods/matrix.ods differ diff --git a/sc/qa/unit/subsequent_filters-test.cxx b/sc/qa/unit/subsequent_filters-test.cxx index ce0133f..537b565 100644 --- a/sc/qa/unit/subsequent_filters-test.cxx +++ b/sc/qa/unit/subsequent_filters-test.cxx @@ -103,6 +103,7 @@ public: void testHardRecalcODS(); void testFunctionsODS(); void testCachedFormulaResultsODS(); + void testCachedMatrixFormulaResultsODS(); void testDatabaseRangesODS(); void testDatabaseRangesXLS(); void testDatabaseRangesXLSX(); @@ -136,6 +137,7 @@ public: CPPUNIT_TEST(testHardRecalcODS); CPPUNIT_TEST(testFunctionsODS); CPPUNIT_TEST(testCachedFormulaResultsODS); + CPPUNIT_TEST(testCachedMatrixFormulaResultsODS); CPPUNIT_TEST(testDatabaseRangesODS); CPPUNIT_TEST(testDatabaseRangesXLS); CPPUNIT_TEST(testDatabaseRangesXLSX); @@ -313,7 +315,7 @@ void ScFiltersTest::testHardRecalcODS() ScDocShellRef xDocSh = loadDoc( aFileNameBase, ODS ); xDocSh->DoHardRecalc(true); - CPPUNIT_ASSERT_MESSAGE("Failed to load functions.*", xDocSh.Is()); + CPPUNIT_ASSERT_MESSAGE("Failed to load hard-recalc.*", xDocSh.Is()); ScDocument* pDoc = xDocSh->GetDocument(); rtl::OUString aCSVFileName; @@ -376,6 +378,25 @@ void ScFiltersTest::testCachedFormulaResultsODS() xDocSh->DoClose(); } +void ScFiltersTest::testCachedMatrixFormulaResultsODS() +{ + const rtl::OUString aFileNameBase(RTL_CONSTASCII_USTRINGPARAM("matrix.")); + ScDocShellRef xDocSh = loadDoc( aFileNameBase, ODS); + + CPPUNIT_ASSERT_MESSAGE("Failed to load matrix.*", xDocSh.Is()); + ScDocument* pDoc = xDocSh->GetDocument(); + + //test matrix + rtl::OUString aCSVFileName; + createCSVPath(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("matrix.")), aCSVFileName); + testFile(aCSVFileName, pDoc, 0); + //test matrix with errors + createCSVPath(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("matrix2.")), aCSVFileName); + testFile(aCSVFileName, pDoc, 1); + + xDocSh->DoClose(); +} + namespace { void testDBRanges_Impl(ScDocument* pDoc, sal_Int32 nFormat) _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
