编者注释:OP已放弃此问题并在https://stackoverflow.com/questions/38766898/saving-excel-worksheets-to-pdf-using-powershell处询问变体。
我一直在尝试实现以下PowerShell脚本,但没有任何运气。有人可以帮忙吗?
我知道这个脚本将为每个Excel工作簿保存1个PDF文件,但是一旦我开始工作,我将看看将每个Excel工作表导出为单独的PDF文件。
的ExportTo-ExcelPDF.ps1The 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}}
答案 0 :(得分:1)
<强> TL;博士强>
最可能的原因是Excel的主要互操作程序集未安装。
错误消息表明即使您管理创建与Excel相关的对象本身,访问其成员(属性和方法)也失败。
有时,设置$VerbosePreference='Continue'
会有所帮助;例如,在我的机器上,当我实例化Excel应用程序对象(New-Object -ComObject excel.application
)时,我看到以下内容:
VERBOSE:写入管道的对象是类型&#34; Microsoft.Office.Interop.Excel.ApplicationClass&#34;的实例。来自组件的主要互操作性程序集。如果 此类型公开不同于IDispatch成员的成员,如果主要的互操作性程序集不是,则编写为使用此对象的脚本可能不起作用 安装。
或许缺少互操作性程序集是您的问题。
在我的机器上(PSv5,Excel 2010),此互操作性程序集是(a)默认情况下 ,仅在您加载时实例化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]
行立即产生错误,或者您没有看到感兴趣的成员(Saved
,ExportAsFixedFormat
,...),则最有可能原因是互操作组件没有安装。[Microsoft.Office.Interop.Excel.ApplicationClass]
并查看是否返回了类型信息(而不是错误消息)。