LinqToExcel در سی شارپ ، در این مقاله نحوهی استفاده از LinqToExcel برای کوئری گرفتن دادهها از اکسل را نشان خواهیم داد. امیدوارم خوشتان بیاید.
پیش از این، هیچ ذهنیتی در رابطه با ایجاد کوئری با استفاده از LINQ از صفحات گستردهی اکسل نداشتم، اما هنگامیکه جستجو کردم، کتابخانه ی LinqToExcel را یافتم که در انباره گیت هاب paulyoder Github repository موجود است.
این کتابخانه، که در ادامه خواهیم دید، تعداد زیادی مکانیزم ارائه میدهد که ما را قادر میسازند از LINQ جهت ساخت کوئریها و گرفتن دادهها از صفحات گستردهی اکسل استفاده کنیم.
میخواهم اشاره کنم که کتابخانهی LinqToExcel در هر دو نسخهی ۳۲ بیتی و ۶۴ بیتی موجود است.
میتوانید یکی از آنها را که با تنظیمات برنامه شما سازگار است را انتخاب کنید.
در این پست، موارد زیر را انجام خواهیم داد:
- ایجاد برنامهی کنسول (Console Application)
- نصب پکیجهای LinqToExcel
- ایجاد کلاس ConnexionExcel
- کوئری گرفتن با LinqToExcel
ایجاد برنامهی کنسول
ویژوال استودیو را باز کرده و File >> New Project را انتخاب کنید.
پنجره “New Project” نمایان خواهد شد. ( Console App(.Net Framework را انتخاب کرده، پروژهی خود را نامگذاری کرده، و OK را کلیک کنید.
نصب پکیجهای LinqToExcel
در این مرحله، ۳ امکان برای نصب پکیجهای LinqToExcel داریم.
- با استفاده از NuGet Manager
در پنجرهی Solution Explorer، بر روی References >> Manage NuGet Packages کلیک راست کنید.
سپس، در جعبهی متن جستجو، LinqToExcel را تایپ کرده، همانطور که در بالا نشان داده شده اولین خط را انتخاب کرده و بر روی دکمه “Install” (نصب) کلیک کنید.
- با استفاده از کنسول مدیریت پکیج
فرمان زیر را در کنسول مدیریت پکیج وارد کنید.
- آخرین راه حل افزون ارجاعات LinqToExcel مستقیماً در پروژهتان است. میتوانید آنها را از اینجا دانلود کنید.
حال بیایید شروع به بررسی تعدادی از ویژگیها و امکانات کتابخانهی LinqToExcel کنیم.
پیش از هر چیز، یک فایل اکسل جدید در ماشین محلی (local machine) خود ایجاد کرده، و نام دلخواهی برای آن بگذارید.
سپس، میتوانید سطر دادههای زیر را در صفحهی اول همانطور که در ادامه به اشتراک گذاشته شده اضافه کنید.
ایجاد کلاس ConnexionExcel
در اینجا کلاس ConnexionExcel را که شامل دو ویژگی است ایجاد کردهایم.
- PathExcelFile: حاوی مسیر مکان فایل اکسل است.
- UrlConnexion: یک نمونه از ExcelQueryFactory را میگیرد.
public class ConnexionExcel { public string _pathExcelFile; public ExcelQueryFactory _urlConnexion; public ConnexionExcel(string path) { this._pathExcelFile = path; this._urlConnexion = new ExcelQueryFactory(_pathExcelFile); } public string PathExcelFile { get { return _pathExcelFile; } } public ExcelQueryFactory UrlConnexion { get { return _urlConnexion; } } }
کوئری گرفتن از Worksheet با یک سطر هدر
ما در حال ایجاد یک کوئری هستیم که دادهها را از Worksheet از طریق بکارگیری سطر هدر بر میگرداند.
باید از یک کلاس با ویژگیهای زیر که با نام ستونهای Worksheet تطابق دارد، استفاده کنیم.
کامپایلر انتظار دارد که نام کاربری الزاماً “Sheet1” باشد. بنابراین بیایید کلاس محصول را با ویژگیهای زیر ایجاد کنیم.
public class Product { public int ProductId { get; set; } public string ProductName { get; set; } public string CategoryName { get; set; } }
کوئری ۱
string pathToExcelFile = @ "D:\ExcelData.xlsx"; ConnexionExcel ConxObject = new ConnexionExcel(pathToExcelFile); //Query a worksheet with a header row var query1 = from a in ConxObject.UrlConnexion.Worksheet < Product > () select a; foreach(var result in query1) { string products = "ProductId : {0}, ProductName: {1}"; Console.WriteLine(string.Format(products, result.ProductId, result.ProductName)); } Console.ReadKey();
نتیجه
کوئری گرفتن از یک Worksheet خاص از طریق نام
بطور پیشفرض، Worksheet (کاربرگ) “Sheet1 ” نامگذاری شدهاست اما اگر بخواهید نام دیگری بر روی آن بگذارید، میتوانید طبق مراحل ذکر شده در ادامه پیش بروید.
در این مثال،Worksheet ما “Products” نامگذاری شده و میخواهیم تمامی دادهها از برگهی Products را با استفاده از LINQ انتخاب کنیم.
کوئری ۲
var query2 = from a in ConxObject.UrlConnexion.Worksheet < Product > ("Products") // Products worksheet select a; foreach(var result in query2) { string products = "ProductId : {0}, ProductName: {1}"; Console.WriteLine(string.Format(products, result.ProductId, result.ProductName)); } Console.ReadKey();
نتیجه
در کوئری دیگر، اگر بخواهیم محصولاتی که productName آنها با حرف J شروع میشود را بگیریم.
کوئری ۳
var query3 = from p in ConxObject.UrlConnexion.Worksheet < Product > ("Products") where p.ProductName.StartsWith("J") select new { p.ProductName }; foreach(var result in query3) { string products = "ProductName : {0}"; Console.WriteLine(string.Format(products, result.ProductName)); }
نتیجه
حال، میخواهیم یک کوئری که تمامی محصولاتی که یا در دستهی “Cars” (خودرو) یا “Clothing” (البسه) قرار میگیرند را انتخاب میکند، ایجاد کنیم.
کوئری ۴
var query4 = from p in ConxObject.UrlConnexion.Worksheet < Product > ("Products") where p.CategoryName.Equals("Cars") || p.CategoryName.Equals("Clothing") select new { p.ProductName, p.CategoryName }; foreach(var result in query4) { string products = "ProductName : {0}, CategoryName : {1}"; Console.WriteLine(string.Format(products, result.ProductName, result.CategoryName)); } Console.ReadKey();
نتیجه
نگاشت ویژگی به ستون
برای نگاشت نام ستونهای Worksheet ، دو امکان داریم، یا استفاده از متد AddMapping() یا استفاده از صفت ExcelColumn در ویژگیها.
بنابراین، بیایید مثالی را ببینیم.
متد AddMapping()
ConxObject.UrlConnexion.AddMapping < Product > (x => x.CategoryName, "CategoryName"); var query5 = from p in ConxObject.UrlConnexion.Worksheet < Product > ("Products") where p.CategoryName.Equals("Electronics") select p; foreach(var result in query5) { string products = "ProductName : {0}, CategoryName : {1}"; Console.WriteLine(string.Format(products, result.ProductName, result.CategoryName)); } Console.ReadKey();
همانطور که در بالا میبینید، ویژگی CategoryName از کلاس محصول را با ستون نام دسته (Category Name) از شیت Products نگاشت کردهایم.
کوئری تمام محصولاتی که نام دستهی آن ها Electronics است را بر میگرداند.
صفت ExcelColumn
همچنین میتوانیم ویژگی CategoryName را با صفت ExcelColumn آراسته و نام ستونی را که میخواهیم نگاشت کنیم را به عنوان یک آرگومان ارسال میکنیم.
کوئری ۵
[ExcelColumn("CategoryName")] public string CategoryName { get; set; }
نتیجه
کوئری گرفتن از یک Worksheet بدون سطر هدر
Worksheet که سطر هدر ندارد نیز میتواند با استفاده از متد WorksheetNoHeader() کوئری گرفته شود.
توجه کنید که مقادیر سلول از طریق اندیس ارجاع داده میشوند.
کوئری ۶
var query6 = from p in ConxObject.UrlConnexion.WorksheetNoHeader() where p[2].Equals("Clothing") select p[1]; foreach(var result in query6) { Console.WriteLine(result); } Console.ReadKey();
نتیجه
کوئری گرفتن از یک بازهی خاص درون یک Worksheet
در اینجا، میتوانیم دادههای میان یک بازه را با استفاده از متد (WorksheetRange(startRange, endRange انتخاب کنیم.
کوئری ۷
var query7 = from c in ConxObject.UrlConnexion.WorksheetRange < Product > ("B1", "C8") where c.CategoryName == "Clothing" select new { c.ProductName, c.CategoryName }; foreach(var result in query7) { string products = "ProductName : {0}, CategoryName : {1}"; Console.WriteLine(string.Format(products, result.ProductName, result.CategoryName)); } Console.ReadKey();
نتیجه
کوئری گرفتن از یک Worksheet خاص با استفاده از اندیس
ترتیب اندیس Worksheet بر اساس نام آن ها بصورت الفبایی است، این بدین معناست که اگر یک صفحه گسترده حاوی دوWorksheet
( Product, Category )باشد، اگر چه Category شیت دوم در اکسل است، اولین اندیس در نظر گرفته میشود.
کوئری ۸
var query8 = from c in ConxObject.UrlConnexion.Worksheet < Product > (1) where c.ProductId > 5 select c; foreach(var result in query8) { string products = "Product Id : {0}, Product Name : {1}"; Console.WriteLine(string.Format(products, result.ProductId, result.ProductName)); } Console.ReadKey();
نتیجه
کوئری گرفتن از نام Worksheet
برای گرفتن نام تمامی Worksheet ها در یک صفحه گستر، از متد GetWorksheetNames() استفاده خواهیم کرد.
var worksheetNames = ConxObject.UrlConnexion.GetWorksheetNames(); foreach(var result in worksheetNames) { Console.WriteLine(result); } Console.ReadKey();
نتیجه
کوئری گرفتن از نام ستونها
برای انتخاب نام تمامی ستونها در یک Worksheet ، از متد GetColumnNames() استفاده خواهیم کرد.
var columnNames = ConxObject.UrlConnexion.GetColumnNames("Products"); foreach(var result in columnNames) { Console.WriteLine(result); }
نتیجه
اتصال پایدار
اگر بخواهید از اتصالی یکسان در تمامی کوئریهای اجرا شده توسط IExcelQueryFactory استفاده کنید، بنابراین مقدار ویژگی UsePersistentConnection را برابر true قرار دهید.
حتما در صورتیکه از یک اتصال پویا استفاده میکنید، ExcelQueryFactory را دور بیندازید.
ConxObject.UrlConnexion.UsePersistentConnection = true; try { var query9 = from c in ConxObject.UrlConnexion.Worksheet < Product > (1) where c.ProductId > 5 select c; } catch (Exception) { throw; } finally { ConxObject.UrlConnexion.Dispose(); }
هیچ دیدگاهی نوشته نشده است.