Excel :
________________________________________


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

سوال 1 :

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


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

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


Top Links:
http://support.microsoft.com/default...oduct=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/jayra...et/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 ;



_________________