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

https://xpil.eu/e8g

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!

https://xpil.eu/e8g

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]

Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.