自动将Excel工作表导出为PDF

时间:2016-08-04 01:43:18

标签: excel powershell

编者注释:OP已放弃此问题并在https://stackoverflow.com/questions/38766898/saving-excel-worksheets-to-pdf-using-powershell处询问变体。

我一直在尝试实现以下PowerShell脚本,但没有任何运气。有人可以帮忙吗?

我知道这个脚本将为每个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

的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}}

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]行立即产生错误,或者您没有看到感兴趣的成员(SavedExportAsFixedFormat,...),则最有可能原因是互操作组件没有安装。
    • 另一种查看是否加载了互操作程序集的方法是执行[Microsoft.Office.Interop.Excel.ApplicationClass]并查看是否返回了类型信息(而不是错误消息)。