반응형

* C# 한국 수출입 은행 공공데이터를 이용한 대출 금리 정보 가져 오기 예제...


Main

- 사용한 컨트롤 : DateTimepicker 1개, Button 1개, Label 4개

 

전체 소스 코드

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Net;
using System.Runtime.InteropServices;
using System.Net.Json;
using System.IO;

namespace CSharp_Loan
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private bool StringToJson(string strTmp, ref string strErr)
        {

            if (strTmp.Length < 3)
            {
                strErr = "영업일이 아닙니다. 확인 후 이용해 주세요.";
                return false;
            }

            JsonTextParser jtr = new JsonTextParser();
            //string 문자열 -> json 으로 변환
            JsonObject jo = jtr.Parse(strTmp);

            JsonArrayCollection jac = (JsonArrayCollection)jo;
            int iRow = 0;

            foreach (JsonObjectCollection joc in jac)
            {
                iRow += 1;
                //Display
                if (joc["result"].ToString().Contains("1"))
                {
                    lbl1.Text = joc["sfln_intrc_nm"].ToString().Split(':')[1].Replace('"', ' ').Trim();
                    lbl2.Text = joc["int_r"].ToString().Split(':')[1].Replace('"', ' ').Trim();
                }

            }

            return true;

        }


        private void button1_Click(object sender, EventArgs e)
        {
            //AP01 : 환율, AP02 : 대출금리, AP03 : 국제금리
            //ex) 2015-01-01, 20150101, (DEFAULT)현재일
            //(요청) https://www.koreaexim.go.kr/site/program/financial/exchangeJSON?authkey=AUTHKEY1234567890&searchdate=20180102&data=AP01
            //(응답) [{"result":1,"cur_unit":"AED","ttb":"288.78","tts":"294.61","deal_bas_r":"291.7","bkpr":"291"
            //        ,"yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"291","kftc_deal_bas_r":"291.7" 
            //        ,"cur_nm":"아랍에미리트 디르함"},"result":1,"cur_unit":"ATS","ttb":"0","tts":"0"
            //        ,"deal_bas_r":"93.52","bkpr":"0","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"0"
            //        ,"kftc_deal_bas_r":"93.52","cur_nm":"오스트리아 실링"},{"result":1,"cur_unit":"AUD","ttb":"827.91","tts":"844.64","deal_bas_r":"836.28","bkpr":"836","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"836","kftc_deal_bas_r":"836.28","cur_nm":"호주 달러"},{"result":1,"cur_unit":"BEF","ttb":"0","tts":"0","deal_bas_r":"31.9","bkpr":"0","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"0","kftc_deal_bas_r":"31.9","cur_nm":"벨기에 프랑"},{"result":1,"cur_unit":"BHD","ttb":"2,811.48","tts":"2,868.27","deal_bas_r":"2,839.88","bkpr":"2,839","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"2,839","kftc_deal_bas_r":"2,839.88","cur_nm":"바레인 디나르"},{"result":1,"cur_unit":"CAD","ttb":"844.72","tts":"861.79","deal_bas_r":"853.26","bkpr":"853","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"853","kftc_deal_bas_r":"853.26","cur_nm":"캐나다 달러"},{"result":1,"cur_unit":"CHF","ttb":"1,088.44","tts":"1,110.43","deal_bas_r":"1,099.44","bkpr":"1,099","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1,099","kftc_deal_bas_r":"1,099.44","cur_nm":"스위스 프랑"},{"result":1,"cur_unit":"CNH","ttb":"162.01","tts":"165.28","deal_bas_r":"163.65","bkpr":"163","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"163","kftc_deal_bas_r":"163.65","cur_nm":"위안화"},{"result":1,"cur_unit":"DEM","ttb":"0","tts":"0","deal_bas_r":"657.98","bkpr":"0","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"0","kftc_deal_bas_r":"657.98","cur_nm":"독일 마르크"},{"result":1,"cur_unit":"DKK","ttb":"171.14","tts":"174.59","deal_bas_r":"172.87","bkpr":"172","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"172","kftc_deal_bas_r":"172.87","cur_nm":"덴마아크 크로네"},{"result":1,"cur_unit":"ESP(100)","ttb":"0","tts":"0","deal_bas_r":"773","bkpr":"0","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"0","kftc_deal_bas_r":"773","cur_nm":"스페인 페세타"},{"result":1,"cur_unit":"EUR","ttb":"1,274.04","tts":"1,299.77","deal_bas_r":"1,286.91","bkpr":"1,286","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1,286","kftc_deal_bas_r":"1,286.91","cur_nm":"유로"},{"result":1,"cur_unit":"FIM","ttb":"0","tts":"0","deal_bas_r":"216.44","bkpr":"0","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"0","kftc_deal_bas_r":"216.44","cur_nm":"핀란드 마르카"},{"result":1,"cur_unit":"FRF","ttb":"0","tts":"0","deal_bas_r":"196.18","bkpr":"0","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"0","kftc_deal_bas_r":"196.18","cur_nm":"프랑스 프랑"},{"result":1,"cur_unit":"GBP","ttb":"1,432.82","tts":"1,461.77","deal_bas_r":"1,447.3","bkpr":"1,447","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1,447","kftc_deal_bas_r":"1,447.3","cur_nm":"영국 파운드"},{"result":1,"cur_unit":"HKD","ttb":"135.75","tts":"138.5","deal_bas_r":"137.13","bkpr":"137","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"137","kftc_deal_bas_r":"137.13","cur_nm":"홍콩 달러"},{"result":1,"cur_unit":"IDR(100)","ttb":"7.82","tts":"7.97","deal_bas_r":"7.9","bkpr":"7","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"7","kftc_deal_bas_r":"7.9","cur_nm":"인도네시아 루피아"},{"result":1,"cur_unit":"ITL(100)","ttb":"0","tts":"0","deal_bas_r":"66.46","bkpr":"0","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"0","kftc_deal_bas_r":"66.46","cur_nm":"이태리 리라"},{"result":1,"cur_unit":"JPY(100)","ttb":"941.53","tts":"960.56","deal_bas_r":"951.05","bkpr":"951","yy_efee_r":"0.96833","ten_dd_efee_r":"0.0242","kftc_bkpr":"951","kftc_deal_bas_r":"951.05","cur_nm":"일본 옌"},{"result":1,"cur_unit":"KRW","ttb":"0","tts":"0","deal_bas_r":"1","bkpr":"1","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1","kftc_deal_bas_r":"1","cur_nm":"한국 원"},{"result":1,"cur_unit":"KWD","ttb":"3,509.87","tts":"3,580.78","deal_bas_r":"3,545.33","bkpr":"3,545","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"3,545","kftc_deal_bas_r":"3,545.33","cur_nm":"쿠웨이트 디나르"},{"result":1,"cur_unit":"MYR","ttb":"262.09","tts":"267.38","deal_bas_r":"264.74","bkpr":"264","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"264","kftc_deal_bas_r":"264.74","cur_nm":"말레이지아 링기트"},{"result":1,"cur_unit":"NLG","ttb":"0","tts":"0","deal_bas_r":"583.97","bkpr":"0","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"0","kftc_deal_bas_r":"583.97","cur_nm":"네델란드 길더"},{"result":1,"cur_unit":"NOK","ttb":"129.44","tts":"132.05","deal_bas_r":"130.75","bkpr":"130","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"130","kftc_deal_bas_r":"130.75","cur_nm":"노르웨이 크로네"},{"result":1,"cur_unit":"NZD","ttb":"752.76","tts":"767.97","deal_bas_r":"760.37","bkpr":"760","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"760","kftc_deal_bas_r":"760.37","cur_nm":"뉴질랜드 달러"},{"result":1,"cur_unit":"SAR","ttb":"282.84","tts":"288.55","deal_bas_r":"285.7","bkpr":"285","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"285","kftc_deal_bas_r":"285.7","cur_nm":"사우디 리얄"},{"result":1,"cur_unit":"SEK","ttb":"129.3","tts":"131.91","deal_bas_r":"130.61","bkpr":"130","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"130","kftc_deal_bas_r":"130.61","cur_nm":"스웨덴 크로나"},{"result":1,"cur_unit":"SGD","ttb":"793.06","tts":"809.09","deal_bas_r":"801.08","bkpr":"801","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"801","kftc_deal_bas_r":"801.08","cur_nm":"싱가포르 달러"},{"result":1,"cur_unit":"THB","ttb":"32.57","tts":"33.22","deal_bas_r":"32.9","bkpr":"32","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"32","kftc_deal_bas_r":"32.9","cur_nm":"태국 바트"},{"result":1,"cur_unit":"USD","ttb":"1,056.23","tts":"1,077.56","deal_bas_r":"1,066.9","bkpr":"1,066","yy_efee_r":"2.69465","ten_dd_efee_r":"0.07485","kftc_bkpr":"1,071","kftc_deal_bas_r":"1,071.4","cur_nm":"미국 달러"},{"result":1,"cur_unit":"XOF","ttb":"0","tts":"0","deal_bas_r":"1.9618","bkpr":"0","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"0","kftc_deal_bas_r":"1.9618","cur_nm":"씨에프에이 프랑(비씨에이오)"}]

            string strURL = "https://www.koreaexim.go.kr/site/program/financial/interestJSON?authkey=" +
                            "시리얼키=" +
                            dtp.Value.ToString("yyyyMMdd") + "&data=" +
                            "AP02";

            HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create(strURL);
            hwr.ContentType = "application/json";
            //hwr.Method = "GET";

            using (HttpWebResponse hwrResult = hwr.GetResponse() as HttpWebResponse)
            {
                Stream sr = hwrResult.GetResponseStream();
                //JSON 파싱...
                using (StreamReader srd = new StreamReader(sr))
                {
                    string strResult = srd.ReadToEnd();
                    string strErr = "";
                    if (!StringToJson(strResult, ref strErr))
                    {
                        MessageBox.Show(strErr, "확 인", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                    }
                }//using StreamReader

                sr.Close();
                hwrResult.Close();

            }//using HttpWebResponse
        }
    }
}

