فراخوانی داینامیک اسمبلیهای آفیس در برنامه
نویسنده: مهران ر
تاریخ: ۱۳۹۲/۱۱/۰۷ ۱۶:۲۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
در بسیاری از پروژههای دات نت، نیاز به استفاده از فایلهای نرم افزار آفیس، از قبیل ورد و اکسل و ... وجود دارد. برای مثال گاهی لازم است اطلاعات یک گرید، یا هر منبع دادهای، در قالب اکسل به کاربر نمایش داده شود. بدین شکل که این فایلها در زمان اجرا ساخته شده و به کاربر نمایش داده شود .حال فرض کنید شما روی سیستم خودتان Office2007 را نصب کرده اید و به اسمبلیهای این ورژن دسترسی دارید. البته بدون نیاز به نصب آفیس نیز میتوان به این توابع دسترسی داشت و از آنها در برنامه استفاده کرد که همان استفاده از Primary Interop Assemblies میباشد. مشکلی که ممکن است پیش آید این است که در کامپیوترهای کاربران ممکن است ورژنهای مختلفی از آفیس نصب باشد مانند 2003 -2007-2010-2013 و اگر با ورژن اسمبلیهایی که فراخوانیهای فایلهای اکسل از طریق آن انجام شده باشد متفاوت باشد، برنامه اجرا نمیشود .
در حالت معمول برای نمایش یک فایل آفیس مثل اکسل در برنامه، ابتدا اسمبلی مربوطه را (اکسل در این مثال) که به نام Microsoft.Office.Interop.Excel میباشد به اسمبلیهای برنامه اضافه کرده (از طریق add reference) و برای نمایش یک فایل اکسل در زمان اجرا از کدهای زیر استفاده مینماییم :
try
{
var application = (Microsoft.Office.Interop.Excel.Application)Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
Workbook wrkBook;
var wbk = application.Workbooks;
wrkBook = wbk.Add();
wrkBook.Activate();
application.Visible = true;
}
catch (Exception ex)
{
Error(ex.Message);
} حال اگر آفیس 2010 به عنوان مثال در سیستم ما نصب باشد، ورژن این اسمبلی 14 میباشد و اگر این برنامه را در کامپیوتر کلاینتی که آفیس 2007 بر روی آن نصب باشد انتشار دهیم اجرا نمیشود. برای حل این مشکل بنده با استفاده از روش dynamic این موضوع را حل کردم و بنظر میرسد راههای دیگری نیز برای حل آن وجود داشته باشد.
در این روش با توجه به ورژن آفیسی که بر روی سیستم کاربر نصب شده اسمبلی مربوطه را از سیستم کاربر لود کرده و فایلهای آفیس را اجرا مینماییم. در ابتدا تشخیص میدهیم چه ورژنی از آفیس بر روی سیستم کاربر نصب است :
string strVersion = null;
dynamic objEApp =Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
if (objEApp.Version == "12.0")
{
strVersion = "2007";
}
else if (objEApp.Version == "14.0")
{
strVersion = "2010";
} روش دیگر برای انجام اینکار استفاده از اطلاعات رجیستری ویندوز است :
string strEVersionSubKey = "\\Excel.Application\\CurVer";
string strValue = null; //Value Present In Above Key
string strVersion = null; //Determines Excel Version
RegistryKey rkVersion = null; //Registry Key To Determine Excel Version
rkVersion = Registry.ClassesRoot.OpenSubKey(strEVersionSubKey, false); //Open Registry Key
if ((rkVersion != null)) //If Key Exists
{
strValue = (string)rkVersion.GetValue(string.Empty); //Get Value
strValue = strValue.Substring(strValue.LastIndexOf(".") + 1); //Store Value
switch (strValue) //Determine Version
{
case "11":
strVersion = "2003";
break;
case "12":
strVersion = "2007";
break;
case "14":
strVersion = "2010";
break;
} if (strVersion == "2007")
{
string strAssemblyOff2007 =
"Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c";
try
{
Assembly xslExcelAssembly = Assembly.Load(strAssemblyOff2007); //Load Assembly
Type type = xslExcelAssembly.GetTypes().Single(t => t.Name == "ApplicationClass");
dynamic application = Activator.CreateInstance(type);
var workbooks = application.Workbooks;
var workbook = workbooks.Add();
var worksheet = workbook.Worksheets[1];
workbook.Activate();
application.Visible = true;
}
catch (Exception ex)
{
}
}