sc/qa/unit/data/xls/external-ref.xls |binary sc/qa/unit/subsequent_export-test.cxx | 22 ++++++++++++++++++++++ sc/source/filter/excel/xehelper.cxx | 10 ++++++++++ sc/source/filter/inc/xllink.hxx | 2 +- 4 files changed, 33 insertions(+), 1 deletion(-)
New commits: commit 3f5251675eeeeae56ea282fdeb09dbc53ce4aae6 Author: Andras Timar <andras.ti...@collabora.com> Date: Sat Oct 25 21:47:55 2014 +0200 bnc#893791 XLS export: external sheet references on Linux/OSX The commit solves two problems. 1. Make sure we save absolute paths on Linux/OSX 2. Make sure we don't save invalid XLS (VirtualPath longer than 255 chars) The first problem has always been there, so after a few load/save cycles an XLS with reference to other XLS on a Unix-like file system became invalid, and only LibreOffice could open it, Excel could not. These broken XLS files can be repaired by saving after this patch, however, the original reference will remain broken. Change-Id: I8f575acb1d560d539c1da61a1afdaac3f0c13977 diff --git a/sc/qa/unit/data/xls/external-ref.xls b/sc/qa/unit/data/xls/external-ref.xls new file mode 100644 index 0000000..21f3338 Binary files /dev/null and b/sc/qa/unit/data/xls/external-ref.xls differ diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx index 988ed34..ef3e8dc 100644 --- a/sc/qa/unit/subsequent_export-test.cxx +++ b/sc/qa/unit/subsequent_export-test.cxx @@ -125,6 +125,8 @@ public: void testPivotTableXLSX(); void testPivotTableTwoDataFieldsXLSX(); + void testSupBookVirtualPath(); + CPPUNIT_TEST_SUITE(ScExportTest); CPPUNIT_TEST(test); #if !defined(MACOSX) && !defined(DRAGONFLY) @@ -164,6 +166,9 @@ public: CPPUNIT_TEST(testPivotTableXLSX); CPPUNIT_TEST(testPivotTableTwoDataFieldsXLSX); CPPUNIT_TEST(testFunctionsExcel2010ODS); +#if !defined(WNT) + CPPUNIT_TEST(testSupBookVirtualPath); +#endif CPPUNIT_TEST_SUITE_END(); @@ -2272,6 +2277,23 @@ void ScExportTest::tearDown() test::BootstrapFixture::tearDown(); } +void ScExportTest::testSupBookVirtualPath() +{ + ScDocShellRef xShell = loadDoc("external-ref.", XLS); + CPPUNIT_ASSERT(xShell.Is()); + + ScDocShellRef xDocSh = saveAndReload(xShell, XLS); + xShell->DoClose(); + CPPUNIT_ASSERT(xDocSh.Is()); + + ScDocument& rDoc = xDocSh->GetDocument(); + + if (!checkFormula(rDoc, ScAddress(0,0,0), "'file:///home/timar/Documents/external.xls'#$Sheet1.A1")) + CPPUNIT_FAIL("Wrong SupBook VirtualPath URL"); + + xDocSh->DoClose(); +} + CPPUNIT_TEST_SUITE_REGISTRATION(ScExportTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sc/source/filter/excel/xehelper.cxx b/sc/source/filter/excel/xehelper.cxx index 79da723..f58d192 100644 --- a/sc/source/filter/excel/xehelper.cxx +++ b/sc/source/filter/excel/xehelper.cxx @@ -908,6 +908,11 @@ OUString lclEncodeDosUrl( aBuf.append(EXC_URL_DOSDRIVE).append(cDrive); aOldUrl = aOldUrl.copy(3); } + else + { + // URL probably points to a document on a Unix-like file system + aBuf.append(EXC_URL_DRIVEROOT); + } // directories sal_Int32 nPos = -1; @@ -949,6 +954,11 @@ OUString lclEncodeDosUrl( if (pTableName) aBuf.append(*pTableName); + // VirtualPath must be shorter than 255 chars ([MS-XLS].pdf 2.5.277) + // It's better to truncate, than generate invalid file that Excel cannot open. + if (aBuf.getLength() > 255) + aBuf.setLength(255); + return aBuf.makeStringAndClear(); } commit 863bed8dd4414e995eb59e868edc4ac94a085b34 Author: Andras Timar <andras.ti...@collabora.com> Date: Sat Oct 25 17:25:08 2014 +0200 typo: uesd -> used Change-Id: I827f9a0889aca4a55586cdd2baa21846b1bc155b diff --git a/sc/source/filter/inc/xllink.hxx b/sc/source/filter/inc/xllink.hxx index 1eccffb..08cbb27 100644 --- a/sc/source/filter/inc/xllink.hxx +++ b/sc/source/filter/inc/xllink.hxx @@ -76,7 +76,7 @@ enum XclSupbookType EXC_SBTYPE_EXTERN, /// SUPBOOK is used for external references. EXC_SBTYPE_ADDIN, /// SUPBOOK contains add-in functions. EXC_SBTYPE_SPECIAL, /// SUPBOOK is used for DDE or OLE links. - EXC_SBTYPE_EUROTOOL /// SUPBOOK is uesd for EUROCONVERT. + EXC_SBTYPE_EUROTOOL /// SUPBOOK is used for EUROCONVERT. }; #endif _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits