c#

خواندن و نوشتن فایل داده در Excel با استفاده از #C

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

اول از هر کار باید کتابخانه excel را به پروژه اضافه کرد برای این کار از منو زیر استفاده می کنیم

Project => Add Reference...  => COM

و انتخاب گزینه Microsoft Excel 16.0 Object Library

 

خواندن و نوشتن فایل داده در Excel با استفاده از #C

خواندن و نوشتن فایل داده در Excel با استفاده از #C

خواندن فایل Excel

برای این کار اول از همه قسمت های طراحی را آماده می کنیم

خواندن و نوشتن فایل داده در Excel با استفاده از #C

روال کار:

اول از همه با زدن Browse که از OpenFileDialog استفاده می کند، فایل مورد نظر را انتخاب می کنیم. سپس سطر و ستونی را که می خواهیم بخوانیم در جای مربوطه نوشته و دکمه Read را میزنیم تا مقدار موجود در سطر و ستون نوشته شده را بخواند.

و سپس وارد کد می شویم

اول از همه namespace ها را اضافه می کنیم

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;

نکته: همانطور که مشاهده می کنید Microsoft.Office.Interop.Excel را به Excel تغییر داده ایم.

کد مربوط به دکمه Browse

private void btnBrowse_Click(object sender, EventArgs e)
 {
   openFileDialog1.Title = "File 1";
   if (openFileDialog1.ShowDialog() == DialogResult.OK)
   {
      //save selected file name
      filePath = openFileDialog1.FileName;
      lblFilePath.Text = filePath;
   }
 }

کد مربوط به دکمه Read

private void btnRead_Click(object sender, EventArgs e)
 {
   //open excel
   Excel.Application xlApp = new Excel.Application();
   //open workbook
   Excel.Workbook workbook = xlApp.Workbooks.Open(filePath);
   //open sheet
   Excel._Worksheet sheet = workbook.Sheets[1];
   Excel.Range excelFile = sheet.UsedRange;
   int row = int.Parse(txtRow.Text), column = int.Parse(txtColumn.Text);
   lblValue.Text = "Value: " + excelFile.Cells[row, column].Value2.ToString();
   GC.Collect();
   GC.WaitForPendingFinalizers();
   //release com objects to fully kill 
   //excel process from running in the background
   Marshal.ReleaseComObject(excelFile);
   //close and release
   workbook.Close();
   Marshal.ReleaseComObject(workbook);
   //quit and release
   xlApp.Quit();
   Marshal.ReleaseComObject(xlApp);
 }
 

نوشتن در فایل Excel

اول از همه قسمت های طراحی را آماده می کنیم

خواندن و نوشتن فایل داده در Excel با استفاده از #C

روال کار:

اول از همه با زدن Browse که از OpenFileDialog استفاده می کند، فایل مورد نظر را انتخاب می کنیم. سپس سطر و ستونی را که می خواهیم در آن بنویسیم را به همراه مقدار مورد نظر، وارد می کنیم و سپس برای نوشتن دکمه Write را کلیک می کنیم.

و سپس وارد کد می شویم

اول از همه namespace ها را اضافه می کنیم

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;

کد مربوط به دکمه Browse

private void btnBrowse_Click(object sender, EventArgs e)
{
openFileDialog1.Title = "File 1";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
//save selected file name
filePath = openFileDialog1.FileName;
lblFilePath.Text = filePath;
}
}

و سپس کد مربوط به دکمه Write

private void btnWrite_Click(object sender, EventArgs e)
 {
   //open excel
   Excel.Application xlApp = new Excel.Application();
   //open workbook
   Excel.Workbook workbook = xlApp.Workbooks.Open(filePath);
   //open sheet
   Excel._Worksheet sheet = workbook.Sheets[1];
   Excel.Range excelFile = sheet.UsedRange;
   int row = int.Parse(txtRow.Text), column = int.Parse(txtColumn.Text);
   string value = txtValue.Text;
   excelFile.Cells[row, column].Value = value;
   //save changed data in second excel file
   workbook.Save();
   GC.Collect();
   GC.WaitForPendingFinalizers();
   //release com objects to fully kill 
   //excel process from running in the background
   Marshal.ReleaseComObject(excelFile);
   //close and release
   workbook.Close();
   Marshal.ReleaseComObject(workbook);
   //quit and release
   xlApp.Quit();
   Marshal.ReleaseComObject(xlApp);
 }

دانلود پروژه های خواندن و نوشتن در Excel

