PDA

View Full Version : آموزش: نحوه Export و Import کردن فایل Excel



mrprestige
پنج شنبه 08 مهر 1395, 23:33 عصر
عرض سلام و ادب خدمت تمامی دوستان ، همونطور که از عنوان تایپیک مشخصه خواستم آموزشی بر همین مبنا بزارم تا کمکی بشه به یک سری از دوستان که بتونن از پس این کار بربیان . خب بدون اتلاف وقت میرم سر اصل قضیه

نحوه Export کردن :

در مرحله اول یه پروزه WinForm ایجاد میکنیم و داخل Refrence هامون فایل کتابخانه ای Microsoft.Office.Interop.Excel رو اضافه میکنیم ( اگر این Dll رو نداشتید از Nuget (https://www.nuget.org/packages/Microsoft.Office.Interop.Excel/) دانلود کنید ) سپس تو قسمت NameSpace هامون using Microsoft.Office.Interop.Excel; رو اضافه میکنیم . خب اول بریم سر طراحی فرم . اول یه DataGridview به فرم اضافه میکنیم و یک کنترل Button . کنترل DataGridview رو به پایگاهتون متصل کنید ( به هر نحوی که مایل بودید بنده اینجا برای پیش فرض بصورت ویزارد اینکار رو کردم) خب وارد رویداد Click مربوط به Button میشیم ( بنده برای اینکه کد هر بخش رو توضیح بدم که چه کاری رو انجام میدن کدها رو بخش بندی کردم )
خب در این بخش اومدم اول برای اینکه فایل اکسل رو ایجاد کنم از این کد ها استفاده کردم

var mg = Missing.Value;
_Application app = new Microsoft.Office.Interop.Excel.Application();
_Workbook wrkbook = app.Workbooks.Add(mg);

در بخش بعد برای اینکه sheet هام رو ایجاد کنم و حصول اطمینان از اینکه Worksheet من null نیست اومدم از دو روش casting استفاده کردم و همینطور نامگذاری صفحه کاری

app.Visible = false;
_Worksheet wrksheet = wrkbook.Sheets["Sheet1"] as Worksheet;
if (wrksheet == null) throw new ArgumentNullException(nameof(wrksheet));
wrksheet = (Worksheet) wrkbook.ActiveSheet;
wrksheet.Name = "Export";





در بخش بعد میرسیم به Header ستون ها که از Datagridview منتقل بشه به فایل اکسل

for (var i = 1; i < dataGridView1.Columns.Count + 1; i++)
{
wrksheet.Cells[1, i] = dataGridView1.Columns[i - 1].HeaderText;
}


در بخش بعد اومدم دوتا For تو در تو ایجاد کرم برای انتقال سطرها (حلقه اول) و ستون ها (حلقه دوم ) DGV به فایل اکسل

for (var i = 0; i < dataGridView1.Rows.Count - 1; i++)
{
for (var j = 0; j < dataGridView1.Columns.Count; j++)
{
wrksheet.Cells[i + 2, j + 1] = dataGridView1.Rows[i].Cells[j].Value.ToString();
}
}

خب در بخش انتهایی هم برای اینکه فایل اکسل ایجاد شده رو ذخیره کنیم از این کد استفاده کردم و در آخر نیز از app خارج میشیم

var saveofd = new SaveFileDialog {Filter = "Excel Document (*.xlsx)|*.xlsx ", FileName = "Export"}; //استفاده کنید xls اگه نسخه فایل اکسل شما 2007 به پایین هست از پسوند
if (saveofd.ShowDialog() == DialogResult.OK)
{
wrkbook.SaveAs(saveofd.FileName, mg, mg, mg, mg, mg,
XlSaveAsAccessMode.xlExclusive, XlSaveAsAccessMode.xlExclusive, XlSaveAsAccessMode.xlExclusive,
XlSaveAsAccessMode.xlExclusive, XlSaveAsAccessMode.xlExclusive, XlSaveAsAccessMode.xlExclusive);
}
app.Quit();


نحوه Import کردن :
اول یک Datagridview و دو کنترل Button (با نام های btnImport و btnRead ) و یک کنترل Textbox ( با نام txtFileAddress ) ایجاد میکنیم

خب اول میخوایم فایل اکسل مورد نظرمون رو open کنیم در رویداد click دکمه btnRead اینطور مینویسیم

var ofd = new OpenFileDialog
{
Title = "Select file",
FileName = txtFileAddress.Text,
Filter = "Excel Sheet(*.xlsx)|*.xlsx|All Files(*.*)|*.*", //استفاده کنید xls اگه نسخه فایل اکسل شما 2007 به قبل هست از پسوند
FilterIndex = 1
};
if (ofd.ShowDialog() == DialogResult.OK)
txtFileAddress.Text = ofd.FileName;

و در کنترل btnImport اینو بنویسید

var cn =
new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + txtFileAddress.Text +
";Extended Properties='Excel 12.0 Xml;HDR=Yes;IMEX=1;TypeGuessRows=0;ImportMixedType s=Text'");
var oda = new OleDbDataAdapter("Select * From[Export$]", cn); // درواقع نام همون صفحه فایل اکسل مون هستExport
var dt = new DataTable();
oda.Fill(dt);
dataGridView1.DataSource = dt;



این نکته رو خوب توجه داشته باشید، اگه شما از نسخه ی پایین تر اکسل (2007 به قبل ) استفاده میکنید باید ConnectionString تون به این شکل بنویسید

"Provider = Microsoft.Jet.OLEDB.4.0; Data Source=" + txtFileAddress.Text+ ";Extended Properties =\"Excel 8.0; HDR=Yes;\";"

کلام آخر اینکه امیدوارم که این مطلب براتون گیرا و مفید فایده قرار بگیره .

پیروز و سربلند و موفق باشید .

titrajh
پنج شنبه 27 آبان 1395, 08:39 صبح
سلام دوست عزیز
از کمکتون ممنونم
ولی برا من اطلاعاتی که از اکسل میخونه تو دیتا گرید او عددهایی که توشون حرف هست رو نشون نمیده تو دیتا گرید
همه فرمتهارو تو اکسل چک کردم تنها تو فرمت text اونارو میاره ولی اعدادی که ارقامشون بزرگ هست رو قاطی میکنه

mrprestige
جمعه 28 آبان 1395, 13:37 عصر
سلام دوست من وقتت بخیر ، ای کاش سوالت رو واضح تر میپرسیدی اونطور که من متوجه شدم شما توی فایل اکسلتون عدد و حروف رو باهم ذخیره دارید ولی تا میاید اون رو به دیتاگرید import کنید بهم ریخته نشون میده . خب لازمه چند نکته رو رعایت کنید اول اینکه مطمئن بشید فرمتی که در اکسل باهاش کار میکنید General باشه دوم اینکه از Right To Left و یا Left To Right دیتاگرید مطمئن بشید

تصویر شماره 1 (http://s9.picofile.com/file/8275145300/2.JPG)

تصویر شماره 2 (http://s8.picofile.com/file/8275145526/1.JPG)

titrajh
شنبه 29 آبان 1395, 08:02 صبح
سلام
ممنون که جواب دادین
مشکل اصلی اینجاست که اکسل حاوی یسری شماره سریال هست که بعضیاش توشون حرف دارن وقتی اینا وارد دیتا گرید میشن اونایی که فقظ عدد هستن رو نشون میده ولی اونایی که حرف دارن نشون داده نمیشه
فرمت هم general هست

تصویر 1 (http://s8.picofile.com/file/8275231626/a.JPG)

تصویر 2 (http://s8.picofile.com/file/8275231692/b.JPG)

titrajh
شنبه 29 آبان 1395, 08:24 صبح
در ضمن اینم اشاره کنم که وقتی اکسل رو تفکیک میکنم یعنی اعدادرو تو یه اکسل و حرف هارو تو اکسل جداگانه ادد میکنم میاره حروفرو هم
نمیدونم باید چیکار کنم

mrprestige
یک شنبه 30 آبان 1395, 15:13 عصر
خب اینطوری نمیشه پاسخ داد . کدهاتون رو بزارید تا اگه من هم نتونستم پاسختون رو بدم بقیه دوستان بتونن پاسختون رو بدن .

titrajh
دوشنبه 01 آذر 1395, 12:30 عصر
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
OpenFileDialog1.Filter = "Exel File(*.xlsx)|*.xlsx|PDF File(*.pdf)|*.pdf|Word Document File(*.doc)|*.doc|All Files(*.*)|*.*"
OpenFileDialog1.FilterIndex = 1
OpenFileDialog1.FileName = "انتخاب فایل"
OpenFileDialog1.Title = "مسیر فایل"
OpenFileDialog1.Filter.ToString()




OpenFileDialog1.ShowDialog()


PrmPathExcelFile = OpenFileDialog1.FileName
End Sub








Private Sub Button8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button8.Click
Try


Dim DtSet As System.Data.DataSet
Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
MyConnection = New System.Data.OleDb.OleDbConnection("provider=Microsoft.ACE.OLEDB.12.0; " & "data source='" & PrmPathExcelFile & " '; " & "Extended Properties=Excel 12.0 XMl")
MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [sheet1$]", MyConnection)
MyCommand.TableMappings.Add("Table", "Attendence")
DtSet = New System.Data.DataSet
MyCommand.Fill(DtSet)




DataGridView6.DataSource = DtSet.Tables(0)
MyConnection.Open()


Catch ex As Exception


MessageBox.Show(" مسیر فایل را مشخص کنید")
End Try
End Sub