iMasck
iMasck

Reputation: 103

Download an Excel document from website with Powershell

recently I began to learn PowerShell to automate my job tasks.

So I want to access a web page and click on a button that download automatically an Excel file. This is the button that I want to click on:

<div class="NormalButton">

<a class="ActiveLink" title="Excel" alt="Excel" onclick="$find('ctl32').exportReport('EXCELOPENXML');" href="javascript:void(0)" style="padding:3px 8px 3px 8px;display:block;white-space:nowrap;text-decoration:none;">Excel</a>

</div>

This would be my PowerShell script:

$ie = New-Object -com "InternetExplorer.Application"
$ie.Navigate("http://test.test/")
$ie.Visible = $true
$link = $ie.Document.getElementsByTagName('a') | Where-Object {$_.onclick -eq "$find('ctl32').exportReport('EXCELOPENXML');"}
$link.click()

If I try to run it from the console I receive the error "You cannot call a method on a null-valued expression."

If its useful I'm using PowerShell 4.0 and the webpage has a delay until the report is loaded.

Upvotes: 0

Views: 2357

Answers (2)

iMasck
iMasck

Reputation: 103

I have completed it by the following code:

[void][System.Reflection.Assembly]::LoadWithPartialName("'System.Windows.Forms")
[void][System.Reflection.Assembly]::LoadWithPartialName("'Microsoft.VisualBasic")


$url = "https://webpage.com"


$ie = New-Object -com internetexplorer.application
$ie.navigate($url)
$ie.StatusBar = $false
$ie.ToolBar = $false
$ie.visible = $true



#Get Excel

Start-Sleep -s 40


$btnExcel = $ie.Document.links | where-object { $_.outerText -eq 'Excel' -and $_.innerText -eq 'Excel' }
$btnExcel.click()



# Get Internet Explorer Focus

Start-Sleep -s 5

[Microsoft.VisualBasic.Interaction]::AppActivate("internet explorer")
[System.Windows.Forms.SendKeys]::SendWait("{F6}");
[System.Windows.Forms.SendKeys]::SendWait("{TAB}");
[System.Windows.Forms.SendKeys]::SendWait(" ");
Start-Sleep 1
[System.Windows.Forms.SendKeys]::SendWait("$file");
[System.Windows.Forms.SendKeys]::SendWait("{ENTER}");



# Get Internet Explorer Focus

Start-Sleep -s 1

[Microsoft.VisualBasic.Interaction]::AppActivate("internet explorer")
[System.Windows.Forms.SendKeys]::SendWait("^{F4}");

Thank you all for you time :)

Upvotes: 1

Avshalom
Avshalom

Reputation: 8889

I Think the Your problem is because you are using Double Quotes which powershell threat it like variable and Try to expand it, so try to change it to Single quote, from:

$link = $ie.Document.getElementsByTagName('a') | Where-Object {$_.onclick -eq "$find('ctl32').exportReport('EXCELOPENXML');"}

to:

$link = $ie.Document.getElementsByTagName('a') | Where-Object {$_.onclick -eq '$find('ctl32').exportReport('EXCELOPENXML');'}

Also, you can change the -eq to -match and take just a portion of it like:

$_.onclick -match '$find('ctl32').exportReport'

For more information see: About Quoting Rules

Upvotes: 0

Related Questions