PDA

View Full Version : فوت و فن های کار با اکسل در سی شارپ



sahar
چهارشنبه 17 آبان 1385, 09:15 صبح
Excel :
________________________________________


در این تاپیک خلاصه ای از مشکلات کار با اکسل و راه حل های آن را به همراه لینک های اصلی مورد استفاده می خوانید:

سوال 1 :

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


1- با استفاده از ابزارDCOM Excel

2- با استفاده ازOLEDB CONNECTION :
* توجه این روش امن تر ودر اجرا بسیار سریع تر است.
** فایلهای با فرمت غیز جدولی Non .XLS رابا این روش نمی توان بازکرد. برای حل این مشکل به سوال 4 مراجعه کنید.


Top Links:
http://support.microsoft.com/default.aspx?scid=kb;en-us;306023&Product=NETFrame





________________________________________
سوال 2 :
علت بروز خطای زیر هنگام باز کردن ٍExcel.WorkBooks چیست ؟
(Old Format Or Invalid Type Library)

این خطا به علت تنظیمات غیر انگلیسی در Reginal Setting اتفاق می افتد و برای حل آن به کد زیر توجه کنید:

کد:


System.Globalization.CultureInfo oldCI =
System.Threading.Thread.CurrentThread.CurrentCultu re;
System.Threading.Thread.CurrentThread.CurrentCultu re =
new System.Globalization.CultureInfo("en-US");

m_objBooks.Open(dataSourcePath + excelFileName ,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_ob jOpt,m_objOpt, _objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objO pt,m_objOpt);

System.Threading.Thread.CurrentThread.CurrentCultu re =
oldCI;





________________________________________
سوال 3 :
چگونه می توان همه حافظه اشغال شده توسط Excel.Application و سایر کلاس های آن را آزاد کرد؟

باید توجه کنیم که با بستن و نال کردن متغیر های ابزار اکسل حافظه اشغال شده آن آزاد نمی شود . بلکه استفاده از ابزار های زیر برای آزاد سازی حافظه ضروری ست :
کد:


m_objBook.Close(false, m_objOpt, m_objOpt);
m_objBooks.Close();
m_objExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComO bject (m_objBook);
System.Runtime.InteropServices.Marshal.ReleaseComO bject (m_objBooks);
System.Runtime.InteropServices.Marshal.ReleaseComO bject (m_objExcel);
m_objBook=null;
m_objBooks=null;
m_objExcel=null;
GC.Collect(); // force final cleanup!


_________________



________________________________________
4- چگونه می توان سایر فرمت های فایل های اکسل مثل .csv را به فرمت XLS تبدیل کرد؟

باباز کردن آن توسط ٍExcel.WorkBooks و ذخیره مجدد آن در دستورات زیر:
کد:



m_objBooks.Open(dataSourcePath + excelFileName ,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_ob jOpt,m_objOpt,
m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_obj Opt,m_objOpt);


m_objBook = m_objExcel.ActiveWorkbook;
// Save the text file in the typical workbook format and quit Excel.
m_objBook.SaveAs(dataSourcePath+"Temp.XLS", Excel.XlFileFormat.xlWorkbookNormal,
m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
m_objOpt, m_objOpt, m_objOpt);





________________________________________
سوال 5 :
هنگام نیو کردن Excel.Application در محیط وب با خطای زیر روبرو می شویم ؟ علت و راه حل آن چیست ؟
(Access Denied)


علت : امکان دسترسی به این DCOM توسط ASP.NET وجود ندارد.

راه حل :باید در کامپیوتر سرور این اجازه دسترسی را صادر کنیم.
مراحل صدور این مجوز این است :

1- اجرای کامند روبرو در Run :dcomcnfg.exe
2-با باز شدن برنامه سرویس Component Services به زیر شاخه زیر می رویم :

Component Services => Computer => My Computer => DCOM Config
3-برنامه Microsoft Excel Application را از لیست پیدا می کنیم و پراپرتی های آن را با کلیک راست می آوریم.

4- اکنون زمان صدور مجوز برای ASPNET است.
در تب Security :
Access Permistion و Lunch Permistion را Customize می کنیم ویک گروه به نام ASPNET به لیست اضافه کرده و اجازه دسترسی آن را تیک می زنیم.

Top Link:
http://www.asp101.com/articles/jayram/exceldotnet/default.asp

در عنوان :Installing and running the sample:

_________________



