2016-08-04 52 views
-1

編集者の覚書:この質問を断念し、バリエーションをhttps://stackoverflow.com/questions/38766898/saving-excel-worksheets-to-pdf-using-powershellに尋ねました。ExcelワークシートのPDFへのエクスポートを自動化

私は以下のPowerShellスクリプトを実装しようとしていますが、何の不運もありません。誰かが助けてくれますか?

私はこのスクリプトが1つのExcelブックごとに1つのPDFファイルを保存することを知っていますが、この作業が完了すると、各ExcelワークシートをエクスポートしてPDFファイルを分割します。 http://blogs.technet.com/b/heyscriptingguy/archive/2010/09/06/save-a-microsoft-excel-workbook-as-a-pdf-file-by-using-powershell.aspx

$path = "c:\fso" 
$xlFixedFormat = "Microsoft.Office.Interop.Excel.xlFixedFormatType" -as [type] 
$excelFiles = Get-ChildItem -Path $path -include *.xls, *.xlsx -recurse 
$objExcel = New-Object -ComObject excel.application 
$objExcel.visible = $false 
foreach($wb in $excelFiles) 
{ 
    $filepath = Join-Path -Path $path -ChildPath ($wb.BaseName + ".pdf") 
    $workbook = $objExcel.workbooks.open($wb.fullname, 3) 
    $workbook.Saved = $true 
    "saving $filepath" 
    $workbook.ExportAsFixedFormat($xlFixedFormat::xlTypePDF, $filepath) 
    $objExcel.Workbooks.close() 
} 
$objExcel.Quit() 

エラーメッセージから

ExportTo-ExcelPDF.ps1:

The property 'Saved' cannot be found on this object. Verify that the 
property exists and can be set. 
At C:\ExportExcel.ps1:23 char:2 
+  $workbook.Saved = $true 
+ ~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [], RuntimeException 
    + FullyQualifiedErrorId : PropertyAssignmentException 

saving C:\ExportExcel.pdf 
Method invocation failed because [System.__ComObject] does not contain a 
method named 'ExportAsFixedFormat'. 
At C:\ExportExcel.ps1:25 char:2 
+  $workbook.ExportAsFixedFormat($xlFixedFormat::xlTypePDF, $filepath) 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [], RuntimeException 
    + FullyQualifiedErrorId : MethodNotFound 

You cannot call a method on a null-valued expression. 
At C:\ExportExcel.ps1:26 char:2 
+  $objExcel.Workbooks.close() 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (:) [], RuntimeException 
    + FullyQualifiedErrorId : InvokeMethodOnNull 

Exception calling "Quit" with "0" argument(s): "Call was rejected by callee.  
(Exception from HRESULT: 0x80010001 (RPC_E_CALL_REJECTED))" 
At C:\ExportExcel.ps1:28 char:1 
+ $objExcel.Quit() 
+ ~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : COMException 
+1

最初のエラーは '$ workbook'がnullで、ファイルを開くことができませんでした。 2番目のエラーは '$ workbook'がブックオブジェクトでないか、あるいは[docs](https://msdn.microsoft.com/en-us/library/office/ff198122(v=office.14).aspx)のようです)*「PDFアドインが現在インストールされていないとエラーが発生します。*」というメッセージが表示されます。 3番目のエラーは、 '$ objExcel'が明らかに' $ null'です。エラーの組み合わせは非常に奇妙に見える - それはすべてのPDFファイルを書くか?どのような環境で実行していますか? (ソフトウェアバージョン、どのようにそれを実行しています)? – TessellatingHeckler

+0

PDFファイルがまったく作成されていません。 Server 2012 R2ホスト/ Powershell 4.0/Office 2016 Pro Plusで実行します。 – Ash

+1

@TessellatingHeckler第1のエラーは、必ずしも '$ workbook'が' $ null'であることを意味するものではなく、 '$ workbook'オブジェクトが表すものが' Saved'プロパティを持たない(Set-StrictMode -Version 2以上)。同様に、2番目のエラーは、単にオブジェクトにExportAsFixedFormatメソッドがないことを示します。特定のパラメータが有効にならないため、PDFプラグインがインストールされているかどうかは問題ではありません。 3番目のエラーは '$ objExcel'が' $ null'であることを意味しません。オブジェクトは存在しますが、他の問題の中でも、期待されたメンバーが(一部)存在しません。 – mklement0

答えて

1

TL; DR

最も可能性の高い原因は、Excelのプライマリ相互運用機能アセンブリではないということですインストールされます。


エラーメッセージは、Excel関連のオブジェクト自体の作成を管理していても、そのメンバー(プロパティとメソッド)へのアクセスに失敗したことを示しています。

ときどき設定すると、$VerbosePreference='Continue'が役に立ちます。

VERBOSE:パイプラインに書き込まれたオブジェクトのタイプ「Microsoft.Office.Interop.Excelのインスタンスである私は、Excelのアプリケーションオブジェクト(New-Object -ComObject excel.application)をインスタンス化するとき、たとえば、私のマシン上で私は、次を参照してください。 ApplicationClass "をコンポーネントの主要な相互運用性アセンブリから削除します。 この型がIDispatchメンバとは異なるメンバを公開する場合、プライマリ相互運用性アセンブリが でない場合、このオブジェクトで動作するように記述されたスクリプトが機能しない可能性があります。

恐らくがあります。欠けている相互運用性アセンブリが問題です。私のマシン(PSV5、エクセル2010)で

、この相互運用アセンブリは、(a)はないを使用すると、Excelアプリケーションオブジェクトをインスタンス化するとき(b)はだけロードされ、デフォルトがロードされます。 Excelアプリケーションオブジェクトが作成され前に、失敗した - - その相互運用機能アセンブリの一部である - それは[Microsoft.Office.Interop.Excel.xlFixedFormatType]を入力し参照するため

このように、あなたのコードは、私のマシン上で動作しないでしょう静かに、間接的理由タイプの参照"Microsoft.Office.Interop.Excel.xlFixedFormatType" -as [type]は、タイプが存在しない場合(まだ)、$nullを返すだけです。

代わりに[Microsoft.Office.Interop.Excel.xlFixedFormatType]を直接使用すると、タイプが存在しないか、そのアセンブリがロードされていない(まだ)場合にエラーが発生します。要するに

  • 削除ライン$xlFixedFormat = "Microsoft.Office.Interop.Excel.xlFixedFormatType" -as [type]

  • 代わりに$xlFixedFormat = [Microsoft.Office.Interop.Excel.xlFixedFormatType]の後にobjExcel = New-Object -ComObject excel.application行の後に置きます。

  • デバッグスクリプトと$objExcel | Get-Member$wb | Get-Memberは、右の最初の$objExcel.workbooks.open($wb.fullname, 3)呼び出し後にメンバーPowerShellが見ることができるか見て実行します。

    • $xlFixedFormat = [Microsoft.Office.Interop.Excel.xlFixedFormatType]ラインはすぐにエラーを生成するか、(...、SavedExportAsFixedFormat)関心のメンバーが表示されない場合は、最も可能性の高い原因は、相互運用機能アセンブリがインストールされていないということです。
    • interopアセンブリがロードされているかどうかを確認するもう1つの方法は、[Microsoft.Office.Interop.Excel.ApplicationClass]を実行し、(エラーメッセージではなく)型情報が返されるかどうかを確認することです。
関連する問題