۲۴ دیدگاه دربارهٔ «خواندن و نوشتن فایل داده در Excel با استفاده از #C»

  1. سلام، وقتتون بخیر
    من میخوام یک فایل اکسل رو تو سی شارپ بخونم یه درونیابی روی سطرها انجام بدم و مجددا نتیجه را در یک فایل اکسل رایت کنم. یعنی در واقع داده های با میانگین سه ساعت هست که باید به یک ساعته تبدیل کنم بین هر سطر دو سطر باید اضافه شود و با درونیابی عدد گذاری شود و در فایل اکسل جدید رایت شود. میتونم خواهش کنم راهنماییم کنی؟ متشکرم.

    1. علیک سلام
      باید در جریان جزئیات قرار بگیرم تا بتوانم کمک کنم. اگر صرفا استخراج ستونی از فایل و تغییر داده های آن و ذخیره آن در فایل دیگر باشد، در واقع شما باید این دو پروژه را با هم ادغام کنید. اگر کمکی هم از دست من برمی آید در خدمتم.

  2. فایلی که شما زحمت کشیدید و گذاشتید رو هم باز میکنم خطا میده!
    Exception Text **************
    System.FormatException: Input string was not in a correct format.
    at System.Number. StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
    ….at System.Number.ParseInt32(String s, NumberStyles style,

    1. این خطا به خاطر وارد کردن حرف به جای عدد می باشد. به احتمال زیاد شما حرف ستون را در قسمت ستون وارد می کنید. این مثال برای درک نحوه خواندن و نوشتن می باشد و بخاطر همین بررسی خطا در نظر گرفته نشده است. لطفا سطر و ستون را به عدد وارد کنید مانند سطر ۱ و ستون ۲. عددها هم مثل آرایه از صفر شروع می شوند.
      باز هم اگر خطایی بود، خوشحال می شوم اگر اطلاع دهید.

  3. پروژه Read این خطا رو میده

    Unable to cast COM object of type ‘Microsoft.Office.Interop.Excel.ApplicationClass’ to interface type ‘Microsoft.Office.Interop.Excel._Application’. This operation failed because the QueryInterface call on the COM component for the interface with IID ‘{000208D5-0000-0000-C000-000000000046}’ failed due to the following error: Library not registered. (Exception from HRESULT: 0x8002801D (TYPE_E_LIBNOTREGISTERED)).’

    1. این خطا به احتمال زیاد مربوط به کتابخانه excel می باشد. خطا از کد نیست بلکه مربوط به library ماکروسافت است. به احتمال زیاد هم از کتابخانه رجیستر نشده استفاده کرده اید. من برای نوشتن این کد از آفیس ۲۰۱۶ و ویژوال ۲۰۱۵ استفاده کرده ام و مشکلی هم نداشتم.

  4. میخواهم فایل اکسل را درون برنامه بارگذاری کنم و سطر و ستون هایی را از آن انتخاب کنم و درون جدول از پیش ساخته ای ذخیره کنم
    خلاصه بگم جدولی ساخته ام ُمیخواهم اکسل ها متفاوتی را با برنامه ام باز کنم و ستون های مورد نیازم را در جدولم ذخیره کنم

    1. تا آنجایی که فهمیدم در واقع شما چند فایل اکسل دارید که می خواهید داده های آنها را در یک فایل اکسل ذخیره کنید و یا به اصطلاح merge کنید. برای این کار باید این دو پروژه را با هم ادغام کنید یعنی خواندن و سپس نوشتن که خواندن از آن چند فایل و نوشتن در فایل مورد نظر.
      اگر بخواهید چند فایل را لود کرده و سپس با انتخاب کردن به فایل مورد نظر انتقال دهید، باید چند قسمت برای باز کردن فایل ها داشته باشید و سپس آنها را لود کرده و در گرید و یا لیستی نمایش دهید که با کلیک کردن در آن لیست و تعیین سطر و ستون، به فایل مورد نظر انتقال یابد.

  5. سلام اقا میشه کدی در اختیارم قرار دهید که چند فایل اکسل را دونه دونه به گرید ویو اضافه کنم(بعضی از ستون های ان بر اساس شماره ستون) و در اخر که چند فایل اکسلم داخل گرید ویدو اضافه شدند ، جمع یک ستون رو در اخر ان درج کنه، و خروجی اکسل بگیرم
    توضیح کارم گزارش مالی ماهانه شرکت رو دارم، میخوام فصلی یا سالانه با نرم افزار ادغامشون کنم
    حیرانم بخدا

    1. سلام دوست عزیز
      این چیزی که شما می خواید کار می خواد. نه میشه گفت یه پروژه س و نه میشه گفت یه کد ساده. کمی نیاز به کار داره. این کدی که من گذاشتم مثال هستش. اگر خودتون برنامه نویس هستید که باید تو اینترنت دنبال تیکه کدها بگردید و به هم وصل کنید و اگر نه بهتره بسپرید به یه برنامه نویس.

  6. سلام اقا این کد الان من بخوان بهش بگم مثلا ستون های ۲-۵-۸-۹ رو و همچنین از سطر دوم یا سوم تا اخر فایل اکسل رو بخونه و درون دیتا گرید نشون بده، به چه صورت میشه؟؟؟؟؟

    1. علیک سلام
      باید تغییراتی در کد بدید. برای مثال شماره ستون ها رو اول بگیره بعد در آرایه ای ذخیره کنه بعد شروع به خواندن ستون ها کنه که برای خواندن سطر ها باید حلقه استفاده کنید.
      اگر سطری موجود نباشه برنامه خظا خواهد داد که باید خودتون خطاها رو کنترل کنید.

  7. سلام با تشکر از استاد و کدی که قرار دادید من خیلی سی شارپ بلد نیستم ولی با تغییراتی که روی کد دادم توانستم کاری که لازم دارم را انجام دهم و کد برایم بسیار مفید بود فقط مشکل اینه که بسیار کند اطلاعات را می خواند راهی برای سرعت دادن به خواندن از فایل وجود نداره

  8. سلام. وقتتون بخیر
    ببخشید من متوجه این قسمت توضیحاتتون نمیشم و پیداش هم نمیکنم
    “اول از همه با زدن Browse که از OpenFileDialog استفاده می کند، فایل مورد نظر را انتخاب می کنیم. سپس سطر و ستونی را که می خواهیم در آن بنویسیم را به همراه مقدار مورد نظر، وارد می کنیم و سپس برای نوشتن دکمه Write را کلیک می کنیم.”

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

  9. سلام مجدد
    ببخشید من نیاز به یه توضیح دارم.ببینید من نیاز به یه کد دارم کخ یه فایل اکسل ۲ در ۲ که مربوط به مسافت هست را بخونه.
    خب حالا این دکمه هایی که توضیح دادین چیه و مربوز به کدوم قسمته؟

    1. علیک سلام مجدد
      در قسمت خواندن فایل باید کدهای داخل دکمه Read رو در for تو در تو که از صفر شروع میشه و تا کمتر از ۲ ادامه داره، قرار بدید و بجای مقادیر خوانده شده از تکست باکس، عدد شمارنده ها رو قرار دهید.

  10. سلام من مشکلی با خواندن و نوشتن اکسل نداشتم ولی وقتی پروژه رو Release کردم اجرا نمیشه و خطا میده
    could not load file ‘excel datareader version 3.6.0.0 …………

    1. علیک سلام
      نکته ی اولی که باید در نظر بگیرید این هست که من در این آموزش خظا ها را کنترل نکرده ام و اگر می خواهید در پروژه واقعی از آن استفاده کنید باید خودتان کنترل خظا داشته باشید (try-catch)
      نکته بعدی اینکه از حروف بعنوان سطر و یا ستون استفاده نکنید. این کد فقط عدد قبول می کند مانند ستون صفر نه ستون a
      نکته ی بعدی اینکه من از vs2015 استفاده کرده ام
      اگر مراحل را درست انجام داده باشید (مانند افزودن Microsoft Excel 16.0 Object Library) نباید شاهد خطایی باشید. چون من خودم پروژه را اجرا کرده ام و خطایی هم مشاهده نشده.

  11. سلام وقت بخیر من میخوام در یه پروژه C# با دوتا datagridview یکی از mysql داده بخونه و یکی از اکسل قسمت اکسل مشکل دارم چطور باید بنویسم؟

    1. علیک سلام
      شرمنده بخاطر دیر جواب دادن. تو قسمتی که می خواید داده ها رو از ایکسل بخونید کد زیر رو تو حلقه تو در تو قرار بدید و داده های خوانده شده رو بریزید تو datatable
      lblValue.Text = “Value: ” + excelFile.Cells[row, column].Value2.ToString();
      یا کد زیر رو هم میتونید امتحان کنید
      private void button1_Click(object sender, EventArgs e)
      {
      String name = “Items”;
      String constr = “Provider=Microsoft.ACE.OLEDB.12.0;Data Source=” +
      “C:\\Sample.xlsx” +
      “;Extended Properties=’Excel 12.0 XML;HDR=YES;’;”;

      OleDbConnection con = new OleDbConnection(constr);
      OleDbCommand oconn = new OleDbCommand(“Select * From [” + name + “$]”, con);
      con.Open();

      OleDbDataAdapter sda = new OleDbDataAdapter(oconn);
      DataTable data = new DataTable();
      sda.Fill(data);
      grid_items.DataSource = data;
      }

      1. سلام ممنون بابت راهنماییتون
        شرمنده مشکل دیگه تی هم دارم
        چطور میتونم اطلاعاتی که تو یک دیتا گرید ویو هست رو انتقال بدم به mysql ذخیره کنه
        و یه سوال دیگه
        چطور میتونم تو پروژه ای که دارم دیتا بیس هایی که ساختم قبلا یا بعدا ساخته میشه با هربار اجرای این برنامه نمایش بدم
        ینی تقریبا میخوام برنامه ای بنویسم که کل فضای local host رو نشون بده تمام دیتا بیس هام و جداول و مقداری داخل جداول و…

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.