________________________________________
سوال 6 :
وقتی با استفاده از ابزار JetEngine OLEDB یک فایل اکسل را می خوانیم سطر اول Sheet خوانده نمی شود .
علت و راه حل ان چیست ؟
علت این است که سطر اول را به طور پیش فرض نام ستون های جدول فرض میکند .
برای حل این مشکل در دات نت این فرمان را به ConnectionString اضافه می کنیم .(HDR=No):

ترکیب کلی ConnectionString چنین است :
کد:


String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source="+ dataSourcePath + "Temp.XLS"+";Extended Properties='Excel 8.0;HDR=No;'";



Top Link :
http://www.codeproject.com/csharp/Excel2XML.asp

در عنوان :Connection to Excel using Jet Engine

_________________



________________________________________
سوال 7:
چگونه می توان نام شیت های اکسل را خواند ؟

با استفاده از تابع GetOleDbSchemaTable در OLE DB:

به قطعه کد زیر توجه کنید :
کد:


// parameter as appropriate for your environment.
String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source="+ dataSourcePath + "Temp.XLS"+";Extended Properties='Excel 8.0;HDR=No;'";

// Create connection object by using the preceding connection string.
OleDbConnection objConn = new OleDbConnection(sConnectionString);

// Open connection with the database.
objConn.Open();

System.Data.DataTable dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables , null);

if(dt == null)
{
return null ;
}

String[] excelSheets = new String[dt.Rows.Count];
int i = 0;

// Add the sheet name to the string array.
foreach(DataRow row in dt.Rows)
{
excelSheets[i] = row["TABLE_NAME"].ToString();
i++;
}



_________________

________________________________________
یک شیوه عالی و بی درد سربرای خواندن فایلهای CSV

به جای استفاده از انواع Connection ها وCom ها وDcomها وDllها
می توانید راحت وسریع فایلهای Csv راباشی StreamReader در دات نت بخوانید:
به همین راحتی !!
کد:



DataSet ds = CreateDataSet();
String line;
//Open the CSV file to Read data From it
System.IO.StreamReader filestreamReader =
new System.IO.StreamReader(dataSourcePath + FileName);
while ((line = filestreamReader.ReadLine()) != null)
{
string[] strArray = ConvertCamaToArray(line );
AddRow(ds , strArray) ;
}
filestreamReader.Close();
return ds ;



_________________

hosseinmehr
سه شنبه 25 دی 1386, 08:58 صبح
دستت درد نکنه واقعاً که برای من کار راه انداز بود. خدا می دونه چند ساعت تو انترنت گشتم تا بالاخره این تاپیک مشکلم را حل کرد. جالبم این بود که هیچ جا این نکات را نگفته بودند.
(مثلاً راه حل مشکل Old Format Or Invalid Type Library که دهنم سرویس کرد)

soleymani_arak
سه شنبه 19 مرداد 1389, 12:00 عصر
دمت گرم
افتضاح من افتاد به خاطر
Old Format Or Invalid Type Library
خیلی خیلی ممنون

dr_jacky_2005
سه شنبه 19 مرداد 1389, 12:12 عصر
Excel :
________________________________________


در این تاپیک خلاصه ای از مشکلات کار با اکسل و راه حل های آن را به همراه لینک های اصلی مورد استفاده می خوانید:

سوال 1 :

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


1- با استفاده از ابزارDCOM Excel

2- با استفاده ازOLEDB CONNECTION :
* توجه این روش امن تر ودر اجرا بسیار سریع تر است.
** فایلهای با فرمت غیز جدولی Non .XLS رابا این روش نمی توان بازکرد. برای حل این مشکل به سوال 4 مراجعه کنید.


Top Links:
http://support.microsoft.com/default.aspx?scid=kb;en-us;306023&Product=NETFrame





________________________________________
سوال 2 :
علت بروز خطای زیر هنگام باز کردن ٍExcel.WorkBooks چیست ؟
(Old Format Or Invalid Type Library)

این خطا به علت تنظیمات غیر انگلیسی در Reginal Setting اتفاق می افتد و برای حل آن به کد زیر توجه کنید:

کد:


System.Globalization.CultureInfo oldCI =
System.Threading.Thread.CurrentThread.CurrentCultu re;
System.Threading.Thread.CurrentThread.CurrentCultu re =
new System.Globalization.CultureInfo("en-US");

m_objBooks.Open(dataSourcePath + excelFileName ,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_ob jOpt,m_objOpt, _objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objO pt,m_objOpt);

System.Threading.Thread.CurrentThread.CurrentCultu re =
oldCI;

________________________________________
سوال 3 :
چگونه می توان همه حافظه اشغال شده توسط Excel.Application و سایر کلاس های آن را آزاد کرد؟

