diff options
9 files changed, 45 insertions, 9 deletions
diff --git a/filter/source/config/fragments/types/calc_MS_Excel_40.xcu b/filter/source/config/fragments/types/calc_MS_Excel_40.xcu index 939a0a4025ad..b45c21fa33bd 100644 --- a/filter/source/config/fragments/types/calc_MS_Excel_40.xcu +++ b/filter/source/config/fragments/types/calc_MS_Excel_40.xcu @@ -1,5 +1,5 @@ <node oor:name="calc_MS_Excel_40" oor:op="replace" > - <prop oor:name="DetectService"><value>com.sun.star.comp.oox.xls.BiffDetector</value></prop> + <prop oor:name="DetectService"><value>com.sun.star.comp.calc.FormatDetector</value></prop> <prop oor:name="URLPattern"/> <prop oor:name="Extensions"><value>xls xlw xlc xlm</value></prop> <prop oor:name="MediaType"><value>application/vnd.ms-excel</value></prop> diff --git a/filter/source/config/fragments/types/calc_MS_Excel_40_VorlageTemplate.xcu b/filter/source/config/fragments/types/calc_MS_Excel_40_VorlageTemplate.xcu index 291382df43b6..42bb10ed09c8 100644 --- a/filter/source/config/fragments/types/calc_MS_Excel_40_VorlageTemplate.xcu +++ b/filter/source/config/fragments/types/calc_MS_Excel_40_VorlageTemplate.xcu @@ -1,5 +1,5 @@ <node oor:name="calc_MS_Excel_40_VorlageTemplate" oor:op="replace" > - <prop oor:name="DetectService"><value>com.sun.star.comp.oox.xls.BiffDetector</value></prop> + <prop oor:name="DetectService"><value>com.sun.star.comp.calc.FormatDetector</value></prop> <prop oor:name="URLPattern"/> <prop oor:name="Extensions"><value>xlt</value></prop> <prop oor:name="MediaType"><value>application/vnd.ms-excel</value></prop> diff --git a/filter/source/config/fragments/types/calc_MS_Excel_5095.xcu b/filter/source/config/fragments/types/calc_MS_Excel_5095.xcu index 5656b73f57dd..3f450f0cb85f 100644 --- a/filter/source/config/fragments/types/calc_MS_Excel_5095.xcu +++ b/filter/source/config/fragments/types/calc_MS_Excel_5095.xcu @@ -1,5 +1,5 @@ <node oor:name="calc_MS_Excel_5095" oor:op="replace" > - <prop oor:name="DetectService"><value>com.sun.star.comp.oox.xls.BiffDetector</value></prop> + <prop oor:name="DetectService"><value>com.sun.star.comp.calc.FormatDetector</value></prop> <prop oor:name="URLPattern"/> <prop oor:name="Extensions"><value>xls xlc xlm xlw</value></prop> <prop oor:name="MediaType"><value>application/vnd.ms-excel</value></prop> diff --git a/filter/source/config/fragments/types/calc_MS_Excel_5095_VorlageTemplate.xcu b/filter/source/config/fragments/types/calc_MS_Excel_5095_VorlageTemplate.xcu index 9c1799dfe405..8dbb02c0170e 100644 --- a/filter/source/config/fragments/types/calc_MS_Excel_5095_VorlageTemplate.xcu +++ b/filter/source/config/fragments/types/calc_MS_Excel_5095_VorlageTemplate.xcu @@ -1,5 +1,5 @@ <node oor:name="calc_MS_Excel_5095_VorlageTemplate" oor:op="replace" > - <prop oor:name="DetectService"><value>com.sun.star.comp.oox.xls.BiffDetector</value></prop> + <prop oor:name="DetectService"><value>com.sun.star.comp.calc.FormatDetector</value></prop> <prop oor:name="URLPattern"/> <prop oor:name="Extensions"><value>xlt</value></prop> <prop oor:name="MediaType"><value>application/vnd.ms-excel</value></prop> diff --git a/filter/source/config/fragments/types/calc_MS_Excel_95.xcu b/filter/source/config/fragments/types/calc_MS_Excel_95.xcu index 8e02ea8f088d..0ea10dddc31e 100644 --- a/filter/source/config/fragments/types/calc_MS_Excel_95.xcu +++ b/filter/source/config/fragments/types/calc_MS_Excel_95.xcu @@ -1,5 +1,5 @@ <node oor:name="calc_MS_Excel_95" oor:op="replace" > - <prop oor:name="DetectService"><value>com.sun.star.comp.oox.xls.BiffDetector</value></prop> + <prop oor:name="DetectService"><value>com.sun.star.comp.calc.FormatDetector</value></prop> <prop oor:name="URLPattern"/> <prop oor:name="Extensions"><value>xls xlc xlm xlw</value></prop> <prop oor:name="MediaType"><value>application/vnd.ms-excel</value></prop> diff --git a/filter/source/config/fragments/types/calc_MS_Excel_95_VorlageTemplate.xcu b/filter/source/config/fragments/types/calc_MS_Excel_95_VorlageTemplate.xcu index bc80367624f3..fb3e41014f85 100644 --- a/filter/source/config/fragments/types/calc_MS_Excel_95_VorlageTemplate.xcu +++ b/filter/source/config/fragments/types/calc_MS_Excel_95_VorlageTemplate.xcu @@ -1,5 +1,5 @@ <node oor:name="calc_MS_Excel_95_VorlageTemplate" oor:op="replace" > - <prop oor:name="DetectService"><value>com.sun.star.comp.oox.xls.BiffDetector</value></prop> + <prop oor:name="DetectService"><value>com.sun.star.comp.calc.FormatDetector</value></prop> <prop oor:name="URLPattern"/> <prop oor:name="Extensions"><value>xlt</value></prop> <prop oor:name="MediaType"><value>application/vnd.ms-excel</value></prop> diff --git a/filter/source/config/fragments/types/calc_MS_Excel_97.xcu b/filter/source/config/fragments/types/calc_MS_Excel_97.xcu index 0f7b643763c9..bb232c313ad4 100644 --- a/filter/source/config/fragments/types/calc_MS_Excel_97.xcu +++ b/filter/source/config/fragments/types/calc_MS_Excel_97.xcu @@ -1,5 +1,5 @@ <node oor:name="calc_MS_Excel_97" oor:op="replace" > - <prop oor:name="DetectService"><value>com.sun.star.comp.oox.xls.BiffDetector</value></prop> + <prop oor:name="DetectService"><value>com.sun.star.comp.calc.FormatDetector</value></prop> <prop oor:name="URLPattern"/> <prop oor:name="Extensions"><value>xls xlc xlm xlw xlk</value></prop> <prop oor:name="MediaType"><value>application/vnd.ms-excel</value></prop> diff --git a/filter/source/config/fragments/types/calc_MS_Excel_97_VorlageTemplate.xcu b/filter/source/config/fragments/types/calc_MS_Excel_97_VorlageTemplate.xcu index ff390ce3d376..26f4bca3a725 100644 --- a/filter/source/config/fragments/types/calc_MS_Excel_97_VorlageTemplate.xcu +++ b/filter/source/config/fragments/types/calc_MS_Excel_97_VorlageTemplate.xcu @@ -1,5 +1,5 @@ <node oor:name="calc_MS_Excel_97_VorlageTemplate" oor:op="replace" > - <prop oor:name="DetectService"><value>com.sun.star.comp.oox.xls.BiffDetector</value></prop> + <prop oor:name="DetectService"><value>com.sun.star.comp.calc.FormatDetector</value></prop> <prop oor:name="URLPattern"/> <prop oor:name="Extensions"><value>xlt</value></prop> <prop oor:name="MediaType"><value>application/vnd.ms-excel</value></prop> diff --git a/sc/source/ui/unoobj/scdetect.cxx b/sc/source/ui/unoobj/scdetect.cxx index 1132a767157d..1fe317cbefdf 100644 --- a/sc/source/ui/unoobj/scdetect.cxx +++ b/sc/source/ui/unoobj/scdetect.cxx @@ -117,6 +117,7 @@ static const sal_Char pFilterExcel95[] = "MS Excel 95"; static const sal_Char pFilterEx95Temp[] = "MS Excel 95 Vorlage/Template"; static const sal_Char pFilterExcel97[] = "MS Excel 97"; static const sal_Char pFilterEx97Temp[] = "MS Excel 97 Vorlage/Template"; +static const sal_Char __FAR_DATA pFilterExcelXML[] = "MS Excel 2003 XML"; static const sal_Char pFilter2003XML[] = "MS Excel 2003 XML"; static const sal_Char pFilterDBase[] = "dBase"; static const sal_Char pFilterDif[] = "DIF"; @@ -160,6 +161,35 @@ static sal_Bool lcl_MayBeAscii( SvStream& rStream ) return nMask != 0; } +static const SfxFilter* lcl_DetectExcelXML( SvStream& rStream, SfxFilterMatcher& rMatcher ) +{ + const SfxFilter* pFound = NULL; + rStream.Seek(STREAM_SEEK_TO_BEGIN); + + const size_t nBufSize = 4000; + sal_uInt8 aBuffer[ nBufSize ]; + sal_uLong nBytesRead = rStream.Read( aBuffer, nBufSize ); + sal_uLong nXMLStart = 0; + + // Skip UTF-8 BOM if present. + // No need to handle UTF-16 etc (also rejected in XMLFilterDetect). + if ( nBytesRead >= 3 && aBuffer[0] == 0xEF && aBuffer[1] == 0xBB && aBuffer[2] == 0xBF ) + nXMLStart = 3; + + if ( nBytesRead >= nXMLStart + 5 && rtl_compareMemory( aBuffer+nXMLStart, "<?xml", 5 ) == 0 ) + { + // Be consistent with XMLFilterDetect service: Check for presence of "Workbook" in XML file. + + rtl::OString aTryStr( "Workbook" ); + rtl::OString aFileString(reinterpret_cast<const sal_Char*>(aBuffer), nBytesRead); + + if (aFileString.indexOf(aTryStr) >= 0) + pFound = rMatcher.GetFilter4FilterName( String::CreateFromAscii(pFilterExcelXML) ); + } + + return pFound; +} + static sal_Bool lcl_MayBeDBase( SvStream& rStream ) { // Look for dbf marker, see connectivity/source/inc/dbase/DTable.hxx @@ -734,7 +764,13 @@ static sal_Bool lcl_MayBeDBase( SvStream& rStream ) if( aHeader.CompareTo( "<?xml", 5 ) == COMPARE_EQUAL ) pFilter = aMatcher.GetFilter4FilterName( String::CreateFromAscii(pFilter2003XML) ); else - pFilter = aMatcher.GetFilter4FilterName( String::CreateFromAscii(pFilterAscii) ); + { + // Detect Excel 2003 XML here only if XLS was preselected. + // The configured detection for Excel 2003 XML is still in XMLFilterDetect. + pFilter = lcl_DetectExcelXML( rStr, aMatcher ); + if (!pFilter) + pFilter = aMatcher.GetFilter4FilterName( String::CreateFromAscii(pFilterAscii) ); + } bFakeXLS = true; } else if ( pPreselectedFilter->GetName().EqualsAscii(pFilterDBase) && lcl_MayBeDBase( rStr ) ) |