2016-08-04 5 views
-1

Примечание редактора: ОП отказался от этого вопроса и задал вариант на https://stackoverflow.com/questions/38766898/saving-excel-worksheets-to-pdf-using-powershell.Автоматизация экспорта таблиц Excel в PDF

Я пытался реализовать следующий сценарий PowerShell, но без везения. Кто-то может помочь?

Я знаю, что этот скрипт сохранит 1 файл PDF на книгу Excel, однако, как только я получу эту работу, я посмотрю на экспорт каждого листа 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 не создаются вообще. Работа на сервере 2012 R2 хост/Powershell 4.0/Office 2016 Pro Plus. – Ash

+1

@TessellatingHeckler. Первая ошибка не обязательно означает, что '$ workbook' является' $ null' - только то, что любой объект '$ workbook' представляет, не имеет свойства' Saved' (предполагая 'Set-StrictMode -Version 2' или выше). Аналогично, вторая ошибка просто указывает, что у объекта нет метода 'ExportAsFixedFormat' - конкретные параметры не вступают в игру, поэтому независимо от того, установлен ли плагин PDF, пока не имеет значения. Третья ошибка, безусловно, не означает, что '$ 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), эта совместимость сборки (а) не загружен по умолчанию, (б) загружается только при создании экземпляра объекта приложения 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, ...), то наиболее вероятной причиной является то, что сборка взаимодействия не установлен.
    • Другой способ проверить, загружена ли сборка interop, - выполнить [Microsoft.Office.Interop.Excel.ApplicationClass] и посмотреть, возвращается ли информация о типе (в отличие от сообщения об ошибке).
Смежные вопросы