Kaydet (Commit) 3f525167 authored tarafından Andras Timar's avatar Andras Timar

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
üst 863bed8d
......@@ -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();
......
......@@ -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();
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment