2016-08-04 110 views
-1

編者按::OP已放棄此問題並要求在https://stackoverflow.com/questions/38766898/saving-excel-worksheets-to-pdf-using-powershell處作出變更。將Excel工作表自動導出爲PDF

我一直在試圖實現下面的PowerShell腳本,但沒有任何運氣。有人可以幫忙嗎?

我知道這個腳本將爲每個Excel工作簿保存1個PDF文件,但是一旦我得到這個工作,我會看看導出每個Excel工作表來分離PDF文件。

ExportTo-ExcelPDF.ps1從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() 

錯誤消息:

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'爲空,並打開文件失敗。第二個錯誤看起來像'$ workbook'不是工作簿對象,或者可能是[docs](https://msdn.microsoft.com/en-us/library/office/ff198122(v = office.14).aspx )說「*如果PDF加載項當前沒有安裝,將會發生錯誤。*」意味着會發生?第三個錯誤是'$ objExcel'顯然是'$ null'。錯誤的組合看起來很奇怪 - 它是否編寫任何PDF文件?你在運行什麼樣的環境? (軟件版本,你如何運行它)? – TessellatingHeckler

+0

根本沒有創建PDF文件。在Server 2012 R2主機/ Powershell 4.0/Office 2016 Pro Plus上運行。 – Ash

+1

@TessellatingHeckler第一個錯誤並不一定意味着'$ workbook'是'$ null' - 只要$'workbook'表示的任何對象都沒有'Saved'屬性(假設'Set-StrictMode -Version 2'或更高)。同樣,第二個錯誤只是表示該對象沒有方法'ExportAsFixedFormat' - 特定參數不起作用,所以PDF插件是否安裝並不重要(尚)。第三個錯誤絕對是_not_暗示'$ objExcel'是'$ null'。這些對象存在,但(有些)沒有預期的成員,還有其他問題。 – mklement0

回答

1

TL;博士

最可能的原因是,Excel的主互裝配不安裝。


錯誤消息表明,即使您管理創建與Excel相關的對象本身,訪問其成員(屬性和方法)失敗。

有時,設置$VerbosePreference='Continue'有幫助;例如,我的機器上我看到下面的時候我實例Excel應用程序對象(New-Object -ComObject excel.application):

VERBOSE:寫入管道的對象類型「的Microsoft.Office.Interop.Excel的實例。 ApplicationClass「從組件的主要互操作性程序集中移除。如果 這種類型公開比IDispatch的成員有不同的成員,如果主互操作性程序集是不安裝 被寫入與該對象的工作腳本可能無法正常工作。

或許缺少互操作性程序集是您的問題。

在我的機器(PSv5,Excel 2010中),這種互操作性組件(一)默認加載,(B)僅加載當實例Excel應用程序對象

因此,您的代碼將不會在我的機器上工作,因爲它引用類型[Microsoft.Office.Interop.Excel.xlFixedFormatType] - 這是互操作程序集的一部分 - 創建Excel應用程序對象,其失敗 - 默默的,因爲間接類型參考"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,...),最可能的原因是,互操作程序集未安裝。
    • 查看互操作程序集是否已加載的另一種方法是執行[Microsoft.Office.Interop.Excel.ApplicationClass]並查看是否返回了類型信息(與錯誤消息相反)。