아래의 그림과 같이 Button Click Event 를 살펴 보면

strURL 부분의 지워진 부분은 각자 한국 수출입 은행에서 받은 인증키를 입력 하면 됩니다. 



출처: https://kdsoft-zeros.tistory.com/248 [삽질하는 개발자...]

https://kdsoft-zeros.tistory.com/247

 

[C#] [공공데이터] 한국 수출입 은행 Open API 사용하기전 가입 신청...

https://www.koreaexim.go.kr/site/main/index001 한국수출입은행 www.koreaexim.go.kr 네이버 에서 한국 수출입 은행 으로 검색 하시면 위 화면과 같이 홈페이지에 접속 할 수 있습니다. 홈페이지에 접속 후 정..

kdsoft-zeros.tistory.com

 

https://kdsoft-zeros.tistory.com/97

 


* 예제 결과

반응형
반응형

* C# 한국 수출입 은행 공공데이터를 이용한 환율 정보 가져 오기 예제...

 

Main

- 사용한 컨트롤 : DateTimepicker 1개, Button 1개, Listview 1개

 

전체 소스 코드

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Net;
using System.Runtime.InteropServices;
using System.Net.Json;
using System.IO;

namespace CSharp_ExchangeRate
{
    public partial class Form1 : Form
    {
        [DllImport("gdi32.dll")]
        private static extern IntPtr CreateRoundRectRgn(int x1, int y1, int x2, int y2, int cx, int cy);
        [DllImport("user32.dll")]
        private static extern int SetWindowRgn(IntPtr hWnd, IntPtr hRgn, bool bRedraw);


        public Form1()
        {
            InitializeComponent();

            dtp.Value = DateTime.Now;
            SetRoundControl(15, listView1);
            
        }
        private void Form1_Resize(object sender, EventArgs e)
        {
            SetRoundControl(15, listView1);
        }

        private void SetRoundControl(int iValue, Control ct)
        {
            IntPtr ip = CreateRoundRectRgn(0, 0, ct.Width, ct.Height, iValue, iValue);
            int i = SetWindowRgn(ct.Handle, ip, true);
        }

        private bool StringToJson(string strTmp, ref string strErr)
        {
            
            if (strTmp.Length < 3)
            {
                strErr = "영업일이 아닙니다. 확인 후 이용해 주세요.";
                return false ;
            }

            listView1.Items.Clear();

            JsonTextParser jtr = new JsonTextParser();
            //string 문자열 -> json 으로 변환
            JsonObject jo = jtr.Parse(strTmp);              

            JsonArrayCollection jac = (JsonArrayCollection)jo;
            int iRow = 0;

            foreach (JsonObjectCollection joc in jac)
            {
                iRow += 1;
                //Display
                JsonDataSet(iRow, joc);   
            }

            return true ;

        }

        private void JsonDataSet(int iRow, JsonObjectCollection  joc)
        {
            ListViewItem lvi = new ListViewItem();
            lvi.Text = iRow.ToString();

            //success 
            if (joc["result"].ToString().Contains("1"))
            {
                //ex) cur_nm : "미국 달러" => split(:)[1] "미국 달러" => Replace " 공백 치환으로 미국 달러 
                lvi.SubItems.Add(joc["cur_unit"].ToString().Split(':')[1].Replace ('"', ' ').Trim());                       //통화 코드
                lvi.SubItems.Add(joc["cur_nm"].ToString().Split(':')[1].Replace('"', ' ').Trim());                         //국가/통화명
                lvi.SubItems.Add(joc["ttb"].ToString().Split(':')[1].Replace('"', ' ').Trim());                            //전신환(송금) 받으실 때
                lvi.SubItems.Add(joc["tts"].ToString().Split(':')[1].Replace('"', ' ').Trim());                            //전신환(송금) 보내실 때
                lvi.SubItems.Add(joc["deal_bas_r"].ToString().Split(':')[1].Replace('"', ' ').Trim());                     //매매기준율
                lvi.SubItems.Add(joc["bkpr"].ToString().Split(':')[1].Replace('"', ' ').Trim());                           //장부가격
                lvi.SubItems.Add(joc["yy_efee_r"].ToString().Split(':')[1].Replace('"', ' ').Trim());                      //년환가료율
                lvi.SubItems.Add(joc["ten_dd_efee_r"].ToString().Split(':')[1].Replace('"', ' ').Trim());                  //10일 환가료율
                lvi.SubItems.Add(joc["kftc_deal_bas_r"].ToString().Split(':')[1].Replace('"', ' ').Trim());                //서울 외국환중개 매매기준율
                lvi.SubItems.Add(joc["kftc_bkpr"].ToString().Split(':')[1].Replace('"', ' ').Trim());                      //서울 외국환중개 장부 가격

                listView1.Items.Add(lvi);
            }

        }


        private void button1_Click(object sender, EventArgs e)
        {
            //AP01 : 환율, AP02 : 대출금리, AP03 : 국제금리
            //ex) 2015-01-01, 20150101, (DEFAULT)현재일
            //(요청) https://www.koreaexim.go.kr/site/program/financial/exchangeJSON?authkey=AUTHKEY1234567890&searchdate=20180102&data=AP01
            //(응답) [{"result":1,"cur_unit":"AED","ttb":"288.78","tts":"294.61","deal_bas_r":"291.7","bkpr":"291"
            //        ,"yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"291","kftc_deal_bas_r":"291.7" 
            //        ,"cur_nm":"아랍에미리트 디르함"},"result":1,"cur_unit":"ATS","ttb":"0","tts":"0"
            //        ,"deal_bas_r":"93.52","bkpr":"0","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"0"
            //        ,"kftc_deal_bas_r":"93.52","cur_nm":"오스트리아 실링"},{"result":1,"cur_unit":"AUD","ttb":"827.91","tts":"844.64","deal_bas_r":"836.28","bkpr":"836","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"836","kftc_deal_bas_r":"836.28","cur_nm":"호주 달러"},{"result":1,"cur_unit":"BEF","ttb":"0","tts":"0","deal_bas_r":"31.9","bkpr":"0","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"0","kftc_deal_bas_r":"31.9","cur_nm":"벨기에 프랑"},{"result":1,"cur_unit":"BHD","ttb":"2,811.48","tts":"2,868.27","deal_bas_r":"2,839.88","bkpr":"2,839","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"2,839","kftc_deal_bas_r":"2,839.88","cur_nm":"바레인 디나르"},{"result":1,"cur_unit":"CAD","ttb":"844.72","tts":"861.79","deal_bas_r":"853.26","bkpr":"853","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"853","kftc_deal_bas_r":"853.26","cur_nm":"캐나다 달러"},{"result":1,"cur_unit":"CHF","ttb":"1,088.44","tts":"1,110.43","deal_bas_r":"1,099.44","bkpr":"1,099","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1,099","kftc_deal_bas_r":"1,099.44","cur_nm":"스위스 프랑"},{"result":1,"cur_unit":"CNH","ttb":"162.01","tts":"165.28","deal_bas_r":"163.65","bkpr":"163","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"163","kftc_deal_bas_r":"163.65","cur_nm":"위안화"},{"result":1,"cur_unit":"DEM","ttb":"0","tts":"0","deal_bas_r":"657.98","bkpr":"0","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"0","kftc_deal_bas_r":"657.98","cur_nm":"독일 마르크"},{"result":1,"cur_unit":"DKK","ttb":"171.14","tts":"174.59","deal_bas_r":"172.87","bkpr":"172","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"172","kftc_deal_bas_r":"172.87","cur_nm":"덴마아크 크로네"},{"result":1,"cur_unit":"ESP(100)","ttb":"0","tts":"0","deal_bas_r":"773","bkpr":"0","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"0","kftc_deal_bas_r":"773","cur_nm":"스페인 페세타"},{"result":1,"cur_unit":"EUR","ttb":"1,274.04","tts":"1,299.77","deal_bas_r":"1,286.91","bkpr":"1,286","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1,286","kftc_deal_bas_r":"1,286.91","cur_nm":"유로"},{"result":1,"cur_unit":"FIM","ttb":"0","tts":"0","deal_bas_r":"216.44","bkpr":"0","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"0","kftc_deal_bas_r":"216.44","cur_nm":"핀란드 마르카"},{"result":1,"cur_unit":"FRF","ttb":"0","tts":"0","deal_bas_r":"196.18","bkpr":"0","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"0","kftc_deal_bas_r":"196.18","cur_nm":"프랑스 프랑"},{"result":1,"cur_unit":"GBP","ttb":"1,432.82","tts":"1,461.77","deal_bas_r":"1,447.3","bkpr":"1,447","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1,447","kftc_deal_bas_r":"1,447.3","cur_nm":"영국 파운드"},{"result":1,"cur_unit":"HKD","ttb":"135.75","tts":"138.5","deal_bas_r":"137.13","bkpr":"137","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"137","kftc_deal_bas_r":"137.13","cur_nm":"홍콩 달러"},{"result":1,"cur_unit":"IDR(100)","ttb":"7.82","tts":"7.97","deal_bas_r":"7.9","bkpr":"7","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"7","kftc_deal_bas_r":"7.9","cur_nm":"인도네시아 루피아"},{"result":1,"cur_unit":"ITL(100)","ttb":"0","tts":"0","deal_bas_r":"66.46","bkpr":"0","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"0","kftc_deal_bas_r":"66.46","cur_nm":"이태리 리라"},{"result":1,"cur_unit":"JPY(100)","ttb":"941.53","tts":"960.56","deal_bas_r":"951.05","bkpr":"951","yy_efee_r":"0.96833","ten_dd_efee_r":"0.0242","kftc_bkpr":"951","kftc_deal_bas_r":"951.05","cur_nm":"일본 옌"},{"result":1,"cur_unit":"KRW","ttb":"0","tts":"0","deal_bas_r":"1","bkpr":"1","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1","kftc_deal_bas_r":"1","cur_nm":"한국 원"},{"result":1,"cur_unit":"KWD","ttb":"3,509.87","tts":"3,580.78","deal_bas_r":"3,545.33","bkpr":"3,545","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"3,545","kftc_deal_bas_r":"3,545.33","cur_nm":"쿠웨이트 디나르"},{"result":1,"cur_unit":"MYR","ttb":"262.09","tts":"267.38","deal_bas_r":"264.74","bkpr":"264","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"264","kftc_deal_bas_r":"264.74","cur_nm":"말레이지아 링기트"},{"result":1,"cur_unit":"NLG","ttb":"0","tts":"0","deal_bas_r":"583.97","bkpr":"0","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"0","kftc_deal_bas_r":"583.97","cur_nm":"네델란드 길더"},{"result":1,"cur_unit":"NOK","ttb":"129.44","tts":"132.05","deal_bas_r":"130.75","bkpr":"130","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"130","kftc_deal_bas_r":"130.75","cur_nm":"노르웨이 크로네"},{"result":1,"cur_unit":"NZD","ttb":"752.76","tts":"767.97","deal_bas_r":"760.37","bkpr":"760","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"760","kftc_deal_bas_r":"760.37","cur_nm":"뉴질랜드 달러"},{"result":1,"cur_unit":"SAR","ttb":"282.84","tts":"288.55","deal_bas_r":"285.7","bkpr":"285","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"285","kftc_deal_bas_r":"285.7","cur_nm":"사우디 리얄"},{"result":1,"cur_unit":"SEK","ttb":"129.3","tts":"131.91","deal_bas_r":"130.61","bkpr":"130","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"130","kftc_deal_bas_r":"130.61","cur_nm":"스웨덴 크로나"},{"result":1,"cur_unit":"SGD","ttb":"793.06","tts":"809.09","deal_bas_r":"801.08","bkpr":"801","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"801","kftc_deal_bas_r":"801.08","cur_nm":"싱가포르 달러"},{"result":1,"cur_unit":"THB","ttb":"32.57","tts":"33.22","deal_bas_r":"32.9","bkpr":"32","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"32","kftc_deal_bas_r":"32.9","cur_nm":"태국 바트"},{"result":1,"cur_unit":"USD","ttb":"1,056.23","tts":"1,077.56","deal_bas_r":"1,066.9","bkpr":"1,066","yy_efee_r":"2.69465","ten_dd_efee_r":"0.07485","kftc_bkpr":"1,071","kftc_deal_bas_r":"1,071.4","cur_nm":"미국 달러"},{"result":1,"cur_unit":"XOF","ttb":"0","tts":"0","deal_bas_r":"1.9618","bkpr":"0","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"0","kftc_deal_bas_r":"1.9618","cur_nm":"씨에프에이 프랑(비씨에이오)"}]

            string strURL = "https://www.koreaexim.go.kr/site/program/financial/exchangeJSON?authkey=" +  
                            "SerialKey Input&searchdate=" + 
                            dtp.Value.ToString("yyyyMMdd") + "&data=" + 
                            "AP01";

            HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create(strURL);
            hwr.ContentType = "application/json";
            //hwr.Method = "GET";

            using (HttpWebResponse hwrResult = hwr.GetResponse() as HttpWebResponse)
            {
                Stream sr = hwrResult.GetResponseStream();
                //JSON 파싱...
                using (StreamReader srd = new StreamReader(sr))
                {
                    string strResult = srd.ReadToEnd();
                    string strErr = "";
                    if (!StringToJson(strResult, ref strErr))
                    {
                        MessageBox.Show(strErr, "확 인" , MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                    }
                }//using StreamReader

                sr.Close();
                hwrResult.Close();

            }//using HttpWebResponse

        }

        
    }
}

아래의 그림과 같이 Button Click Event 를 살펴 보면

strURL 부분의 지워진 부분은 각자 한국 수출입 은행에서 받은 인증키를 입력 하면 됩니다. 

https://kdsoft-zeros.tistory.com/247

 

[C#] [공공데이터] 한국 수출입 은행 Open API 사용하기전 가입 신청...

https://www.koreaexim.go.kr/site/main/index001 한국수출입은행 www.koreaexim.go.kr 네이버 에서 한국 수출입 은행 으로 검색 하시면 위 화면과 같이 홈페이지에 접속 할 수 있습니다. 홈페이지에 접속 후 정..

kdsoft-zeros.tistory.com

인증키를 입력 후 한국수출입은행 응답을 보면 주석에서 보는거와 같이 Json 형태로 응답이 오게

됩니다.

 

https://kdsoft-zeros.tistory.com/97

 

[C#] Json File Write & Read 예제

* C# Json 파일 읽기 쓰기 예제... (System.Net.Json.dll) 파일 참조 위 첨부된 파일을 다운 받아 dll 참조 추가를 해줍니다. 오른쪽에 솔루션 탐색기가 나타나지 않는다면, 상단 메뉴 (보기) -> (솔루션탐색

kdsoft-zeros.tistory.com

 

 

* 예제 결과

 

Result

 

반응형
반응형

https://www.koreaexim.go.kr/site/main/index001

 

한국수출입은행

 

www.koreaexim.go.kr

 

 

네이버 에서 한국 수출입 은행 으로 검색 하시면 위 화면과 같이 홈페이지에 접속 할 수 있습니다.

홈페이지에 접속 후 정보공개 -> Open API 메뉴 클릭

 

현재 환율 API 를 클릭 해서 따라 들어 가게 되면 아래의 화면과 같이 인증키 발급 신청 화면을 볼 수

있습니다. 인증키 발급 신청을 먼저 하신 뒤에 인증키를 받은 후 잘 보관 및 입력 해 두었다가 나중에

환율 정보를 가져 올 때 사용.

 

 

반응형
반응형

*C# 공공데이터를 이용한 코로나 확진자 현황...

 

Main

- 사용한 컨트롤 : Label 17 개 , Panel 7 개 

 

전체 소스 코드

Form1.cs

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;


using System.Net;
using System.IO;
using System.Xml;
using System.Collections;
using System.Runtime.InteropServices;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        [DllImport("gdi32.dll")] private static extern IntPtr CreateRoundRectRgn(int x1, int y1, int x2, int y2, int cx, int cy);
        [DllImport("user32.dll")] private static extern int SetWindowRgn(IntPtr hWnd, IntPtr hRgn, bool bRedraw);

        public Form1()
        {
            InitializeComponent();

            //Round Control
            SetRoundControl(15, panel4);
            SetRoundControl(15, panel5);
            SetRoundControl(15, pnl1);
            SetRoundControl(15, pnl2);
            SetRoundControl(15, pnl3);
            SetRoundControl(15, pnl4);
            SetRoundControl(15, pnl5);

            //코로나 현황 
            //코로나 발생 현황
            try
            {
                DateTime dtNow = DateTime.Now;
                SetCorona(dtNow);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message.ToString(), "확 인", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }
        private void Form1_Resize(object sender, EventArgs e)
        {
            this.Size = new Size(708, 443);
        }

        private void SetCorona(DateTime dt)
        {
            string strURL = "http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19InfStateJson";
            strURL += "?ServiceKey=" + // Service Key
            strURL += "&pageNo=1";
            strURL += "&numOfRows=10";
            strURL += "&startCreateDt=" + dt.AddDays(-1).ToString("yyyyMMdd");               //하루 전
            strURL += "&endCreateDt=" + dt.ToString("yyyyMMdd");                             //오늘

            HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create(strURL);
            hwr.Method = "GET";

            using (HttpWebResponse hwrResult = hwr.GetResponse() as HttpWebResponse)
            {
                //StreamReader sr = new StreamReader(hwrResult.GetResponseStream(), Encoding.UTF8, true );
                //strResult = sr.ReadToEnd();

                Stream sr = hwrResult.GetResponseStream();
                //XML Read...
                XMLToRead(sr);

                sr.Close();
                hwrResult.Close();

            }
        }

        private void SetRoundControl(int iValue, Control ct)
        {
            IntPtr ip = CreateRoundRectRgn(0, 0, ct.Width, ct.Height, iValue, iValue);
            int i = SetWindowRgn(ct.Handle, ip, true);
        }

        private void  XMLToRead(Stream  st)
        {
            //=========================nodeList Comment===================================
            //기준일 STATEDT
            //기준시간 STATETIME

            //확진자수 DECIDECNT
            //격리해제수 CLEARCNT
            //검사진행수 EXAMCNT
            //사망자수 DEATHCNT
            //치료중 환자수 CARECNT
            //결과음성 수 RESUTLNEGCNT
            //누적검사수 ACCEXAMCNT
            //누적검사완료수 ACCEXAMCOMPCNT
            //누적확진률 ACCDEFRATE

            //등록일시 CREATEDT
            //수정일시 UPDATEDT

            XmlDocument xd = new XmlDocument();
 
            //XML 문서로...
            xd.Load(st);
            XmlNodeList xnl = xd.GetElementsByTagName("item"); //접근할 노드 (대소문자 구분 해야 됨.)

            int idecideCnt = 0;
            int iExamCnt = 0;
            int iclearCnt = 0;
            double dbAccDefRate = 0.0;
            int ideathCnt = 0;
            int icareCnt = 0;

            //전날 누적 확진자 수
            int iBeforeDec = 0;

            foreach (XmlNode xn in xnl)
            {
                if (xn["stateDt"].InnerText == DateTime.Now.ToString("yyyyMMdd"))
                {
                    //기준 일시
                    lblDate.Text = xn["stateDt"].InnerText + " " + xn["stateTime"].InnerText;
                    //확진자 수
                    idecideCnt = Convert.ToInt32(xn["decideCnt"].InnerText);
                    //검사 진행
                    iExamCnt = Convert.ToInt32(xn["examCnt"].InnerText);
                    //격리 해제
                    iclearCnt = Convert.ToInt32(xn["clearCnt"].InnerText);
                    //누적 확진률
                    dbAccDefRate = Convert.ToDouble(xn["accDefRate"].InnerText);
                    //사망자
                    ideathCnt = Convert.ToInt32(xn["deathCnt"].InnerText);
                    //치료중인환자
                    icareCnt = Convert.ToInt32(xn["careCnt"].InnerText);
                }//if
                else
                {
                    //어제 까지 누적 확진자 수
                    iBeforeDec = Convert.ToInt32(xn["decideCnt"].InnerText);

                }//else

            }//foreach

            //오늘까지 누적 확진자 수  - 어제까지 누적 확진자 수 
            lblDec.Text = string.Format("{0:#,###,000}", idecideCnt - iBeforeDec);
            lbl1.Text = string.Format("{0:#,###,000}", iExamCnt);
            lbl2.Text = string.Format("{0:#,###,000}", iclearCnt);
            lblAccDefRate.Text = string.Format("{0:0.00}", dbAccDefRate) + " %";
            lbl3.Text = string.Format("{0:#,###,000}", ideathCnt);
            lbl4.Text = string.Format("{0:#,###,000}", icareCnt);
            lbl5.Text = string.Format("{0:#,###,000}", idecideCnt);
        }

    }
}

 

[C#] [API] 컨트롤 (Control) 모서리 둥글게 만들기 :: 삽질하는 개발자... (tistory.com)

 

[C#] [API] 컨트롤 (Control) 모서리 둥글게 만들기

* C# API 이용 컨트롤 (Control) 모서리 둥글게 만들기 예제... 전체 소스 코드 Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Draw..

kdsoft-zeros.tistory.com

 

컨트롤 모서리를 둥글게 하기 위해 API 선언 후 이용

아래의 함수 내용을 보면 공공데이터 이용할 URL 및 서비스키(인증키 앞서 말한 Encoding 일반인증키 사용)

조회 시작할 날짜와 끝 날짜를 입력 할 수 있게 되어 있습니다.

 

현재 날짜와 하루 전 날짜 데이터를 불러 오는 이유는 확진자 수가 누적 확진자 수 로 불러 오기 때문에

현재 누적 확진자 수 - 하루 전 누적 확진자 수 를 구하면 현재 확진자 수가 나오기 때문

 

공공데이터를 이용해 코로나 확진자 현황 예제를 만들어 봤으며 

코로나 집계에 관련된 버그라 소스코드 작성 하시는 분들이 테스트 해 보시고 맞게 코드를 최적화 하시면 

되겠습니다. (일요일 같은 주말에 테스트 해보시길...)

 

[C#] [공공데이터] 가입 및 활용 신청... (1) :: 삽질하는 개발자... (tistory.com)

 

[C#] [공공데이터] 가입 및 활용 신청... (1)

* 공공데이터를 활용 하여 코로나 확진자 및 현황을 알아 보겠습니다. 먼저 앞서 작업을 해야 될 부분이 있습니다. 공공데이터포털 (data.go.kr) 공공데이터 포털 국가에서 보유하고 있는 다양한 데

kdsoft-zeros.tistory.com

 

반응형
반응형

 

* 공공데이터를 활용 하여 코로나 확진자 및 현황을 알아 보겠습니다. 먼저 앞서 작업을 해야 될 부분이 있습니다.

공공데이터포털 (data.go.kr)

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

공공데이터 포털 사이트에 가셔서 회원가입을 먼저 해야 진행 할 수 있는데요 

 

오른쪽 상단에 보시면 회원 가입을 클릭 하셔서 진행 하시면 될 거 같습니다.

회원 가입이 되고 로그인을 하시면 위와 같은 메인 화면에서 "코로나" 라고 검색 하시면 됩니다. 

그럼 아래의 그림과 같이 

 

 

스크롤을 내리셔서 오픈 API 로 이동 합니다.

공공데이터활용지원센터_ 보건복지부 코로나19 감염 현황 이라는 메뉴를 클릭 하셔서 들어 가시게 되면

 

오른쪽에 활용 신청을 할 수 있습니다.

 

 

그 다음 진행 해야 될 부분은 인증키를 발급 받으셔야 되는데 처음과 같은 메인 화면에서

로그인 -> 마이페이지 로 이동 하시면 위 그림과 같이 왼쪽 메뉴에 오픈API 를 클릭 하셔서 

인증키 발급 현황으로 가시면 됩니다. 처음 회원 가입을 했다면 당연히 인증키가 없기 때문에

발급 하시면 바로 인증키가 생성 되게 됩니다.

 

두번째로 인증키를 발급 받으셨다면 아까처럼 활용 신청이 완료 되면 위 그림과 같이 빨간색 테두리에

감염 현황 이라고 메뉴가 뜨게 됩니다. 클릭 하셔서 들어 가시면 아래의 그림과 같이 상세보기로 들어 가게

됩니다.

 

 

상세 보기에서 인증키 발급을 완료 하셨으면 빨간색 테두리에 일반 인증키 두 개가 같이 뜨게 됩니다.

우리는 Encoding 인증키를 사용 하여 코로나 감염 현황을 가져 올 것이기 때문에 Decoding은 잠시 놔 주면

되겠습니다.

 

* 인증키 발급이 완료 된 후 2~3 시간 경과 후 사용이 가능 합니다.

 

여기까지 완료 하셨다면 준비 과정은 끝났습니다. 위 그림과 같이 상세 보기 -> 기본 정보 -> 상세 설명 을 클릭 하여

보면 아래의 그림과 같이 요청 변수 출력 결과 등등 필드명들을 상세히 볼 수 있습니다.

 

 

[C#] [공공데이터] 코로나 확진자 현황 :: 삽질하는 개발자... (tistory.com)

 

[C#] [공공데이터] 코로나 확진자 현황

*C# 공공데이터를 이용한 코로나 확진자 현황... - 사용한 컨트롤 : Label 17 개 , Panel 7 개 전체 소스 코드 Form1.cs using System; using System.Collections.Generic; using System.ComponentModel; using S..

kdsoft-zeros.tistory.com

 

반응형
반응형

*C# String 을 Byte 로 Byte 를 String 으로 String <-> Char 변환 예제...

 

Main

- 사용한 컨트롤: Button 3개, TextBox 1개

전체 소스 코드

Form1.cs

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        String a = "ㄱㄴㄷ123abc";
        byte[] bb = null;
        byte[] bc = null;
        byte[] bd = null;
        byte[] be = null;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //String -> Byte 

            bb= System.Text.Encoding.Default.GetBytes(a); // String to default byte
            bc= System.Text.Encoding.Unicode.GetBytes(a); // String to unicode byte
            bd= System.Text.Encoding.UTF8.GetBytes(a);  // String to UTF8 byte
            be= System.Text.Encoding.ASCII.GetBytes(a); // 하위 7bit 만 변환됨.

            textBox1.Text = "String -> Byte 로 변환 ============== " + System.Environment.NewLine ; 
            textBox1.Text += "길이 " + System.Environment.NewLine;
            textBox1.Text += "Default: " + bb.Length + System.Environment.NewLine;
            textBox1.Text += "Unicode: " + bc.Length + System.Environment.NewLine;
            textBox1.Text += "UTF8: " + bd.Length + System.Environment.NewLine;
            textBox1.Text += "ASCII: " + be.Length + System.Environment.NewLine;
            textBox1.Text += "===================================== " + System.Environment.NewLine + System.Environment.NewLine;

        }

        private void button2_Click(object sender, EventArgs e)
        {
            //Byte -> String

            //바이트 배열에 아무것도 없으면...
            if ((bb == null) || (bc == null) || (bd == null) || (be == null))
            {
                MessageBox.Show("String -> Byte 변환 버튼 클릭 후 이용해 주세요.", "확 인", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                return;
            }
            
            textBox1.Text += "Byte -> String 로 변환 ============== " + System.Environment.NewLine;
            textBox1.Text += "Default: " + System.Text.Encoding.Default.GetString(bb) + System.Environment.NewLine;
            textBox1.Text += "Unicode: " + System.Text.Encoding.Unicode .GetString(bc) + System.Environment.NewLine;
            textBox1.Text += "UTF8: " + System.Text.Encoding.UTF8 .GetString(bd) + System.Environment.NewLine;
            textBox1.Text += "ASCII: " + System.Text.Encoding.ASCII .GetString(be) + System.Environment.NewLine;            //<- 한글 깨짐 한글 유니코드 변환X
            textBox1.Text += "===================================== " + System.Environment.NewLine + System.Environment.NewLine;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            // String <-> Char
            string sTmp = "가나다123abc";
            char[] cTmp = sTmp.ToCharArray();

            textBox1.Text += "String -> Char 로 변환 ============== " + System.Environment.NewLine;
            textBox1.Text += "Char 길이:  -> " + cTmp.Length  + System.Environment.NewLine;
            textBox1.Text += "Char -> String 로 변환 ============== " + System.Environment.NewLine;
            textBox1.Text += "변환: " + new string(cTmp) + System.Environment.NewLine;
            textBox1.Text += "===================================== " + System.Environment.NewLine + System.Environment.NewLine;
        }
    }
}

 

 

* 예제 결과

 

 

반응형
반응형

* C# Listview Column Auto Size (컬럼 사이즈 자동) 예제...

 

-사용한 컨트롤:  Listview 1개

 

전체 소스 코드

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CSharp_ListViewColumnsAuto
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            //예제 데이터 삽입...
            for (int i = 0; i < 10; i++)
            {
                ListViewItem lvi = new ListViewItem();
                lvi.Text = (i + 1).ToString();
                lvi.SubItems.Add("TEST " + (i + 1).ToString());

                listView1.Items.Add(lvi);
            }

            //리스트뷰 컬럼 Auto Size
            listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
            ListView.ColumnHeaderCollection cc = listView1.Columns;
            for (int i = 0; i < cc.Count; i++)
            {
                int colWidth = TextRenderer.MeasureText(cc[i].Text, listView1.Font).Width + 10;
                if (colWidth > cc[i].Width)
                {
                    cc[i].Width = colWidth;
                }
            }
        }

    }
}

 

- 컬럼 사이즈 자동 조절

 

결과 =>

 

- 컬럼 사이즈 자동 조절 X

 

결과 =>

 

 

반응형
반응형

* C# IronPython 설치 및 파이썬(Python) 함수들 불러 오기 예제...

 

Main

- 사용한 컨트롤 : Button 1개, TextBox 1개

- 개발 환경 : Visual Studio 2019 윈도우 10 64 bit 및 아나콘다3, Python3.7 파이참 설치 되어 있는 상황

                 아나콘다가 설치 되어 있어서 따로 설치를 하지는 않았음.

 

* IronPython 설치

메뉴에서 도구 -> Nuget 패키지 관리자 -> 패키지 관리자 콘솔 로 들어 갑니다.

 

그럼 위 그림 처럼 아래 하단에 패키지 관리자 콘솔 창이 나오게 되면 install-Package IronPython -Version 2.7.9 를 입력

해 줍니다. 그럼 그림처럼 패키지 설치를 하게 되는데

여기서 닷넷 프레임 워크는 저는 4.7 이상으로 했습니다. 테스트 해 본 결과

닷넷 프레임 워크가 2,3 은 아예 설치가 되질 않습니다. 

 

위 설치가 다 되면 오른쪽 솔루션 탐색기 -> 참조에 IronPython, IronPython.Modules, ~ 및 Microsoft.Scripting, Microsoft.Scripting.Metadata DLL 들이 자동으로 참조 추가 됨.

설치가 끝나게 되고 자동 으로 DLL 들이 참조가 되면 이제부터 아래와 같이 Python 예제 파일을 하나 만듭니다.

 

메모장을 열어 위 그림과 같이 코딩 후 저장 할 때 txt 파일이 아닌 모든 파일로 선택 후 test.py 확장자를 py 로 저장 합니다. 파일 위치는 쉽게 D: 나 C: 에 옮겨 놓습니다. 불러오기 편한 곳으로 옮겨 놓습니다.

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using IronPython.Hosting;

namespace CSharp_IronPythonTest
{
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //파이썬 엔진 실행...
            var peEngine = Python.CreateEngine();
            var vScope = peEngine.CreateScope();

            try
            {
                //파이썬 파일 연결
                var vSource = peEngine.CreateScriptSourceFromFile("D:\\test.py");
                vSource.Execute(vScope);

                //파이썬 소스 코드 안 함수들 불러오기...
                var getReturnValue = vScope.GetVariable<Func<string>>("testPythonFunc");
                textBox1.Text = getReturnValue() + System.Environment .NewLine ;

                var vSum = vScope.GetVariable<Func<int, int, int>>("testsum");
                textBox1.Text += vSum(5, 8).ToString();

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }


        }
    }
}

* 예제 결과

 

 

 

반응형

+ Recent posts