خواندن فایل های Excel در سی شارپ

خواندن فایل های Excel

در این مقاله با هم به بررسی نحوه خواندن فایل های Excel می پردازیم. ما یک برنامه ویندوز با استفاده از سی شارپ خواهیم ساخت. علاوه بر آموزش گام به گام به همراه تصاویر سورس این پروژه نیز برایتان در ادامه مطلب قرار داده شده است …

خواندن فایل های Excel

ابتدا ویژوال استودیوی خود را باز کنید. گزینه ی New Project و سپس Windows Form Application را انتخاب کنید.

نامی به انتخاب خود برای آن قرار دهید. من از نام ReadExcelFileApp استفاده کرده ام.

خواندن فایل های Excel

قبل از هر کاری مراجع را از کتابخانه ی Excel ، Reference میدهیم. بر روی Reference در قسمت Solution Explorer راست کلیک کنید. به ترتیب Assemblies ، Extensions و Microsoft.Office.Interop.Excel .

اگر شما از ویژوال استودیوی ۲۰۱۰ استفاده میکنید ، آنگاه میتوانید مراجع را از ۲ طریق Reference دهید :

بر روی References راست کلیک کنید و گزینه ی Add References را انتخاب کنید و پس از پنجره ای نمایش داده میشود.

۱ – به قسمت زیر بروید :

C:/Microsoft Office/Office12/EXCEL.EXE

۲ – تب .NET را انتخاب کنید و گزینه ی Microsoft.Office.Interop.Excel را انتخاب کنید.

خواندن فایل های Excel

پس از افزودن مراجع ، فضای نام using Excel = Microsoft.Office.Interop.Excel را اضافه کنید و بقیه فضای نام ها نیز در تصویر نشان داده شده اند.

دو دکمه ، یکی برای انتخاب و خواندن فایل و دیگری برای بستن بسازید.

یک DataGridView برای مشاهده ی نتیجه نیز بسازید.

خواندن فایل های Excel

یک متد با نام ReadExcel بسازید که برای برگرداندن یک Data Table با استفاده از منطق زیر پیاده میشود :

public DataTable ReadExcel(string fileName, string fileExt) {  
    string conn = string.Empty;  
    DataTable dtexcel = new DataTable();  
    if (fileExt.CompareTo(".xls") == 0)  
        conn = @"provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties='Excel 8.0;HRD=Yes;IMEX=1';"; //for below excel 2007  
    else  
        conn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties='Excel 12.0;HDR=NO';"; //for above excel 2007  
    using(OleDbConnection con = new OleDbConnection(conn)) {  
        try {  
            OleDbDataAdapter oleAdpt = new OleDbDataAdapter("select * from [Sheet1$]", con); //here we read data from sheet1  
            oleAdpt.Fill(dtexcel); //fill excel data into dataTable  
        } catch {}  
    }  
    return dtexcel;  
}  

بیایید کمی در رابطه با متد ReadExcel() صحبت کنیم.

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

اگر فایل دارای فرمت .xls بود ، آنگاه رشته ی اتصال به صورت زیر خواهد بود :

provider=Microsoft.Jet.OLEDB.4.0;Data Source='fileName';Extended Properties='Excel 8.0;HRD=Yes;IMEX=1';

در غیر اینصورت :

Provider=Microsoft.ACE.OLEDB.12.0;Data Source='FileName';Extended Properties='Excel 12.0;HDR=NO';"

در اینجا HDR قسمت header میباشد ، بسته به اینکه بخواهید چیزی اضافه کنید یا خیر.

IMEX=1 نیز برای دریافت داده های ترکیب شده از ستون ها استفاده میشود.

حال با استفاده از خط زیر یک OleDbDataAdapter را تعریف میکنیم :

OleDbDataAdapter oleAdpt = new OleDbDataAdapter("select * from [Sheet1$]", con);

در اینجا sheet1 شماره ی صفحه ایست که میخواهید انتخاب کنید ، میتوانید هر صفحه ای که بخواهید را انتخاب کنید. اگر بخواهید که برخی از ستون های به خصوص را انتخاب کنید ، از این طریق میتوانید. به عنوان مثال شما تنها میخواهید که دو ستون با نام های Name و Salary را از فایل Excel بخوانید ، آنگاه Query شما به صورت زیر خواهد بود :

Select F11,F41,F70 from [Sheet1$]

کد های زیر را در رویداد کلیک دکمه وارد کنید :

private void btnChooseFile_Click(object sender, EventArgs e) {  
    string filePath = string.Empty;  
    string fileExt = string.Empty;  
    OpenFileDialog file = new OpenFileDialog(); //open dialog to choose file  
    if (file.ShowDialog() == System.Windows.Forms.DialogResult.OK) //if there is a file choosen by the user  
    {  
        filePath = file.FileName; //get the path of the file  
        fileExt = Path.GetExtension(filePath); //get the file extension  
        if (fileExt.CompareTo(".xls") == 0 || fileExt.CompareTo(".xlsx") == 0) {  
            try {  
                DataTable dtExcel = new DataTable();  
                dtExcel = ReadExcel(filePath, fileExt); //read excel file  
                dataGridView1.Visible = true;  
                dataGridView1.DataSource = dtExcel;  
            } catch (Exception ex) {  
                MessageBox.Show(ex.Message.ToString());  
            }  
        } else {  
            MessageBox.Show("Please choose .xls or .xlsx file only.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Error); //custom messageBox to show error  
        }  
    }  
}  
  
private void btnClose_Click(object sender, EventArgs e) {  
    this.Close(); //to close the window(Form1)  
}  

پس از انتخاب فایل نتیجه همانند زیر خواهد بود :

خواندن فایل های Excel

امیدوارم از آن لذت برده باشید !
موفق باشید !

داریوش فرخی

داریوش فرخی هستم از سال 92 شروع به یادگیری برنامه نویسی و از سال 93 در بخش برنامه نویسی و تولید محتوای سایت mspsoft.com مشغول هستم. فعالیتم نیز بیشتر در زمینه های برنامه نویسی با سی شارپ و asp.net بوده است. اوقات فراغتم را هم غالبا با تماشای فیلم یا بازی های کامپیوتری پر میکنم .

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

    پریسا پاسخ

    سلام.ممنون بابت متن کاملتون.متد با نام readexcel را کجا باید تعریف کنیم؟

      مسعود شریفی پاسخ

      میتونید روی یک button تعریف کنید.

        حسین پاسخ

        سلام
        من تو خود فروم تعریف کردم اما به درستی ران نمیشه وقتی باتن رو می زنم برنامه متوقف میشه و از اروور not implemented Exception was handled رو میده

          پویا قربانی پاسخ

          نیاز داره خط به خط برسی بشه ، خیلی عوابل بستگی داره.نسخه oldedb یکی از مهترین هاست.

    maryam پاسخ

    با سلام ، ممنون از آموزش خوبتون ، من فایل اکسلی دارم که یکی ز ستونها اون دیتای mix داره (عدد ،space ، کاراکتر ) به این صورت 12345 256/الف ، با ستفاده از IMEX=1 مشکل من حل نشد لطفا راهنمایی کنید (برای یکی دوبار جواب داد اما بعد از اون هر بار که پروژه را اجرا کردم مشکل باز هم وجود داشت )

      مسعود شریفی پاسخ

      خوب میخواید اطلاعات را خوانده و در دیتابیس ذخیره کنید ؟

        maryam پاسخ

        نه اطلاعات در دیتا بیس ذخیره نمی شه ، فقط فایل خوانده شده در دیتا تیبل ذخیره می شود با این connectionstring

        excelConnectionString = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=" + SourceFilePath + ";Extended Properties='Excel 8.0;IMEX=1';";

          مسعود شریفی پاسخ

          پروژه را به نظر من دیباگ کنید خط به خط ببینید چه پیغامی میده و همچنین نوع مقداری که باید در فیلد مورد نظر قرار بده چی هست.شاید از این طریق بشه مشکل رو پیدا کرد.

        maryam پاسخ

        برای مثال تو اکسل این دیتا رو( 709049 عبدشيخي ) تو یکی از ستونها دارم خروجی این سلول در برنامه وقتی فایل اکسل خونده می شه خالی هست

    جواد پاسخ

    با سلام و خسته نباشید.
    پروژه رو اجرا میکنم و فایل هایی با پسوند xls رو انتخاب میکنم و نشون میده ولی وقتی فایل هایی با پسوند xlsx رو انتخاب میکنم با خطای زیر روبرو میشم:
    The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.
    لطفا راهنمایی کنید.
    با تشکر

      مسعود شریفی پاسخ

      provider ی که برای خوانده اطلاعات اکسل کد نویسی شده است فقط روی نسخه 2003 و 97 کار میکنه.

        جواد پاسخ

        خب من اگه بخوام با فایل های xlsx کار کنم باید چیکار کنم؟؟؟
        تو رو خدا راهنماییم کنید.

          مسعود شریفی پاسخ

          یک نمونه به ادرس ایمیل ثبت شده ارسال شد.

            جواد

            خیلی خیلی ازتون ممنونم.

            مسعود شریفی

            موفق باشید.

            علی جان

            کاش اینجا بنویسید که ما هم ببینیم
            توی سیستم من هم همین خطا رو میده

            مسعود شریفی

            مشکل چیست.

            آیدین عباسی

            من هم همین مشکل را دارم. امکانش هست یه نمونه که برای فایل اکسل 2010 به بالا کار خواهد کرد برای من ارسال کنید؟

      ابوالفضل پاسخ

      سلام
      منم دقیقأ همین غرور دارم چه کنم؟،

      ابوالفضل پاسخ

      سلام منم همین مشکل دارم راه حلش چیه؟

    سید حسین حسینی پاسخ

    سلام خسته نباشید میخواستم بدونم که اگه بخوایم هر چی رو تغییر بدیم ذخیره کنیم چیکار باید بکنیم ؟
    و سوال بعدی هم اینکه کامپوننتی وجود نداره که بشه فایل های اکسل رو با فرمت های مختلف خوند ؟
    اگه جواب بدید ممنون میشم !

      مسعود شریفی پاسخ

      باید کانکشن ها ارتباط با حصولات افیس را کاملا مسلط باشید که چنین کاری رو انجام بدید خیلی سخت نیست.

    شهاب پاسخ

    سلام
    ممنون بابت آموزش خوبتون.
    سوالی دارم که مربوط به این قسمت نمیشه ولی میپرسم.
    من تعدادی عدد دارم که "دو به دو" وارد نرم افزار میشن و نیاز دارم معادله خطشون رو بدست بیارم.
    توی اکسل من این نقاط رو select میکنم و بعد نمودارشون رو میبینم و سپس کلید (f(x رو میزنم و معادله خط رو نمایش میده.
    چطوری میتونم از این کتابخانه استفاده کنم؟
    با تشکر

      شهاب پاسخ

      ممنون
      مشکلم حل شد
      با تشکر

    میرزا قاسم پاسخ

    با عرض سلام و خسته نباشید
    آموزش بسیاز مفید و کاربردی ای بود، خدا خیرتان دهد

      مسعود شریفی پاسخ

      خواهش میکنم موفق باشید.

    زهرا پاسخ

    سلام ممنونم عالی بود
    من یه سری اطلاعات رو از اکسل در برنامه خوندم یه سری عملیات روش انجام شد و میخوام دوباره در یک فایل اکسل ذخیره بشه
    چجوری ممکنه نتایج در اکسل ذخیره بشه؟
    ممنونم

      مسعود شریفی پاسخ

      در سایت جستجو کنید ذخیره فایل اکسل را هم قرار دادیم سورس کدش را

    امیر پاسخ

    سلام من یه فایل اکسل دارم که توسط یه نرم افزار دیگه خروجی گرفته شده حالا اون نرم افزار رو نمیدونم چیه ولی مهم اینه که خروجی اکسل داده حالا من میخوام این خروجی اکسل رو داخل دیتا گرید ویو نشون بدم از کد شما استفاده کردم ولی خیلی بهم ریخته نشون میده میخواستم راهنماییم کنین

    محمد حسین پاسخ

    سلام من راهنمایی بیشتری برای اتصال اکسل به سی شارپ می خواهم

      مسعود شریفی پاسخ

      مشکلات خود را مطرح کنید

    محمد حسین پاسخ

    تو رو خدا کمکم کنید

      مسعود شریفی پاسخ

      مشکلات خود را مطرح کنید

    فاطمه پاسخ

    مرسی عااالی بود

    یوسف پاسخ

    سلام. من ویندوز 10 64 بیت و اکسل 2010 64 بیت. برای بنده خطا میده.
    The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine
    چه کنیم؟
    هرچی بود امتحان کردم

      پویا قربانی پاسخ

      از بخش Any Cpu X86 را انتخاب کنید.

      زهرا پاسخ

      سلام،برای منم همین خطا را میده چیکار باید کرد؟
      The ‘Microsoft.ACE.OLEDB.12.0’ provider is not registered on the local machine

        مسعود شریفی پور پاسخ

        نیاز دارید خروجی پروژه را روی X64 تنظیم کنید.

    سپیده پاسخ

    سلام یه راهنمایی می خواستم در مورد اضافه کردن فایل اکسل به برنامم. یه شرح کوچولو از برنامم رو میدم خدمتتون. یه برنامه نوشتم تو سی شارپ که تحت وب هست. از سرویس کلاد آژور استفاده کردم. و با زبان سی شارپ نوشتم. تو ویژال استادیو 2015. الان می خوام به برنامه یه کد هایی اضافه کنم که داده های ورودی 0 و 1 منو از یک فایل اکسل یا یه فایل متلب بگیره. و متاسفانه نمیتونم. یعنی در کل بلد نیستم. در ضمن میتونم تو برنامه داده های خودم رو تو یه گرید ویو تو صفحه وب آفلاین چاپ کنم. ولی از ورودی ها رو از بیرون گرفتن رو بلد نیستم. خیلی ممنون میشم زودتر جوابم رو بدیدد.

    mahmoud پاسخ

    با سلام و خسته نباشید و تشکر از آموزش عالیتان بنده از این روش استفاده کردم و خیلی هم خوبه حالا استاد گرامی چطوری این فایل اکسل رادر بانک اطلاعاتی اکسس ذخیره اش کنیم با تشکر

    bahar پاسخ

    سلام.
    اگه بخوایم روی سیستمی که excel نصب نشده فایل فوق ایجاد شود همچنین اطلاعات از روی همین سیستم خوانده شده و در دیتابیس ذخیره شود چه روشی می بایست انجام شود؟
    عملیات خواندن و ذخیره در دیتابیس از طریق وب سرویس انجام می شود. امکان نصب excel بر روی سیستم وجود ندارد ولی خروجی را می بایست به صورت فایل excel تحویل مشتری شود و بعد از اعمال تغییرات مجددا از روی همین سیستم اطلاعات اصلاح شده در دیتابیس ذخیره سازی شود.

    با تشکر

      مسعود شریفی پور پاسخ

      فقط کافیست هسته ms office را نصب کنید ، بعد خروجی اکسل انجام میشود ، برای نمایش نیز میتوانید فقط نرم افزار اکسل را نصب کنید.