2017-09-09 5 views
1

Existe-t-il un moyen de dire par programme qu'un fichier Microsoft Office est au format Open XML et non l'ancien format binaire pré-Office-97?Y at-il un moyen de dire qu'un fichier Microsoft Office est au format Open XML?

En tant qu'utilisateur final, je modifie généralement l'extension de fichier à .zip et j'essaie d'extraire l'archive. Si elle extrait, alors je sais que c'est un format Open XML. Mais je ne suis même pas sûr que ce soit une méthode infaillible et que les fichiers pour lesquels il ne fonctionne pas ne sont pas des fichiers Open Xml. Je l'ai fait dans Powershell et à partir de la sortie, en raison de la présence de la propriété CustomXmlParts, je suis en mesure de faire un peu deviner qu'il s'agit d'un classeur au format Open XML que je regarde.

PS C:\Users\Sathyaish> $excel = New-Object -ComObject Excel.Application 
PS C:\Users\Sathyaish> $workbook = $excel.Workbooks.Open("C:\Sathyaish\temp\Foo.xlsx") 
PS C:\Users\Sathyaish> $workbook | select C*, F* 


Creator     : 1480803660 
ChangeHistoryDuration : 0 
Charts     : System.__ComObject 
CodeName     : 
CommandBars    : 
Comments     : 
ConflictResolution  : 1 
Container    : 
CreateBackup    : False 
CustomDocumentProperties : System.__ComObject 
CustomViews    : System.__ComObject 
CalculationVersion  : 171027 
ContentTypeProperties : 
Connections    : System.__ComObject 
CheckCompatibility  : False 
CustomXMLParts   : System.__ComObject 
ConnectionsDisabled  : False 
CaseSensitive   : False 
ChartDataPointTrack  : True 
FileFormat    : 51 
FullName     : C:\Sathyaish\temp\Foo.xlsx 
FullNameURLEncoded  : C:\Sathyaish\temp\Foo.xlsx 
Final     : False 
ForceFullCalculation  : False 

Existe-t-il une façon VSTO/VBA de dire la même chose? Peut-être en regardant la valeur de la propriété FileFormat comme indiqué ci-dessus? Quelles sont les valeurs entières valides et leurs significations?

Ou il doit y avoir la possibilité d'essayer de charger le document en utilisant le SDK Open XML et si elle échoue, alors vous savez que ce n'est pas un format de fichier Open XML approprié. Mais cela n'exclut pas d'autres possibilités telles que le fichier n'étant pas du tout un fichier Microsoft Office.

+1

L'une des différences est l'extension du fichier: xls vs xlsx. Un autre format non XML est xlsb (binaire). Le "x" et "m" dans l'extension indique Open XML. Plus de détails à partir de [Microsoft] (https://support.office.com/en-us/article/Open-XML-Formats-and-file-name-extensions-5200D93C-3449-4380-8E11-31EF14555B18) –

Répondre

1

Excel de FileFormat est de type Microsoft.Office.Interop.Excel.XlFileFormat (chaque application Office a sa propre liste de formats)

