Thursday, December 30, 2021

WinForm Read Excel file using OLEDB in Hindi

इस पोस्ट में मैंने दिखाया है कि कैसे किसी एक्सेल फाइल को हम OLEDB तकनीक के द्वारा रीड कर सकते हैं।

Approaches To Read Excel Data

माइक्रोसॉफ्ट एक्सेल फाइल के डाटा को रीड करने के लिए हमारे पास कई अलग-अलग तकनीक है जैसे OLEDB, VSTO, XML इत्यादि। OLEDB के अंतर्गत विभिन्न प्रकार के डाटा सोर्स को क्लाइंट डॉटनेट एप्लीकेशन द्वारा रीड किया जा सकता है। इसके द्वारा हम एक्सेल के डाटा को रीड कर सकते हैं लेकिन एक्सल के डाटा की फॉर्मेटिंग को यह रीडिंग नहीं कर सकता हैं इसके विपरीत VSTO के द्वारा एक्सेल के डेटा को उसकी फोर्मेटिंग सहित रीड कर सकते हैं। ओपन XML की तकनीक के द्वारा भी एक्सेल फाइल को रीड किया जा सकता है। इस तरह, तीन अलग-अलग तकनीक उपलब्ध है जिनकी सहायता से हम एक्सेल फाइल को रीड कर सकते हैं। इन तीनों तकनीक की अपनी-अपनी विशेषताएं और सीमाएं हैं। जहां तक VSTO की सहायता से एक्सेल या किसी अन्य ऑफिस फाइल को रीड करने की बात है यह COM टेक्नोलॉजी के ऑब्जेक्ट्स के ऊपर Wrapper ऑब्जेक्टस बनाता है और ये wrapper ऑब्जेक्ट्स इंटरफ़ेस के रूप में कार्य करते हैं और क्लाइंट डॉटनेट एप्लीकेशन इनकी सहायता से COM टेक्नोलॉजी के साथ कम्युनिकेशन स्थापित कर लेता है और डाटा को रीड करता है। VSTO और ओपन XML टेक्नोलॉजी के बारे में अलग पोस्ट में उनकी विशेषताओं और सीमाओं का उल्लेख करेंगे। 

OLEDB Technology

System.Data.Oledb नेमस्पेस के अंतर्गत विभिन्न प्रकार के क्लासेज है जिनकी सहायता से हम अलग-अलग तरह के डाटा सोर्स के डाटा को कम्युनिकेट कर सकते हैं। एक्सएल फाइल को रीड करने के लिए आमतौर पर डॉट नेट टेक्नोलॉजी के अंतर्गत हम System.Data.Oledb नेमस्पेस का उपयोग करते हैं। System.Data.Oledb नेमस्पेस डाटा प्रोवाइडर है जो एक्सेल फ़ाइल के data को provide करता है। 

Data Provider

डाटा प्रोवाइडर का कार्य है यह है कि वह डाटा सोर्स के डाटा को प्राप्त कर क्लाइंट एप्लीकेशन को प्रदान करें लेकिन बिहाइंड द सीन डाटा प्रोवाइडर का मुख्य कार्य यह है कि डाटासोर्स के भीतर डाटा जिस डाटा टाइप में है उस डाटा टाइप का रूपांतरण क्लाइंट एप्लीकेशन के डाटा टाइप के अनुरूप किया जाए ताकि क्लाइंट एप्लीकेशन डाटा का उपयोग कर सकें। उदाहरण के लिए अगर सी शार्प डॉटनेट टेक्नोलॉजी के अंतर्गत कोई एप्लीकेशन है तो उसके अनुरूप जो डाटा टाइप्स है उसकी mapping डाटासोर्स के डाटा टाइप के साथ होनी चाहिए। इन सारे कार्यों को डाटा प्रोवाइडर करता है ताकि क्लाइंट एप्लीकेशन अपने डेटा टाइप के अनुसार मैप किए हुए डाटा को प्राप्त कर सके और डाटा का उपयोग कर सके।

System.Data.OledbClient डाटा प्रोवाइडर का उपयोग माइक्रोसॉफ्ट एक्सेल, एक्सेस जैसे एप्लिकेशन के डाटा को प्राप्त करने के लिए किया जाता है। System.Data.OdbcClient डाटा प्रोवाइडर का उपयोग विभिन्न प्रकार के डाटाबेस के डेटा को एक्सेस करने हेतु किया जाता है। SQL सर्वर और ओरेकल जैसे डेटाबेस के लिए खास डाटा प्रोवाइडर है। SQL Server डेटाबेस के लिए उपयोग किए जाने वाले डाटा प्रोवाइडर का नाम System.Data.SqlClient है। इसी प्रकार ओरेकल डाटाबेस के लिए उपयोग किए जाने वाले डाटाप्रोवाइडर का नाम System.Data.OracleClient है।

