Home / Pchełki / Inne Pchełki / Pchełki Powershell: jak użyć funkcji Excela w skrypcie?

Pchełki Powershell: jak użyć funkcji Excela w skrypcie?

Czasem zdarza nam się, że trzeba napisać w Powershell coś bardziej skomplikowanego, niż skopiowanie pliku z miejsca A do miejsca B. Dajmy na to próbujemy oskryptować jakąś logikę finansową i potrzebujemy napisać sobie funkcję wyliczającą kwotę miesięcznej spłaty kredytu ze stałym, znanym oprocentowaniem, ilością rat i kwotą pożczyczki.

Oczywiście możemy sobie tę funkcję napisać od zera „na piechotę” – matematyka, która się za nią kryje, nie jest aż tak znowu skomplikowana:

 
Function PMT($stopa, $ile_rat, $kwota) {
$stopa * $kwota * [math]::Pow((1 + $stopa), $ile_rat) / (1 - [math]::Pow((1 + $stopa), $ile_rat)
}

Takie podejście ma sporo zalet:

  • Walor edukacyjny
  • Lepsza kontrola nad tym, co nasz skrypt robi
  • Własność intelektualna (? tu można się kłócić, bo kod też można od kogoś zerżnąć…)

Główna wada jest natomiast taka, że często będziemy wynajdywać koło, a więc tak naprawdę marnować czas, który moglibyśmy przeznaczyć na coś bardziej twórczego.

W przypadku funkcji PMT takim kołem, którego nie musimy wynajdować, jest Excel. Tam PMT jest przecież od dawna, wystarczy sięgnąć…

Ale że niby jak?

Otóż, okazuje się, całkiem prosto:

 
[reflection.assembly]::LoadWithPartialName( "Microsoft.Office.Interop.Excel" ) | Out-Null

$Global:XL = New-Object -ComObject Excel.Application

Od tej pory mamy w skrypcie globalną zmienną reprezentującą… Nie, źle mówię. *Będącą* ukrytą, ale w pełni funkcjonalną instancją aplikacji Excel, wraz z całym dobrodziejstwem inwentarza:

 
$Global:XL.WorksheetFunction.Pmt(0.1/12, 12, 1000)

Ładujemy Excela do pamięci *raz* (zajmuje to niestety około pół sekundy nawet na dość szybkim komputerze) i potem możemy wywoływać w skrypcie funkcje excelowe – będą działać prawie tak samo szybko, jak te napisane przez nas, a w bardziej skomplikowanych przypadkach nawet szybciej.

Smacznego!

Dodaj komentarz

avatar
  Subscribe  
Powiadom o
%d bloggers like this: