جستجو درفایل اکسل در سی شارپ

در این مقاله ما فراخواهیم گرفت که چگونه در ویندوز فرم در فایل Excel عمل جستجو را انجام دهیم .گاهی اوقات نیاز به تعامل با یک فایل اکسل از طریق برنامه ما وجود دارد. هدف از این مثال این است که نشان دهد چگونه این عمل امکان پذیر است. ما از ADO.Net استفاده میکنیم

جستجو درفایل اکسل در سی شارپ

جستجو درفایل اکسل در ویندوزفرم

گاهی اوقات نیاز به تعامل با یک فایل اکسل از طریق برنامه ما وجود دارد. هدف از این مثال این است که نشان دهد چگونه این عمل امکان پذیر است. ما از   ADO.Net استفاده میکنیم ، فضای نام OLEDB  برای مدیریت دسترسی به فایل های مایکروسافت استفاده میشود . این فضای نام کلاس هایی است که ما می توانیم با استفاده از به تعامل با منابع داده ها مثل Excel، Access و انواع فایل های دیگر بپردازیم .زمانی که کدرا تجزیه و تحلیل میکنیم در آن کلاس های OleDbConnection و OleDbCommand را خواهیم یافت  که  ابزار های تاریخی اصلی که ما را به یک منبع داده متصل می کند.

    private DataSet _ds;  
    private DataTable _tb;  
    private BindingSource _bs;  
      
    private void Form1Load(object sender, EventArgs e)  
    {  
        _ds = new DataSet();  
        _tb = new DataTable();  
        _bs = new BindingSource();  
      
        var myConnection = new OleDbConnection(@"provider=Microsoft.ACE.OLEDB.12.0;data source=E:\demo.XLSx;Extended Properties=Excel 12.0;");  
        var myCommand = new OleDbDataAdapter("SELECT * FROM [Foglio1$]", myConnection);  
        myCommand.Fill(_tb);  
        _ds.Tables.Add(_tb);  
        _bs.DataSource = _ds.Tables[0];  
    }   

کد بالا در رویداد FormLoad  نوشته شده است در ایتدا یک کنترل Dataset تعریف کردیم که خالی میباشد و بعدا به آن یک یا چند جدول اضافه میشود و به ما اجازه میدهد زمانی که ارتباط با Datasource قطع است با آن کار کنیم.

ما یک کنترل DataTable تعریف کردیم که شامل سطره ها و ستون ها می باشد و تمام اطلاعاتی که مااز منبع داده میخوانیم را شامل میشود.

کنترل آخر (BindingSource) که برای انجام عمل جستجو و نمایش اطلاعات در خروجی استفاده میشود.

بلافاصله بعد از استفاده از کلاس OleDbConnection  یک رشته اتصال برای منبع داده تعریف میکنیم که

Data Provider نامیده میشود که با توجه به نسخه ای از Office که ما قصد استفاده از آنرا داریم که در این مورد مااز Office 2007 استفاده کردیم ، نسخه آفیس را میدهیم (ACE.OLEDB.12.0) و رشته اتصال که باید به محل دقیق این فایل روی دیسک اشاره کند توجه داشته باشید که در صورتی که فایل یافت نشود یک Exception در زمان اجرا از نوع File not found exception تولید خواهد شد پس اطمینان حاصل شود که فایل در مسیر مشخص در رشته اتصال وجود داشته باشد.

پس ازآن ما فقط به تعریف کلاس OledbDataAdapter نیاز داریم که معرف کنترل ها از یک مجموعه از داده و یک اتصال پایگاه داده که برای پرکردن یک DataSet و ویرایش منبع داده استفاده میشود در این مرحله با استفاده از متد Add ما اضافه کردیم یک جدول به کنترل DataSet و خصوصیت DataSource ازجدول BindingSource را اختصاص دادیم که با هر اطلاعاتی که از منبع داده گرفته شود پر میشود.

بعد از این مرحله ما در حافظه تمامی اطلاعات مورد نیاز برای جستجو را داریم فرض کنید که فایل اکسل به نام demo.xlsx  داریم که شامل سه ستون به شکل زیر میباشد:

ما جستجو را با استفاده از کنترل BindingSource انجام خواهیم داد یعنی برای فیلتر قطعه کد زیر را در نظر بگیرید:

  private void TextBoxValidated(object sender, EventArgs e)  
    {  
        if (ReferenceEquals(sender, txtName))  
        {  
            Trova((TextBox)sender, "Name");  
        }  
        else if (ReferenceEquals(sender, txtFamily))  
        {  
            Trova((TextBox)sender, "Family");  
        }  
        else if (ReferenceEquals(sender, txtCountry))  
        {  
            Trova((TextBox)sender, "Country");  
        }  
    }  
      
    private void Trova(Control textBox, string nomeColonna)  
    {  
        _bs.Filter = String.Concat(nomeColonna, " ", "LIKE '", textBox.Text, "*'");  
        DataGridView1.DataSource = _bs;  
    }  

ما رویداد های اعتبارسنجی کنترل TextBox را مدیریت میکنیم هر سه TextBox به یک رویداد TextBoxValidated متصل شده اند بااستفاده از متغیر Sender ما آنرا به کنترل TextBox تبدیل میکنیم و نام TextBox را به متد Trova میدهیم این متد دو پارامتر ورودی نیاز دارد اولی textBox ی که انتخاب شده و دوم نام آن .جستجو براساس یک رشته از کاراکترها به عنوان مثال نام ،فامیلی یا کشور میتواند انجام شود.

همانطور که گفته شد ما از خصوصیت فیلتر که دریافت یا تنظیم  فیلتر برای نمایش سطرها استفاده کردیم.

این اساسا یک پرس و جوی SQL است ولی ما میتوانیم برای نیازهایمان آنها را وفق  دهیم. برای به پایان رساندن نتایج جستجو این رابه یک کنترل GridView اختصاص میدهیم و برای اینکار از خصوصیت DataSource گریدویو استفاده میکنیم.

برای انجام جستجو شما در کنترل های TextBox نام ، فامیلی یا کشور را وارد کنید و نتیجه در گرید نمایش داده میشود

کد کامل به شکل زیر خواهد شد:

 using System;  
    using System.Data;  
    using System.Windows.Forms;  
    using System.Data.OleDb;  
      
    namespace ExcelTextCS  
    {  
        public partial class Form1 : Form  
        {  
            private DataSet _ds;  
            private DataTable _tb;  
            private BindingSource _bs;  
      
            public Form1()  
            {  
                InitializeComponent();  
            }  
      
            private void Form1Load(object sender, EventArgs e)  
            {  
                _ds = new DataSet();  
                _tb = new DataTable();  
                _bs = new BindingSource();  
      
                var myConnection = new OleDbConnection(@"provider=Microsoft.ACE.OLEDB.12.0;data source=E:\demo.XLSx;Extended Properties=Excel 12.0;");  
                var myCommand = new OleDbDataAdapter("SELECT * FROM [Foglio1$]", myConnection);  
                myCommand.Fill(_tb);  
                _ds.Tables.Add(_tb);  
                _bs.DataSource = _ds.Tables[0];  
            }  
      
   private void TextBoxValidated(object sender, EventArgs e)  
    {  
        if (ReferenceEquals(sender, txtName))  
        {  
            Trova((TextBox)sender, "Name");  
        }  
        else if (ReferenceEquals(sender, txtFamily))  
        {  
            Trova((TextBox)sender, "Family");  
        }  
        else if (ReferenceEquals(sender, txtCountry))  
        {  
            Trova((TextBox)sender, "Country");  
        }  
    }  
      
    private void Trova(Control textBox, string nomeColonna)  
    {  
        _bs.Filter = String.Concat(nomeColonna, " ", "LIKE '", textBox.Text, "*'");  
        DataGridView1.DataSource = _bs;  
    }  
        }  
    }