PDA

View Full Version : جستجو در یک فایل اکسل



mahdi68
یک شنبه 27 فروردین 1391, 12:00 عصر
سلام
چطوری میتونم با سی شارپ در یک فایل اکسل یک کلمه جستجو کنم و وقتی اون کلمه در یک سطر پیدا کرد کل اون سطر به عنوان رشته برگردونه ؟

Alghoochi
یک شنبه 27 فروردین 1391, 12:53 عصر
سلام
چطوری میتونم با سی شارپ در یک فایل اکسل یک کلمه جستجو کنم و وقتی اون کلمه در یک سطر پیدا کرد کل اون سطر به عنوان رشته برگردونه ؟

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

mahdi68
یک شنبه 27 فروردین 1391, 18:11 عصر
می‌تونی فایل اکسل رو باز کنی و سطر به سطر بخونی
خوب برای انجام این چیکار باید بکنم ؟

سوداگر
یک شنبه 27 فروردین 1391, 18:36 عصر
تا ریختن اطلاعات توی دیتا گرید ویو رو نوشتم فقط کافیه دستور اس کیول رو تغییر بدی (به جای SheetName اسم جدول مورد نظر رو بذار، اون تکست باکس هم تشریفاتی بود:خجالت:)
از کمبو باکس هم باید نوع فایل ورودی رو انتخاب کنی.
موفق باشید

Alghoochi
یک شنبه 27 فروردین 1391, 23:17 عصر
من کدی که دوستمون نوشتن رو ندیدم و نمی‌دونم از چه روشی استفاده کردن. ولی چون گفتن دستور sql حدس می‌زنم فایل اکسل رو با یه کانکشن OLE DB باز کردن.
به جز روش بالا می‌تونی کتابخانه Microsoft.Interop.Excel رو به پروژه‌ات اضافه کنی و فایل اکسل را با اون باز کنی. با این کتابخانه می‌تونی خروجی اکسل هم داشته باشی.

masoud_z_65
دوشنبه 28 فروردین 1391, 09:58 صبح
من کدی که دوستمون نوشتن رو ندیدم و نمی‌دونم از چه روشی استفاده کردن. ولی چون گفتن دستور sql حدس می‌زنم فایل اکسل رو با یه کانکشن OLE DB باز کردن.
به جز روش بالا می‌تونی کتابخانه Microsoft.Interop.Excel رو به پروژه‌ات اضافه کنی و فایل اکسل را با اون باز کنی. با این کتابخانه می‌تونی خروجی اکسل هم داشته باشی.

دوست عزیز من با روش OLEDB رو بلدم اما این کتابخونه رو باهاش آشنایی ندارم
میشه روش استفاده ازش رو توضیح بدی؟
قطعه کداش رو بگو....چطور فایل اکسل رو میخونه؟

در ضمن کسی از دوستان میتونه به صورت تخصصی توضیح بده کدوم روش بهتره؟
سرعت کدوم بهتره و کلا یه مقایسه انجام بده

