【问题标题】:Automate exporting of Excel worksheets to PDF自动将 Excel 工作表导出为 PDF
【发布时间】:2016-12-09 23:27:47
【问题描述】:

编者注:OP 已经放弃了这个问题,并在https://stackoverflow.com/questions/38766898/saving-excel-worksheets-to-pdf-using-powershell 提出了一个变体。

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

我知道这个脚本会为每个 Excel 工作簿保存 1 个 PDF 文件,但是一旦我得到这个工作,我会考虑将每个 Excel 工作表导出为单独的 PDF 文件。

ExportTo-ExcelPDF.ps1 from 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

【问题讨论】:

  • 第一个错误看起来$workbook为空,打开文件失败。第二个错误看起来像$workbook 不是工作簿对象,或者docs 说“如果当前未安装 PDF 插件会发生错误。”意味着会发生这种情况吗?第三个错误是$objExcel 显然是$null。错误的组合看起来很奇怪——它会写任何 PDF 文件吗?你在什么样的环境下运行它? (软件版本,你是怎么运行的)?
  • 根本不创建 PDF 文件。在 Server 2012 R2 主机/Powershell 4.0/Office 2016 Pro Plus 上运行。
  • @TessellatingHeckler 第一个错误并不一定意味着$workbook$null - 只有$workbook 表示的任何对象都没有Saved 属性(假设Set-StrictMode -Version 2 或更高)。同样,第二个错误只是表明该对象没有方法ExportAsFixedFormat - 具体参数不起作用,因此是否安装了PDF插件并不重要(还)。第三个错误绝对暗示$objExcel$null。对象存在,但(一些)没有预期的成员,以及其他问题。
  • 感谢您的帮助。我回到绘图板上,离所需的结果更近了一点。新问题的新帖子:stackoverflow.com/questions/38766898/…
  • @mklement0 "第三个错误绝对不意味着 $objExcel 是 $null。" - 它也是。根据您更深入的知识,可能是错误的,但之前我们看到:$excel.workbooks.open() 是有效的,因此 .workbooks 是一个好的 $objExcel 对象的有效属性。错误说$excel.workbooksa null valued expression,而不是__ does not contain a property named 'workbooks'$objExcel.x.y() 的行为与 $null.x.y() 相同意味着 $objExcel 为空。至少一点点。

标签: excel powershell


【解决方案1】:

tl;dr

最可能的原因是未安装 Excel 的主要互操作程序集。


错误消息表明,即使您自己管理创建与 Excel 相关的对象,访问它们的成员(属性和方法)也失败了。

有时,设置$VerbosePreference='Continue' 会有所帮助;例如,在我的机器上,当我实例化 Excel 应用程序对象 (New-Object -ComObject excel.application) 时,我看到以下内容:

详细:写入管道的对象是来自组件的主要互操作性程序集的“Microsoft.Office.Interop.Excel.ApplicationClass”类型的实例。如果 此类型公开与 IDispatch 成员不同的成员,如果主互操作性程序集不是,则为使用此对象而编写的脚本可能无法工作 已安装。

也许缺少互操作性程序集是您的问题。

在我的机器(PSv5、Excel 2010)上,此互操作性程序集 (a) 加载默认情况下,(b) 仅在您加载时实例化 Excel 应用程序对象

因此,您的代码无法在我的机器上运行,因为它引用了类型 [Microsoft.Office.Interop.Excel.xlFixedFormatType] - 这是该互操作程序集的一部分 - Excel 应用程序对象被创建之前,它会失败 - 静默, 因为 indirect 类型引用 "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.workbooks.open($wb.fullname, 3) 后立即运行$objExcel | Get-Member$wb | Get-Member 以查看PowerShell 可以看到的成员。

    • 如果$xlFixedFormat = [Microsoft.Office.Interop.Excel.xlFixedFormatType] 行立即产生错误,或者您没有看到感兴趣的成员(SavedExportAsFixedFormat,...),最可能的原因是互操作程序集没有t 已安装。
    • 查看是否已加载互操作程序集的另一种方法是执行 [Microsoft.Office.Interop.Excel.ApplicationClass] 并查看是否返回类型信息(而不是错误消息)。

【讨论】:

    猜你喜欢
    • 2016-08-04
    • 2021-04-22
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多