नीचे के चित्र में विंडोज फॉर्म दिखाया गया है जिसमें यूज़र किसी एक्सेल फाइल को सिलेक्ट बटन को क्लिक कर सिलेक्ट कर सकता है।

जब यूजर एक्सेल फाइल को सेलेक्ट करता है तब एक्सेल फाइल के भीतर जितने भी सीट्स होते हैं वह सारे सीट्स लिस्ट बॉक्स के भीतर दिखाई देने लगते हैं।

यूज़र जब लिस्ट बॉक्स के किसी सीट को सेलेक्ट कर लोड बटन को क्लिक करता है तो डाटाग्रिडव्यू कंट्रोल के भीतर उस एक्सेल शीट के डाटा दिखाई देने लगते हैं

यूज़र जब Data सीट को सेलेक्ट कर लोड बटन को क्लिक करता है तो डाटाग्रिडव्यू कंट्रोल के भीतर Data शीट के डाटा दिखाई देने लगते हैं। चित्र में डाटा ग्रिड व्यू में कुछ स्थान रिक्त दिख रहा है। इस रिक्त स्थान को भरने के लिए Designation कॉलम को Fill प्रोपर्टी देना होगा ताकि यह रिक्त स्थान भर सके।

C# Code Written in Visual Studio:


using System;
using System.Data;
using System.Windows.Forms;
using System.Data.OleDb;

namespace ExcelReaderOLEDB
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void SelectButton_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "Select file.";
            ofd.Filter = "Excel File(*.xls;*.xlsx)|*.xls;*.xlsx";
            ofd.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                FilePathTextBox.Text = ofd.FileName;
                LoadButton.Enabled = true;
                ListSheets();
            }
        }

        private void ListSheets()
        {
            string xlfile = FilePathTextBox.Text;
            string connstr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + xlfile + ";Extended Properties='Excel 12.0 Xml;HDR=YES'";
            using (OleDbConnection conn = new OleDbConnection(connstr))
            {
                conn.Open();
                DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                foreach (DataRow dr in dt.Rows)
                {
                    if (dr["TABLE_NAME"].ToString().IndexOf("$") > 0)
                    {
                        SheetListBox.Items.Add(dr["TABLE_NAME"].ToString());
                    }
                }
                conn.Close();
            }
        }

        private void LoadButton_Click(object sender, EventArgs e)
        {
            string xlfile = FilePathTextBox.Text;
            string connstr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + xlfile + ";Extended Properties='Excel 12.0 Xml;HDR=YES'";
            using (OleDbConnection conn = new OleDbConnection(connstr))
            {
                using (OleDbCommand cmd = new OleDbCommand())
                {
                    cmd.CommandType = System.Data.CommandType.Text;
                    if (SheetListBox.SelectedItem != null)
                    {
                        cmd.CommandText = "SELECT * FROM [" + SheetListBox.SelectedItem.ToString() + "A1:K20]";
                        cmd.Connection = conn;
                        OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
                        DataSet ds = new DataSet();
                        conn.Open();
                        adapter.Fill(ds, "+SheetListBox.SelectedItem.ToString()+");
                        DataGridView1.Columns.Clear();
                        DataGridView1.DataSource = ds.Tables[0];
                        conn.Close();
                    }
                    else
                    {
                        if (FilePathTextBox.Text.Trim() == string.Empty)
                        {
                            MessageBox.Show("Please select file.", "Excel", MessageBoxButtons.OK);
                            FilePathTextBox.Focus();
                        }
                        else
                        {
                            MessageBox.Show("Please select a sheet.", "Required", MessageBoxButtons.OK);
                            SheetListBox.SelectedIndex = 0;
                        }

                    }

                }
            }
        }
    }
}

Good Reference


© अजीत कुमार, सर्वाधिकार सुरक्षित।

इस आलेख को उद्धृत करते हुए इस लेख के लिंक का भी विवरण दें। इस आलेख को कॉपीराइट सूचना के साथ यथावत साझा करने की अनुमति है। कृपया इसे ऐसे स्थान पर साझा न करें जहाँ इसे देखने के लिए शुल्क देना पडे।

No comments:

Post a Comment

Hot Topics