// 
    // Summary: 
    //  Specifies a type of text format 
    xlCurrentPlatformText = -4158, 
    // 
    // Summary: 
    //  Excel workbook format. 
    xlWorkbookNormal = -4143, 
    // 
    // Summary: 
    //  Symbolic link format. 
    xlSYLK = 2, 
    // 
    // Summary: 
    //  Lotus 1-2-3 format. 
    xlWKS = 4, 
    // 
    // Summary: 
    //  Lotus 1-2-3 format. 
    xlWK1 = 5, 
    // 
    // Summary: 
    //  Comma separated value. 
    xlCSV = 6, 
    // 
    // Summary: 
    //  Dbase 2 format. 
    xlDBF2 = 7, 
    // 
    // Summary: 
    //  Dbase 3 format. 
    xlDBF3 = 8, 
    // 
    // Summary: 
    //  Data Interchange format. 
    xlDIF = 9, 
    // 
    // Summary: 
    //  Dbase 4 format. 
    xlDBF4 = 11, 
    // 
    // Summary: 
    //  Deprecated format. 
    xlWJ2WD1 = 14, 
    // 
    // Summary: 
    //  Lotus 1-2-3 format. 
    xlWK3 = 15, 
    // 
    // Summary: 
    //  Excel version 2.0. 
    xlExcel2 = 16, 
    // 
    // Summary: 
    //  Excel template format. 
    xlTemplate = 17, 
    // 
    // Summary: 
    //  Template 8 
    xlTemplate8 = 17, 
    // 
    // Summary: 
    //  Microsoft Office Excel Add-In. 
    xlAddIn = 18, 
    // 
    // Summary: 
    //  Microsoft Excel 97-2003 Add-In 
    xlAddIn8 = 18, 
    // 
    // Summary: 
    //  Specifies a type of text format. 
    xlTextMac = 19, 
    // 
    // Summary: 
    //  Specifies a type of text format. 
    xlTextWindows = 20, 
    // 
    // Summary: 
    //  Specifies a type of text format. 
    xlTextMSDOS = 21, 
    // 
    // Summary: 
    //  Comma separated value. 
    xlCSVMac = 22, 
    // 
    // Summary: 
    //  Comma separated value. 
    xlCSVWindows = 23, 
    // 
    // Summary: 
    //  Comma separated value. 
    xlCSVMSDOS = 24, 
    // 
    // Summary: 
    //  Deprecated format. 
    xlIntlMacro = 25, 
    // 
    // Summary: 
    //  Microsoft Office Excel Add-In international format. 
    xlIntlAddIn = 26, 
    // 
    // Summary: 
    //  Excel version 2.0 far east. 
    xlExcel2FarEast = 27, 
    // 
    // Summary: 
    //  Microsoft Works 2.0 format 
    xlWorks2FarEast = 28, 
    // 
    // Summary: 
    //  Excel version 3.0. 
    xlExcel3 = 29, 
    // 
    // Summary: 
    //  Lotus 1-2-3 format. 
    xlWK1FMT = 30, 
    // 
    // Summary: 
    //  Lotus 1-2-3 format. 
    xlWK1ALL = 31, 
    // 
    // Summary: 
    //  Lotus 1-2-3 format. 
    xlWK3FM3 = 32, 
    // 
    // Summary: 
    //  Excel version 4.0. 
    xlExcel4 = 33, 
    // 
    // Summary: 
    //  Quattro Pro format. 
    xlWQ1 = 34, 
    // 
    // Summary: 
    //  Excel version 4.0. Workbook format. 
    xlExcel4Workbook = 35, 
    // 
    // Summary: 
    //  Specifies a type of text format. 
    xlTextPrinter = 36, 
    // 
    // Summary: 
    //  Lotus 1-2-3 format. 
    xlWK4 = 38, 
    // 
    // Summary: 
    //  Excel version 5.0. 
    xlExcel5 = 39, 
    // 
    // Summary: 
    //  Excel 95. 
    xlExcel7 = 39, 
    // 
    // Summary: 
    //  Deprecated format. 
    xlWJ3 = 40, 
    // 
    // Summary: 
    //  Deprecated format. 
    xlWJ3FJ3 = 41, 
    // 
    // Summary: 
    //  Specifies a type of text format. 
    xlUnicodeText = 42, 
    // 
    // Summary: 
    //  Excel version 95 and 97. 
    xlExcel9795 = 43, 
    // 
    // Summary: 
    //  Web page format. 
    xlHtml = 44, 
    // 
    // Summary: 
    //  MHT format. 
    xlWebArchive = 45, 
    // 
    // Summary: 
    //  Excel Spreadsheet format. 
    xlXMLSpreadsheet = 46, 
    // 
    // Summary: 
    //  Excel12 
    xlExcel12 = 50, 
    // 
    // Summary: 
    //  Open XML Workbook 
    xlOpenXMLWorkbook = 51, 
    // 
    // Summary: 
    //  Workbook default 
    xlWorkbookDefault = 51, 
    // 
    // Summary: 
    //  Open XML Workbook Macro Enabled 
    xlOpenXMLWorkbookMacroEnabled = 52, 
    // 
    // Summary: 
    //  Open XML Template Macro Enabled 
    xlOpenXMLTemplateMacroEnabled = 53, 
    // 
    // Summary: 
    //  Open XML Template 
    xlOpenXMLTemplate = 54, 
    // 
    // Summary: 
    //  Open XML Add-In 
    xlOpenXMLAddIn = 55, 
    // 
    // Summary: 
    //  Excel8 
    xlExcel8 = 56, 
    // 
    // Summary: 
    //  OpenDocument Spreadsheet 
    xlOpenDocumentSpreadsheet = 60 

Vous devriez être en mesure de lancer cette valeur entière dans un objet XlFileFormat dans PowerShell, mais du haut de ma tête Je ne sais pas exactement comment. Il devrait y avoir une variation sur ce (exemple C#):

Enum.Parse(typeof(Microsoft.Office.Interop.Excel.XlFileFormat), fileFormat)

+0

Oh oui . Je vous remercie. Et la chose de Powershell était juste moi essayant d'éviter de lancer Visual Studio ou même LINQPad. Je n'ai pas à le faire dans Powershell. Très probablement Java mais cela (la langue) n'a pas d'importance. Je n'étais vraiment intéressé que par une API fournie par les assemblées interopérationnelles et votre réponse a atteint son paroxysme. Alors merci. –