es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Powershell Excel SaveAs requiere confirmación.

Utilizo el siguiente script para convertir un montón de archivos xls a xlsx.

$folderpath = %tempPath%
$filetype ="*xls"

Add-Type -AssemblyName Microsoft.Office.Interop.Excel

$xlFixedFormat = [Microsoft.Office.Interop.Excel.XlFileFormat]::xlWorkbookDefault
write-host $xlFixedFormat
$excel = New-Object -ComObject excel.application
$excel.visible = $true
Get-ChildItem -Path $folderpath -Include $filetype -recurse | 
ForEach-Object `
{
 $path = ($_.fullname).substring(0, ($_.FullName).lastindexOf("."))

"Convirtiendo $path"
 $workbook = $excel.workbooks.open($_.fullname)

$path += ".xlsx"
 $workbook.saveas($path, $xlFixedFormat)
 $workbook.close()

}
$excel.Quit()
$excel = $null

Solía funcionar perfectamente ejecutándolo en una máquina virtual.

Desafortunadamente, al cambiar la ruta de la carpeta, me di cuenta de que aparecen ventanas emergentes para confirmar la guarda que antes no salían y el script se queda atascado en eso.
¿Hay alguna corrección simple que pueda evitar ese error?

“scriptError”: {
“localizedName”: “Error”,
“value”: “No se puede obtener la propiedad SaveAs de la clase Workbook\r\nEn C:\Users\~
“variableName”: “ScriptError”
}

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema parece estar relacionado con las ventanas emergentes que aparecen al guardar el libro. Para prevenir este error, puedes agregar la siguiente línea después de abrir el libro:

    $excel.DisplayAlerts = $false

    Esto desactivará cualquier alerta emergente que pueda aparecer mientras se guarda el libro. Además, es una buena práctica volver a habilitar las alertas después de que el guardado esté completo, por lo que puedes agregar la siguiente línea después de que el libro haya sido guardado:

    $excel.DisplayAlerts = $true

    Esto asegura que las alertas futuras no se pierdan. El código actualizado debe verse así:

    $folderpath = %tempPath%
    $filetype = "*xls"
    
    Add-Type -AssemblyName Microsoft.Office.Interop.Excel
    
    $xlFixedFormat = [Microsoft.Office.Interop.Excel.XlFileFormat]::xlWorkbookDefault
    write-host $xlFixedFormat
    $excel = New-Object -ComObject excel.application
    $excel.visible = $true
    Get-ChildItem -Path $folderpath -Include $filetype -recurse | 
    ForEach-Object `
    {
     $path = ($_.fullname).substring(0, ($_.FullName).lastindexOf("."))
    
     "Convirtiendo $path"
     $workbook = $excel.workbooks.open($_.fullname)
     $excel.DisplayAlerts = $false
     $path += ".xlsx"
     $workbook.saveas($path, $xlFixedFormat)
     $workbook.close()
     $excel.DisplayAlerts = $true
    
    }
    $excel.Quit()
    $excel = $null
    [gc]::collect()
    [gc]::WaitForPendingFinalizers()
    

    Esto debería evitar que las ventanas emergentes causen errores en el script y permitir que se ejecute sin problemas.

Comments are closed.