#excel #powershell
#excel #powershell
Вопрос:
Я пытаюсь создать скрипт, который превращает листы Excel в PDF-файлы и сохраняет, используя имя, которое он получает от одного из значений на листе. Пока я получил это:
Я получаю сообщение об ошибке, и оно не сохраняется с использованием указанного имени. Я могу распечатать значение, хотя и 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. Теперь все работает как по маслу, большое спасибо