Hi,
if you tried to save a word or excel document as another format you got an error. For example, if you want to convert a CSV File to a Excel workbook and save it in Excel 95/97/2003 format.
[reflection.assembly]::LoadWithPartialName("Microsoft.Office.InterOp.Excel") $oExcel = New-Object -ComObject "Excel.Application" $sCSVFile="D:\temp\ImportFile.csv" $oExcel.Visible = $true $oCSVWorkbook=$oExcel.Workbooks.Add() $oExcel.Workbooks.OpenText($sCSVFile) $oCSVWorkbook.SaveAs("D:\temp\test.xls",[Microsoft.Office.Interop.Excel.XlFileFormat]::xlExcel9795) Exception calling "SaveAs" with "1" argument(s): "SaveAs method of Workbook class failed" At D:\test\CSV2Excel.ps1:29 char:20 + $xl_workbook.SaveAs <<<< ("D:\Temp\test.xls") + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : ComMethodTargetInvocation
This error occurs because since Excel 2007 the SaveAs Methode does not support all file formats defined in [Microsoft.Office.Interop.Excel.XlFileFormat]. These formats should work:
xlOpenXMLWorkbook
xlOpenXMLWorkbookMacroEnabled
xlExcel12 – Excel 2007
xlExcel8 – Excel 95/97/2003
Use these paremeters to save your Excel file compatible for Office 95/2003:
$oCSVWorkbook.SaveAs("D:\temp\test.xls",[Microsoft.Office.Interop.Excel.XlFileFormat]::xlExcel8)
This quick and dirty hack opens a new Excel Workbook, tries to save it in all formats enumerted by XlFileFormat and lists all types where no error occurs.
$oExcel = New-Object -ComObject "Excel.Application" [reflection.assembly]::LoadWithPartialName("Microsoft.Office.InterOp.Excel") $oExcel.DisplayAlerts=$false $oExcel.Visible = $true $oCSVWorkbook=$oExcel.Workbooks.Add() $oSupportedFileTypes=@() foreach($oFileType in ([System.Enum]::GetValues([Microsoft.Office.Interop.Excel.XlFileFormat]))){ Remove-Item -Path "D:\temp\test.xls" -Force -ErrorAction SilentlyContinue -WarningAction SilentlyContinue |Out-Null try { $oCSVWorkbook.SaveAs("D:\temp\test.xls",$oFileType)|Out-Null -ErrorAction SilentlyContinue -WarningAction SilentlyContinue $oSupportedFileTypes+=$oFileType } catch{ Write-Host $oFileType.ToString() not supported } } Write-Host -ForegroundColor Green "Supported Filetypes:" $oSupportedFileTypes $oCSVWorkbook.Close() $oExcel.Quit() Start-Sleep 1 [System.Runtime.InteropServices.Marshal]::ReleaseComObject($oExcel)|out-null $oExcel=$null
And the same for Word
$oWord = New-Object -ComObject "Word.Application" [reflection.assembly]::LoadWithPartialName("Microsoft.Office.InterOp.Word") $oWord.DisplayAlerts=[Microsoft.Office.InterOp.Word.WdAlertLevel]::wdAlertsNone $oWord.Visible = $true $oDocument=$oWord.Documents.Add() $oSupportedFileTypes=@() foreach($oFileType in ([System.Enum]::GetValues([Microsoft.Office.Interop.Word.WdSaveFormat]))){ Remove-Item -Path "D:\temp\test.doc" -Force -ErrorAction SilentlyContinue -WarningAction SilentlyContinue |Out-Null try { $oDocument.SaveAs2(([ref]"D:\temp\test.doc"),([ref]$oFileType))|Out-Null -ErrorAction SilentlyContinue -WarningAction SilentlyContinue $oSupportedFileTypes+=$oFileType } catch{ Write-Host $oFileType.ToString() not supported } } Write-Host -ForegroundColor Green "Supported Filetypes:" $oSupportedFileTypes $oDocument.Close() $oWord.Quit() Start-Sleep 1 [System.Runtime.InteropServices.Marshal]::ReleaseComObject($oWord)|out-null $oWord=$null
Enjoy
Michael
One thought on “Powershell: Error while calling the SaveAs Method of some Office Applications”