باید توجه کنیم که با بستن و نال کردن متغیر های ابزار اکسل حافظه اشغال شده آن آزاد نمی شود . بلکه استفاده از ابزار های زیر برای آزاد سازی حافظه ضروری ست :
کد:


m_objBook.Close(false, m_objOpt, m_objOpt);
m_objBooks.Close();
m_objExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComO bject (m_objBook);
System.Runtime.InteropServices.Marshal.ReleaseComO bject (m_objBooks);
System.Runtime.InteropServices.Marshal.ReleaseComO bject (m_objExcel);
m_objBook=null;
m_objBooks=null;
m_objExcel=null;
GC.Collect(); // force final cleanup!
_________________



________________________________________
4- چگونه می توان سایر فرمت های فایل های اکسل مثل .csv را به فرمت XLS تبدیل کرد؟

باباز کردن آن توسط ٍExcel.WorkBooks و ذخیره مجدد آن در دستورات زیر:
کد:



m_objBooks.Open(dataSourcePath + excelFileName ,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_ob jOpt,m_objOpt,
m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_obj Opt,m_objOpt);


m_objBook = m_objExcel.ActiveWorkbook;
// Save the text file in the typical workbook format and quit Excel.
m_objBook.SaveAs(dataSourcePath+"Temp.XLS", Excel.XlFileFormat.xlWorkbookNormal,
m_objOpt, m_objOpt, m_objOpt, m_objOpt, Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt, m_objOpt,
m_objOpt, m_objOpt, m_objOpt);

________________________________________
سوال 5 :
هنگام نیو کردن Excel.Application در محیط وب با خطای زیر روبرو می شویم ؟ علت و راه حل آن چیست ؟
(Access Denied)


علت : امکان دسترسی به این DCOM توسط ASP.NET وجود ندارد.

راه حل :باید در کامپیوتر سرور این اجازه دسترسی را صادر کنیم.
مراحل صدور این مجوز این است :

1- اجرای کامند روبرو در Run :dcomcnfg.exe
2-با باز شدن برنامه سرویس Component Services به زیر شاخه زیر می رویم :

Component Services => Computer => My Computer => DCOM Config
3-برنامه Microsoft Excel Application را از لیست پیدا می کنیم و پراپرتی های آن را با کلیک راست می آوریم.

4- اکنون زمان صدور مجوز برای ASPNET است.
در تب Security :
Access Permistion و Lunch Permistion را Customize می کنیم ویک گروه به نام ASPNET به لیست اضافه کرده و اجازه دسترسی آن را تیک می زنیم.

Top Link:
http://www.asp101.com/articles/jayram/exceldotnet/default.asp

در عنوان :Installing and running the sample:

_________________



________________________________________
سوال 6 :
وقتی با استفاده از ابزار JetEngine OLEDB یک فایل اکسل را می خوانیم سطر اول Sheet خوانده نمی شود .
علت و راه حل ان چیست ؟
علت این است که سطر اول را به طور پیش فرض نام ستون های جدول فرض میکند .
برای حل این مشکل در دات نت این فرمان را به ConnectionString اضافه می کنیم .(HDR=No):

ترکیب کلی ConnectionString چنین است :
کد:


String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source="+ dataSourcePath + "Temp.XLS"+";Extended Properties='Excel 8.0;HDR=No;'";

Top Link :
http://www.codeproject.com/csharp/Excel2XML.asp

در عنوان :Connection to Excel using Jet Engine

_________________



________________________________________
سوال 7:
چگونه می توان نام شیت های اکسل را خواند ؟

با استفاده از تابع GetOleDbSchemaTable در OLE DB:

به قطعه کد زیر توجه کنید :
کد:


// parameter as appropriate for your environment.
String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source="+ dataSourcePath + "Temp.XLS"+";Extended Properties='Excel 8.0;HDR=No;'";

// Create connection object by using the preceding connection string.
OleDbConnection objConn = new OleDbConnection(sConnectionString);

// Open connection with the database.
objConn.Open();

System.Data.DataTable dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables , null);

if(dt == null)
{
return null ;
}

String[] excelSheets = new String[dt.Rows.Count];
int i = 0;

// Add the sheet name to the string array.
foreach(DataRow row in dt.Rows)
{
excelSheets[i] = row["TABLE_NAME"].ToString();
i++;
}


_________________

________________________________________
یک شیوه عالی و بی درد سربرای خواندن فایلهای CSV

به جای استفاده از انواع Connection ها وCom ها وDcomها وDllها
می توانید راحت وسریع فایلهای Csv راباشی StreamReader در دات نت بخوانید:
به همین راحتی !!
کد:



