Сценарий Powershell для создания PDF-файлов из листов Excel

#excel #powershell

#excel #powershell

Вопрос:

Я пытаюсь создать скрипт, который превращает листы Excel в PDF-файлы и сохраняет, используя имя, которое он получает от одного из значений на листе. Пока я получил это:

PS-script

Я получаю сообщение об ошибке, и оно не сохраняется с использованием указанного имени. Я могу распечатать значение, хотя и PDF-файл создан, так что что-то работает.

Ошибка:

 Join-Path : Cannot convert 'System.Object[]' to the type 'System.String' required by parameter 'ChildPath'. Specified
method is not supported.
At line:26 char:51
   $filepath = Join-Path -Path $savepath -ChildPath ($value   ".pdf")
                                                    ~~~~~~~~~~~~~~~~~
      CategoryInfo          : InvalidArgument: (:) [Join-Path], ParameterBindingException
      FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.JoinPathCommand
 

Дополнительный вопрос: если я хочу, чтобы он переместил Excel после, что мне нужно добавить и куда, поскольку я планирую запускать это ежедневно и конвертировать только все новые файлы.

Код:

 #UPDATE DATA IN EXCEL FILES
#THEN CREATE PDF FILE
[string]$path = "C:UsersPCUserDesktopJCI PraktikPDF"  #Path to Excel spreadsheets to save to PDF
[string]$savepath = "C:UsersPCUserDesktopJCI PraktikPDF"
[string]$dToday = Get-Date -Format "yyyyMMdd"
 
$xlFixedFormat = "Microsoft.Office.Interop.Excel.xlFixedFormatType" -as [type] 
$excelFiles = Get-ChildItem -Path $path -include *.xls, *.xlsx -recurse 
 
# Create the Excel application object
$objExcel = New-Object -ComObject excel.application 
$objExcel.visible = $false   #Do not open individual windows
 
foreach($wb in $excelFiles) 
{ 
# Path to new PDF with date 


 # Open workbook - 3 refreshes links
 $workbook = $objExcel.workbooks.open($wb.fullname, 3)
 $worksheet = $objExcel.worksheets.item(1) #SK
 
 $value = $objExcel.Cells.Item(1, 6)
 $value.Text #this should give you back the Value in that Cell
 $workbook.RefreshAll()
 $filepath = Join-Path -Path $savepath -ChildPath ($value   "_"   $dtoday   ".pdf") 

 # Give delay to save
 Start-Sleep -s 5
 
 # Save Workbook
 $workbook.Saved = $true 
"saving $filepath" 
 #Export as PDF
 $worksheet.ExportAsFixedFormat($xlFixedFormat::xlTypePDF, $filepath) #SK
 $objExcel.Workbooks.close() 
} 
$objExcel.Quit()```
 

Ответ №1:

Изменить на

 $value = $objExcel.Cells.Item(1, 6).Text  # You can also use '.Value' or '.Value2'  
 

Однако это может легко привести к тому, что строка будет содержать недопустимые символы имени файла, поэтому для их удаления используйте

 $value = $value -replace ("[{0}]" -f [regex]::Escape([IO.Path]::GetInvalidFileNameChars() -join ''))
 

Затем объедините в полный путь к файлу

 $filepath = Join-Path -Path $savepath -ChildPath ('{0}_{1}.pdf' -f $value, $dtoday) 
 

Ответ №2:

$value Переменная должна быть строкой,

Вы используете эти две строки в своем скрипте,

 $value = $objExcel.Cells.Item(1, 6)
$value.Text #this should give you back the Value in that Cell
 

итак, в переменной filepath

$filepath = Join-Path -Path $savepath -ChildPath ($value ".pdf")

какой результат $value.text ? это будет строка, которая должна работать.

Комментарии:

1. Спасибо за помощь.. Сейчас я не получаю сообщение об ошибке, но оно также не получает значение из ячейки, только систему. __ComObject (попытался напечатать значение amp;). Мой Excel — это просто тестовый банкомат с ячейками 10 * 10 с номерами 1-100. Очень новичок в PS, но знаю c и другие языки.

2. Мой плохой … добавлен .text в wring. Теперь все работает как по маслу, большое спасибо