Après quelques semaines passées chez le client, j’avais besoin de convertir des montants de devises étrangères vers le dollar et / ou l’euro. Pour cela, il existe plusieurs sites (gratuits ou payants) qui offrent des services web pour convertir les devises.
Parmi ces sites j’ai choisi https://openexchangerates.org pour les raisons suivantes :
- Populaire et utilisé par de nombreux systèmes d’information
- Gratuit, une inscription suffit pour bénéficier du service
- Il offre une liste complète des taux de change face au dollar
- Il propose l’historique des devises, ce qui permet de trouver le taux de change d’une devise donnée à une date passée
Dans ce post, je vais vous expliquer comment récupérer la liste des devises avec le taux de change à une date donnée et par rapport à une devise de base, puis à sortir le résultat dans un fichier Excel exploitable facilement.
Le site https://openexchangerates.org offre le service sous format JSON. Voici ce à quoi ressemble le flux proposé :
{ "disclaimer": "This data is collected from various providers ...", "license": "Data collected from various providers with public-facing APIs ...", "timestamp": 1336741253, "base": "USD", "rates": { "AED": 3.6731, "AFN": 48.419998, "ALL": 107.949997, "AMD": 393.410004, "ANG": 1.79, "AOA": 94.949997, // ... more values ... }}
|
Dans ce qui suit, je vous montre comment récupérer ces informations et les transférer vers un fichier Excel.
Utilisation du service
Etape 1 : création d’un projet C# très simple de type console
Ajout de la classe CurrencyRates.cs qui sera la classe model du flux récupéré du site voici le code :
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TauxChange { public class CurrencyRates { public string Disclaimer { get; set; } public string License { get; set; } public int TimeStamp { get; set; } public string Base { get; set; } public Dictionary<string, decimal> Rates { get; set; } public DateTime FomatTimeStamp() { System.DateTime date = new System.DateTime(1970, 1, 1, 0, 0, 0, 0); date = date.AddSeconds(TimeStamp); return date; } } } |
Le champ TimeStamp représente la date de changes, le champ Base représente la devise de base face à laquelle on calcule les taux des autres devises, généralement c’est le dollar USD.
Le champ Rates est un dictionnaire clés valeurs, qui définit le code de la devise comme clé et le taux de change comme valeur.
- Le flux récupéré du site est sous la forme JSON. Pour l’exploiter on aura besoin de l’API NewtonSoft.Json pour le dé-sérialiser et le convertir vers notre classe CurrencyRates
Cette API permet aussi de convertir une classe C# vers un flux JSON.
Pour l’installer j’utilise NuGet de Visual studio.
- Pour exploiter le fichier Excel on aura besoin d’ajouter une référence à l'API Microsoft.Office.Interop.Excel
- Lorsque l’on s’enregistre dans le site https://openexchangerates.org , un numéro d’identification nous est attribué, il faut le garder car on l’utilisera à chaque connexion de la façon suivante :
Pour obtenir les taux de change du jour, il faut utiliser l’adresse suivante avec app-id comme identificateur
url = https://openexchangerates.org/api/latest.json?app_id=yourCode
Pour obtenir les taux de change à une date passée, il suffit de le spécifier dans l'URL sous format YYYY-MM_DD :
url = https://openexchangerates.org/api/historical/YYYY-MM-DD.json?app_id=yourCode
- Voici la classe qui récupère le flux Json et qui le converti vers notre objet Model CurrencyRates
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net; using Newtonsoft.Json; namespace TauxChange { class OpenExchange { private T _download_serialized_json_data<T>(string url) where T : new() { using (var w = new WebClient()) { var json_data = string.Empty; // attempt to download JSON data as a string try { json_data = w.DownloadString(url); } catch (Exception) { } // if string with JSON data is not empty, deserialize it to class and return its instance return !string.IsNullOrEmpty(json_data) ? JsonConvert.DeserializeObject<T>(json_data) : new T(); } } public CurrencyRates getCurrencyRates() { // pour les derniers taux var url = “https://openexchangerates.org/api/latest.json?app_id=4811f56dc83f4226b8b56cad44tr4537 “; var currencyRates = _download_serialized_json_data<CurrencyRates>(url); return currencyRates; } } } |
La classe JsonConvert de l’API JSON propose une méthode générique DeserializeObject<T>(json_data) qui prend en paramètre le flux JSON et comme type générique T, et retourne un objet de type T rempli de données.
- Pour exploiter les données sous format Excel , je vais créer une autre classe qui sera en charge de gérer le fichier Excel , voici le code :
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Excel = Microsoft.Office.Interop.Excel; namespace TauxChange { public class ExcelOperation { private Excel.Workbook MyBook { get; set; } private Excel.Application MyApp { get; set; } private Excel.Worksheet MySheet { get; set; } private int lastRow { get; set; } public ExcelOperation() { MyApp = new Excel.Application(); MyApp.Visible = true; MyBook = MyApp.Workbooks.Add(); MySheet = MyBook.Worksheets.Add(); MySheet.Name = "Liste des devises"; lastRow = MySheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell).Row; } public void wirteToExcel(CurrencyRates cur, string name) { lastRow += 1; MySheet.Cells[lastRow, 1] = cur.Base; MySheet.Cells[lastRow, 2] = cur.Disclaimer; MySheet.Cells[lastRow, 3] = cur.FomatTimeStamp(); lastRow += 2; foreach (var dic in cur.Rates) { MySheet.Cells[lastRow, 1] = dic.Key; MySheet.Cells[lastRow, 2] = dic.Value; lastRow += 1; } MyBook.SaveAs(name); } } } |
Je crée d’abord l’objet Excel.Application , puis je crée le workBook et la feuille qui va contenir les données, je la nome Liste des devises.
Ensuite, j’insère les données de l’objet CurrencyRates dans la feuille Excel sous la forme suivante :
La colonne 1 contient en entête la devise de base puis dans les lignes suivantes la liste des devises.
La colonne 2 contient la date de change puis les lignes suivantes les valeurs des taux.
- Il ne reste plus qu'à lancer tout ça dans une petite classe program :
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TauxChange { class Program { static void Main(string[] args) { ExcelOperation excel = new ExcelOperation(); OpenExchange openExchange = new OpenExchange(); var currencyRates = openExchange.getCurrencyRates(); excel.wirteToExcel(currencyRates,"Devises"); } } } |
Maintenant vous avez tout ce qu’il faut pour exploiter les devises et leurs taux de changes.
Bonne chance.