DataSet ds = CreateDataSet();
String line;
//Open the CSV file to Read data From it
System.IO.StreamReader filestreamReader =
new System.IO.StreamReader(dataSourcePath + FileName);
while ((line = filestreamReader.ReadLine()) != null)
{
string[] strArray = ConvertCamaToArray(line );
AddRow(ds , strArray) ;
}
filestreamReader.Close();
return ds ;

_________________
_____________________________________
_____________________________________
اکسل رو توو گرید ایمپورت کردم.
بعد وقتی میخوام سلولی که یک عددی تووشه رو مقدارش رو عوض کنم به رشته،
ارور زیر میاد:
http://up.iranblog.com/Files/d271e329197d42cf8e1e.JPG
این رو واسم حل کنی دمت گرمه...:چشمک:


+++++++++
هیشکی نبود؟

sima_2n5k
یک شنبه 07 شهریور 1389, 10:17 صبح
_____________________________________
_____________________________________
اکسل رو توو گرید ایمپورت کردم.
بعد وقتی میخوام سلولی که یک عددی تووشه رو مقدارش رو عوض کنم به رشته،
ارور زیر میاد:
http://up.iranblog.com/Files/d271e329197d42cf8e1e.JPG
این رو واسم حل کنی دمت گرمه...:چشمک:


+++++++++
هیشکی نبود؟



سلام
من میخوام فایل اکسل با فرمـ .xls,xlsx رو در پروژه وارد کنم ولی بعضی از ایتمها نظیر کدها مو جود نیستند زیرا در خود DAL ایجاد می شوند لطفا بگید چطور میتونم اکسل رو import کنم؟
connection باز نمی کنه؟
یه با پیغام Could not find installable ISAM. میده یه بارم The Microsoft Jet database engine could not find the object 'Sheet1$'. Make sure the object exists and that you spell its name and the path name correctly.

be_kh
یک شنبه 07 شهریور 1389, 11:11 صبح
خیلی عالی بود، واقعاً کارمو راه انداخت.

zahra_no
چهارشنبه 24 شهریور 1389, 22:55 عصر
سلام
چطوری میتونم وجود یک فایل اکسل تو یه فولدر بررسی کنم؟

لطفا اگه میدونید کمکم کنید.

mostafa_shaeri_tj
پنج شنبه 25 شهریور 1389, 01:18 صبح
سلام. عالی بود مرسی.

من تو vb6 میتونستم خود آبجکت اکسل رو با تمام امکاناتی که داشت به فرم اضافه کنم. از اشیای com اول به پروژه اضافه میکردم و بعد به فرم. اما اینجا بعد از اضافه کردن به فرم ارور های مختلفی میده و یا اصلا کار نمیکنه. مشکل از کجاست؟

zahra111
شنبه 15 آبان 1389, 11:06 صبح
سلام . من در connection از HDR=NO استفاده کردم ولی این خطا رو میده :
Couldn't find installable ISAM

robat7
شنبه 15 آبان 1389, 16:00 عصر
سلام
چطوری میتونم وجود یک فایل اکسل تو یه فولدر بررسی کنم؟

لطفا اگه میدونید کمکم کنید.


براي اين كار بايد كد زير را در برنامه اضافه نماييد


using System.IO;


سپس فايل مورد نظر خود را اينگونه جستجو كنيد


FileInfo MyGFile = newFileInfo(Path_of_the_file + "\\" + filename + ".pdf");
if (MyGFile.Exists)
{‍
}
else
{
}// file is Not Exist in Guess Path

در مثال بالا چون نام فايل من متغير است من دنباله را جداگانه وارد نموده ام ولي شما مي توانيد نام فايل و دنباله را بصورت پيوسته وارد نماييد

كامياب باشيد

robat7
شنبه 15 آبان 1389, 16:08 عصر
سلام. عالی بود مرسی.

من تو vb6 میتونستم خود آبجکت اکسل رو با تمام امکاناتی که داشت به فرم اضافه کنم. از اشیای com اول به پروژه اضافه میکردم و بعد به فرم. اما اینجا بعد از اضافه کردن به فرم ارور های مختلفی میده و یا اصلا کار نمیکنه. مشکل از کجاست؟

سلام دوست عزيز
ابتدادر قسمت Reference در برگه Com برنامه

Microsoft.Office.Interop.Excel
را به پروژه اضافه كنيد سپس در ابتداي فرم خود آنرا فرا خواني نماييد


using Excel = Microsoft.Office.Interop.Excel;

