Récupération des taux de change des devises en C#

open_exchange_rates

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.

nguet

  •  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.

 

 

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.