diff options
author | Justin Luth <justin_luth@sil.org> | 2022-02-23 10:34:29 +0200 |
---|---|---|
committer | Justin Luth <jluth@mail.com> | 2022-02-23 16:48:56 +0100 |
commit | 8f5d8669ca74fed8608e438a8436c173e35d43a6 (patch) | |
tree | c36c0931aadf49d2e520755735033253c359fbdb /sc | |
parent | 8feca2e3146171f76a8aa0b38fff54f327afddaf (diff) |
tdf#122098 xlsx im/export: let formulas guess their number format
This fixes the import side of a LO 4.2 regression
from commit 07b66cd3ac1a9f6c7b61a1d7da6e9d266e6de92d
and the export side of a LO 4.3 regression
from commit 69ecdad805281b2cb6ec2437da18daa19576deae
make CppunitTest_sc_pivottable_filters_test \
CPPUNIT_TEST_NAME=testPivotTableBoolFieldFilterXLSX
Change-Id: I4c680dbff844cf1eca52de641856daafa032eeb4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/130406
Tested-by: Justin Luth <jluth@mail.com>
Reviewed-by: Justin Luth <jluth@mail.com>
Diffstat (limited to 'sc')
-rw-r--r-- | sc/qa/unit/pivottable_filters_test.cxx | 5 | ||||
-rw-r--r-- | sc/source/filter/excel/xestream.cxx | 12 | ||||
-rw-r--r-- | sc/source/filter/oox/formulabuffer.cxx | 7 |
3 files changed, 20 insertions, 4 deletions
diff --git a/sc/qa/unit/pivottable_filters_test.cxx b/sc/qa/unit/pivottable_filters_test.cxx index ef31fcf81282..36aa697b5071 100644 --- a/sc/qa/unit/pivottable_filters_test.cxx +++ b/sc/qa/unit/pivottable_filters_test.cxx @@ -2196,6 +2196,7 @@ void ScPivotTableFiltersTest::testPivotTableBoolFieldFilterXLSX() ScDocument& rDoc = xDocSh->GetDocument(); ScDPCollection* pDPs = rDoc.GetDPCollection(); CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), pDPs->GetCount()); + CPPUNIT_ASSERT_EQUAL(OUString("TRUE"), rDoc.GetString(ScAddress(0, 1, 0))); //A2 // Reload and check filtering of row dimensions xDocSh = saveAndReload(*xDocSh, FORMAT_XLSX); @@ -2213,11 +2214,11 @@ void ScPivotTableFiltersTest::testPivotTableBoolFieldFilterXLSX() const ScDPSaveDimension::MemberList& rMembers = pSaveDim->GetMembers(); CPPUNIT_ASSERT_EQUAL(size_t(2), rMembers.size()); - ScDPSaveMember* pMember = pSaveDim->GetExistingMemberByName("0"); + ScDPSaveMember* pMember = pSaveDim->GetExistingMemberByName("FALSE"); CPPUNIT_ASSERT(pMember); CPPUNIT_ASSERT(pMember->HasIsVisible()); CPPUNIT_ASSERT(!pMember->GetIsVisible()); - pMember = pSaveDim->GetExistingMemberByName("1"); + pMember = pSaveDim->GetExistingMemberByName("TRUE"); CPPUNIT_ASSERT(pMember); CPPUNIT_ASSERT(pMember->HasIsVisible()); CPPUNIT_ASSERT(pMember->GetIsVisible()); diff --git a/sc/source/filter/excel/xestream.cxx b/sc/source/filter/excel/xestream.cxx index 74c0f9514831..a3c1b92fe86d 100644 --- a/sc/source/filter/excel/xestream.cxx +++ b/sc/source/filter/excel/xestream.cxx @@ -673,8 +673,16 @@ void XclXmlUtils::GetFormulaTypeAndValue( ScFormulaCell& rCell, const char*& rsT rsValue = ToOUString(lcl_GetErrorString(aResValue.mnError)); break; case sc::FormulaResultValue::Value: - rsType = "n"; - rsValue = OUString::number(aResValue.mfValue); + if (rCell.GetFormatType() == SvNumFormatType::LOGICAL) + { + rsType = "b"; + rsValue = rCell.GetValue() == 0.0 ? "0" : "1"; + } + else + { + rsType = "n"; + rsValue = OUString::number(aResValue.mfValue); + } break; case sc::FormulaResultValue::String: rsType = "str"; diff --git a/sc/source/filter/oox/formulabuffer.cxx b/sc/source/filter/oox/formulabuffer.cxx index 2aeccb1b37b7..7fcc4f5e259f 100644 --- a/sc/source/filter/oox/formulabuffer.cxx +++ b/sc/source/filter/oox/formulabuffer.cxx @@ -153,6 +153,9 @@ void applySharedFormulas( pCell = new ScFormulaCell(rDoc.getDoc(), aPos, *pArray); rDoc.setFormulaCell(aPos, pCell); + if (rDoc.getDoc().GetNumberFormat(aPos.Col(), aPos.Row(), aPos.Tab()) % SV_COUNTRY_LANGUAGE_OFFSET == 0) + pCell->SetNeedNumberFormat(true); + if (rDesc.maCellValue.isEmpty()) { // No cached cell value. Mark it for re-calculation. @@ -227,6 +230,8 @@ void applyCellFormulas( pCell = new ScFormulaCell(rDoc.getDoc(), aPos, p->mpCell->GetCode()->Clone()); rDoc.setFormulaCell(aPos, pCell); + if (rDoc.getDoc().GetNumberFormat(aPos.Col(), aPos.Row(), aPos.Tab()) % SV_COUNTRY_LANGUAGE_OFFSET == 0) + pCell->SetNeedNumberFormat(true); // Update the cache. p->mnRow = aPos.Row(); @@ -245,6 +250,8 @@ void applyCellFormulas( ScFormulaCell* pCell = new ScFormulaCell(rDoc.getDoc(), aPos, std::move(pCode)); rDoc.setFormulaCell(aPos, pCell); + if (rDoc.getDoc().GetNumberFormat(aPos.Col(), aPos.Row(), aPos.Tab()) % SV_COUNTRY_LANGUAGE_OFFSET == 0) + pCell->SetNeedNumberFormat(true); rCache.store(aPos, pCell); } } |