حلا براحتي مي توانيد فايل excel را باز نماييد و با آْن كار كنيد
ضمنا مي توان فايل excel را بدون استفاده از connection باز نمود و با آن كار كرد در صورت نياز بفرماييد تا دستورات لازم ارسال نمايم

كامياب باشيد

zahra111
دوشنبه 17 آبان 1389, 09:59 صبح
چرا کسی جواب نمیده؟!!!!!!!!!!
من در connection از HDR=NO استفاده کردم ولی این خطا رو میده :
Couldn't find installable ISAM . چرا؟

dr_jacky_2005
دوشنبه 17 آبان 1389, 11:11 صبح
چرا کسی جواب نمیده؟!!!!!!!!!!
من در connection از HDR=NO استفاده کردم ولی این خطا رو میده :
Couldn't find installable ISAM . چرا؟

آدرس زیر رو ببینید.
میگه که دو تا از رجیستری هاتون رو پیدا نمیکنه.
http://www.4tops.com/ms_access_tips/instisam.htm

احتمالا واسه درست کردنشم باید اکسس و اکسل رو ار سی دی آفیستون دوباره نصب کنید

metacomcs
چهارشنبه 01 دی 1389, 16:21 عصر
سلام
من در برنامه وبی که با سی شارپ دات نت 3.5 نوشتم داخل یک پیج datatable مورد نظرم رو درست میکنم . سپس اگر کاربر روی دکمه دریافت فایل اکسل کلیک کرد ، با فراخوانی متدی که در یک کلاس دیگه نوشتم و فرستادن این datatable به اون متد ، فایل اکسل رو ایجاد میکنم تا کاربر بتونه دانلود بکنه . این برنامه روی کامپیوتر خودم اجرا میشه ولی وقتی اون رو publish میکنم و روی win server 2003 قرار میدمش نمیتونم فایل رو دانلود کنم و پیام زیر رو به من میده :

Microsoft Office Excel cannot open or save any more documents because there is not enough available memory or disk space

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

majafer2
یک شنبه 22 دی 1392, 21:15 عصر
اگر بخوام یک برنامه رو برای تبدیل به یک فایل Setup پکت کنم، چه رفرنسی از Excel رو باید بردارم. تا برنامه ام روی بقیه ی سیستم ها که Excel رو نصب ندارن، راحت نصب بشه؟

gerdioz
دوشنبه 23 دی 1392, 09:46 صبح
if (System.IO.File.Exists("Inventory.xls"))
{
Excell.ShowDataGridview(dataGridView1, "inventory.xls", "select * from [sheet1$]");
SetStartProgress();

}
else
{
MessageBox.Show("فایل مربوط به انتقال داده یافت نشد"+"\n"+"Inventory.xls not found ", "I/O error", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

gerdioz
دوشنبه 23 دی 1392, 09:47 صبح
شما احتمالا می خوای اکسلی با پسوند xlsx رو باز کنی
ولی رفرنسی که در برنامه اتچ کردی ورژن 9 هست

gerdioz
دوشنبه 23 دی 1392, 09:49 صبح
@"Provider=Microsoft.ACE.OLEDB.12.0;
Data Source=//172.17.1.152//Planning Share//Sales Status92.xlsm;Extended Properties=""Excel 12.0;H DR=YES;""";

siryahya
چهارشنبه 14 اسفند 1392, 15:19 عصر
دوستان به هیچ وجه نمیتوانید با استفاده از دستورات اس کیو ال تو اکسل یم رکورد رو حذف کنید و فقط میتوانید اضافه و ویرایش کنید
اینو گفتم تا بلکه مثل من بعد از دو روز جستجو به این نتیجه نرسید!!!
موفقف باشید

sohrabi1383
یک شنبه 03 فروردین 1393, 17:02 عصر
در سوال 2 دستورSystem.Threading.Thread.CurrentThread.Cu rrentCultu re =
oldCI;


خطا می دهد فایل ضمیمه را نیز ارسال کرده ام

حسین.کاظمی
شنبه 16 فروردین 1393, 22:46 عصر
با سلام

من یه برنامه با زبان شیرین سی شارپ نوشتم که اطلاعات یک دیتا گرید ویو را به اکسل ارسال می کند ولی مشکلم اینجاست که در بعضی از فرم ها بصورت صحیح انجام میدهد ولی در بعضی از فرم ها این خطا را میده لطفاً در مورد این خطا راهنماییم کنید
​http://barnamenevis.org/attachment.php?attachmentid=117298&d=1395778429


پیشاپیش از راهنمایی شما تشکر میکنم