sc/qa/unit/data/xls/tdf144732.xls |binary sc/qa/unit/subsequent_filters-test2.cxx | 103 ++++++++++++++++++++++++++++++++ sc/source/filter/excel/impop.cxx | 6 - 3 files changed, 105 insertions(+), 4 deletions(-)
New commits: commit a3010249f185b8d2b7ade2cbf10600255bb935fb Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Mon Sep 27 17:05:25 2021 +0200 Commit: Michael Stahl <michael.st...@allotropia.de> CommitDate: Tue Sep 28 14:12:53 2021 +0200 tdf#144732: treat invalid subtype value as worksheet Commit 9bdb1d2473510067da1ac74013595b661ac37800 for i51490 had introduced the same change for Bof2, Bof3, Bof4. Change-Id: I478a8611874d70fad0c83700efed5ea882d5f69f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122650 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122758 Reviewed-by: Michael Stahl <michael.st...@allotropia.de> diff --git a/sc/qa/unit/data/xls/tdf144732.xls b/sc/qa/unit/data/xls/tdf144732.xls new file mode 100644 index 000000000000..04f3cc0d12bf Binary files /dev/null and b/sc/qa/unit/data/xls/tdf144732.xls differ diff --git a/sc/qa/unit/subsequent_filters-test2.cxx b/sc/qa/unit/subsequent_filters-test2.cxx index 4b4995f9147c..9c15eebfff0a 100644 --- a/sc/qa/unit/subsequent_filters-test2.cxx +++ b/sc/qa/unit/subsequent_filters-test2.cxx @@ -206,6 +206,7 @@ public: void testTdf129940(); void testTdf139763ShapeAnchor(); void testAutofilterNamedRangesXLSX(); + void testInvalidBareBiff5(); CPPUNIT_TEST_SUITE(ScFiltersTest2); @@ -311,6 +312,7 @@ public: CPPUNIT_TEST(testTdf129940); CPPUNIT_TEST(testTdf139763ShapeAnchor); CPPUNIT_TEST(testAutofilterNamedRangesXLSX); + CPPUNIT_TEST(testInvalidBareBiff5); CPPUNIT_TEST_SUITE_END(); @@ -2875,6 +2877,107 @@ void ScFiltersTest2::testAutofilterNamedRangesXLSX() xDocSh->DoClose(); } +void ScFiltersTest2::testInvalidBareBiff5() +{ + ScDocShellRef xDocSh = loadDoc(u"tdf144732.", FORMAT_XLS); + CPPUNIT_ASSERT(xDocSh.is()); + ScDocument& rDoc = xDocSh->GetDocument(); + rDoc.CalcAll(); + + // Check that we import the contents from such file, as Excel does + CPPUNIT_ASSERT_EQUAL(SCTAB(1), rDoc.GetTableCount()); + + // Row 1 + ScAddress aPos(0, 0, 0); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_VALUE, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(1.0, rDoc.GetValue(aPos)); + aPos.IncCol(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_VALUE, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(2.0, rDoc.GetValue(aPos)); + aPos.IncCol(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_VALUE, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(3.0, rDoc.GetValue(aPos)); + aPos.IncCol(); + CPPUNIT_ASSERT_EQUAL(OUString(), rDoc.GetString(aPos)); + + // Row 2 + aPos = ScAddress(0, 1, 0); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_FORMULA, rDoc.GetCellType(aPos)); + OUString sFormula; + rDoc.GetFormula(aPos.Col(), aPos.Row(), aPos.Tab(), sFormula); + CPPUNIT_ASSERT_EQUAL(OUString("=TRUE()"), sFormula); + CPPUNIT_ASSERT_EQUAL(1.0, rDoc.GetValue(aPos)); + aPos.IncCol(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_FORMULA, rDoc.GetCellType(aPos)); + rDoc.GetFormula(aPos.Col(), aPos.Row(), aPos.Tab(), sFormula); + CPPUNIT_ASSERT_EQUAL(OUString("=FALSE()"), sFormula); + CPPUNIT_ASSERT_EQUAL(0.0, rDoc.GetValue(aPos)); + aPos.IncCol(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(OUString(), rDoc.GetString(aPos)); + aPos.IncCol(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(OUString(u"sheetjs"), rDoc.GetString(aPos)); + + // Row 3 + aPos = ScAddress(0, 2, 0); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(OUString(u"foo bar"), rDoc.GetString(aPos)); + aPos.IncCol(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(OUString(u"baz"), rDoc.GetString(aPos)); + aPos.IncCol(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_VALUE, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(41689.4375, rDoc.GetValue(aPos)); + aPos.IncCol(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(OUString(u"0.3"), rDoc.GetString(aPos)); + + // Row 4 + aPos = ScAddress(0, 3, 0); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(OUString(u"baz"), rDoc.GetString(aPos)); + aPos.IncCol(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(OUString(), rDoc.GetString(aPos)); + aPos.IncCol(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(OUString(u"_"), rDoc.GetString(aPos)); + aPos.IncCol(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_VALUE, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(3.14159, rDoc.GetValue(aPos)); + + // Row 5 + aPos = ScAddress(0, 4, 0); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(OUString(u"hidden"), rDoc.GetString(aPos)); + aPos.IncCol(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(OUString(), rDoc.GetString(aPos)); + aPos.IncCol(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(OUString(), rDoc.GetString(aPos)); + aPos.IncCol(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(OUString(), rDoc.GetString(aPos)); + + // Row 6 + aPos = ScAddress(0, 5, 0); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_STRING, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(OUString(u"visible"), rDoc.GetString(aPos)); + aPos.IncCol(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(OUString(), rDoc.GetString(aPos)); + aPos.IncCol(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(OUString(), rDoc.GetString(aPos)); + aPos.IncCol(); + CPPUNIT_ASSERT_EQUAL(CELLTYPE_NONE, rDoc.GetCellType(aPos)); + CPPUNIT_ASSERT_EQUAL(OUString(), rDoc.GetString(aPos)); + + xDocSh->DoClose(); +} + CPPUNIT_TEST_SUITE_REGISTRATION(ScFiltersTest2); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sc/source/filter/excel/impop.cxx b/sc/source/filter/excel/impop.cxx index 988ec3fbf65e..bc3571973fc5 100644 --- a/sc/source/filter/excel/impop.cxx +++ b/sc/source/filter/excel/impop.cxx @@ -1209,12 +1209,10 @@ void ImportExcel::Bof5() { case 0x0005: eDatei = Biff5W; break; // workbook globals case 0x0006: eDatei = Biff5V; break; // VB module - case 0x0010: eDatei = Biff5; break; // worksheet case 0x0020: eDatei = Biff5C; break; // chart case 0x0040: eDatei = Biff5M4; break; // macro sheet - default: - pExcRoot->eDateiTyp = BiffX; - return; + case 0x0010: // worksheet + default: eDatei = Biff5; break; // tdf#144732 Excel interprets invalid indexes as worksheet } if( nVers == 0x0600 && (GetBiff() == EXC_BIFF8) )