سوداگر
دوشنبه 28 فروردین 1391, 13:00 عصر
اون فضای نامی که دوستمون فرمودند Microsoft.Office.Interop.Excel هستش که راه حل مناسبی برای این کار هست ولی به این 3 دلیلی که در سایت مایکروسافت (http://social.msdn.microsoft.com/Forums/en-GB/exceldev/thread/2bfeed86-49a7-4251-a226-0fe6e33a6e86) دیدم (جواب مدیر بخش بود:چشمک:)، روش OleDb بهینه تر هست:





1. In order to use the "Interop" the Excel application must be present. Excel should not be run server-side, so using Interop is usually not a good approach for asp.net solutions

2. Interop will usually be slower than other methods for working with a spreadsheet's data (as opposed to the tools provided by the UI).

3. Most controls (such as gridview) are designed to accept a standardized data source, such as OLE DB (ADO.NET) delivers. The interop doesn't provide data in that manner, so there'd be a lot more "manual labor" involved to extract that data via the Interop.



موفق باشید

Alghoochi
دوشنبه 28 فروردین 1391, 22:28 عصر
اون فضای نامی که دوستمون فرمودند Microsoft.Office.Interop.Excel هستش که راه حل مناسبی برای این کار هست ولی به این 3 دلیلی که در سایت مایکروسافت (http://social.msdn.microsoft.com/Forums/en-GB/exceldev/thread/2bfeed86-49a7-4251-a226-0fe6e33a6e86) دیدم (جواب مدیر بخش بود:چشمک:)، روش OleDb بهینه تر هست:



موفق باشید

این فضا و کلاسهای اون برنامه اکسل رو باز می‌کنه و هر کاری که خواستی می‌تونی با فایل انجام بدی. درصورتی که هدفت فقط خوندن اطلاعات هست استفاده از OLEDB بهتره ولی اگه می‌خوای یه خروجی اکسل داشته باشی بهتره از این کلاس استفاده کنی.
براساس متنی که دوستمون گذاشتن:‌OLEDB سریع‌تره و چون خروجی استانداردی داره واسه استفاده تو Gridview مناسب‌تره. به علاوه اینکه چون اون کتابخانه از خود برنامه استفاده می‌کنه استفاده از OLEDB تو برنامه‌های سمت سرور مناسب تره.

masoud_z_65
سه شنبه 29 فروردین 1391, 10:57 صبح
کاملا به جوابم رسیدم ممنون

حالا اگه یه قطعه کد و مثال از اون روش کتابخونه رو هم بگید خیلی بیشتر ممنون میشم:چشمک:

Alghoochi
سه شنبه 29 فروردین 1391, 15:00 عصر
کاملا به جوابم رسیدم ممنون

حالا اگه یه قطعه کد و مثال از اون روش کتابخونه رو هم بگید خیلی بیشتر ممنون میشم:چشمک:



DataTable people = (DataTable)Session["people"];

// Create excel file.
ExcelFile ef = new ExcelFile();
ExcelWorksheet ws = ef.Worksheets.Add("DataSheet");
ws.InsertDataTable(people, "A1", true);

Response.Clear();

// Stream file to browser, in required type.
switch (this.RadioButtonList1.SelectedValue)
{
case "XLS":
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Disposition", "attachment; filename="
+ "Report.xls");
ef.SaveXls(Response.OutputStream);
break;

case "XLSX":
Response.ContentType = "application/vnd.openxmlformats";
Response.AddHeader("Content-Disposition", "attachment; filename="
+ "Report.xlsx");
// With XLSX it is a bit more complicated as MS Packaging API
// can't write directly to Response.OutputStream.
// Therefore we use temporary MemoryStream.
MemoryStream ms = new MemoryStream();
ef.SaveXlsx(ms);
ms.WriteTo(Response.OutputStream);
break;
}

Response.End();


کد رو هم از اینجا کپی کردم.
Using Microsoft.Office.Interop.Excel (http://forums.asp.net/t/1635223.aspx/1)

Alghoochi
سه شنبه 29 فروردین 1391, 15:02 عصر
تو این لینکم یه مثال داره.
http://www.dotnetperls.com/excel

mahdi68
پنج شنبه 31 فروردین 1391, 12:17 عصر
تا ریختن اطلاعات توی دیتا تیبلش رو نوشتم فقط کافیه دستور اس کیول رو تغییر بدی (به جای SheetName اسم جدول مورد نظر رو بذار، اون تکست باکس هم تشریفاتی بود:خجالت:)
از کمبو باکس هم باید نوع فایل ورودی رو انتخاب کنی.
موفق باشید
سلام
من وقتی کد شما اجرا میکنم واسه این بخش خطا میده :

excelConnection.Open();

سوداگر
پنج شنبه 31 فروردین 1391, 12:41 عصر
سلام
من وقتی کد شما اجرا میکنم واسه این بخش خطا میده :

excelConnection.Open();

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

آها... xlsx رو مثل اینکه باز نمیکنه!
اون رو با عجله نوشتم. اگه شد کاملش میکنم.
موفق باشید

mahdi68
پنج شنبه 31 فروردین 1391, 13:01 عصر
فایل اکسل با فرمت 2003 ذخیره کردم و اون مشکل حل شد اما این بار برای این بخش خطا میده :
dataAdapter.Fill(dt); این هم متن خطا هست :
The Microsoft Jet database engine could not find the object 'SheetName'. Make sure the object exists and that you spell its name and the path name correctly.
لازم هست که به غیر از ویژوال استدیو برنامه دیگه ای نصب کنم ؟

سوداگر
پنج شنبه 31 فروردین 1391, 14:35 عصر
فایل اکسل با فرمت 2003 ذخیره کردم و اون مشکل حل شد اما این بار برای این بخش خطا میده :
dataAdapter.Fill(dt); این هم متن خطا هست :
لازم هست که به غیر از ویژوال استدیو برنامه دیگه ای نصب کنم ؟

غیر از آفیس 2007 چیز دیگه ای نمیخواد، من نمیدونم ایراد کار کجاست، منم وقتی اسم جدول رو می زنم ارور میده. حتی نمونه کدهایی هم از اینجا (http://www.codeproject.com/Articles/8500/Reading-and-Writing-Excel-using-OLEDB)، اینجا (http://www.gidforums.com/t-17370.html) و اینجا (http://www.dreamincode.net/forums/topic/50397-advanced-oledb-select-for-excel-sheet/) دیدم نفهمیدم اشکال کجاست :خجالت:

mahdi68
پنج شنبه 31 فروردین 1391, 14:39 عصر
سلام من اشکال پیدا کردم ایراد از این قسمت بوذ که صحیحش این هست
string strSQL = "SELECT * FROM [sheet1$]"; الان هیج خطایی نمیده حالا چجوری میتونم بفهمم که درست عمل کزده ؟ یعنی این اطلاعات که ذخیره شده ببینم ؟
متشکرم

سوداگر
پنج شنبه 31 فروردین 1391, 14:42 عصر
من علامت $ رو گذاشته بودم ولی بازم ارور میداد :خجالت: اما مشکل از کروشه ها بود.

یعنی این اطلاعات که ذخیره شده ببینم ؟
کافیه یه دیتا گرید ویو به پروژه اضافه کنی و کد زیر:
dataGridView1.DataSource = dt;

ضمیمه بالا هم اصلاح شد
موفق باشید

Alghoochi
پنج شنبه 31 فروردین 1391, 22:44 عصر
سلام من اشکال پیدا کردم ایراد از این قسمت بوذ که صحیحش این هست
string strSQL = "SELECT * FROM [sheet1$]"; الان هیج خطایی نمیده حالا چجوری میتونم بفهمم که درست عمل کزده ؟ یعنی این اطلاعات که ذخیره شده ببینم ؟
متشکرم

strSql رو از نوع DataTable در نظر بگیرید.

Alghoochi
پنج شنبه 31 فروردین 1391, 23:05 عصر
که چی بشه؟!!!!:متعجب:
شما اصلا کد رو دانلود کردید؟!

خیر من کد رو ندیدم. ولی خروجی این کد SQL قطعا یک مقدار رشته‌ای نیست.

سوداگر
پنج شنبه 31 فروردین 1391, 23:09 عصر
خیر من کد رو ندیدم.

واقعا خسته نباشید :لبخند: