LinqToExcel در سی شارپ

LinqToExcel

LinqToExcel در سی شارپ ، در این مقاله نحوه‌ی استفاده از LinqToExcel برای کوئری گرفتن داده‌ها از اکسل را نشان خواهیم داد. امیدوارم خوشتان بیاید.

پیش از این، هیچ ذهنیتی در رابطه با ایجاد کوئری با استفاده از LINQ از صفحات گسترده‌ی اکسل نداشتم، اما هنگامیکه جستجو کردم، کتابخانه‏ ی LinqToExcel را یافتم که در انباره گیت هاب paulyoder Github repository موجود است.

این کتابخانه، که در ادامه خواهیم دید، تعداد زیادی مکانیزم ارائه می‌دهد که ما را قادر می‌سازند از LINQ جهت ساخت کوئری‌ها و گرفتن داده‌ها از صفحات گسترده‌ی اکسل استفاده کنیم.

می‌خواهم اشاره کنم که کتابخانه‌ی LinqToExcel در هر دو نسخه‌ی ۳۲ بیتی و ۶۴ بیتی موجود است.

می‌توانید یکی از آن‏ها را که با تنظیمات برنامه شما سازگار است را انتخاب کنید.

 LinqToExcel

در این پست، موارد زیر را انجام خواهیم داد:

  •  ایجاد برنامه‌ی کنسول (Console Application)
  •  نصب پکیج‌های LinqToExcel
  • ایجاد کلاس ConnexionExcel
  •  کوئری گرفتن با LinqToExcel

ایجاد برنامه‌ی کنسول

ویژوال استودیو را باز کرده و File >> New Project را انتخاب کنید.

پنجره “New Project” نمایان خواهد شد. ( Console App(.Net Framework را انتخاب کرده، پروژه‌ی خود را نامگذاری کرده، و OK را کلیک کنید.

LinqToExcel

نصب پکیج‌های LinqToExcel

در این مرحله، ۳ امکان برای نصب پکیج‌های LinqToExcel داریم.

  •  با استفاده از NuGet Manager

در پنجره‌ی Solution Explorer، بر روی References >> Manage NuGet Packages کلیک راست کنید.

LinqToExcel

 

سپس، در جعبه‌ی متن جستجو، LinqToExcel را تایپ کرده، همانطور که در بالا نشان داده شده اولین خط را انتخاب کرده و بر روی دکمه “Install” (نصب) کلیک کنید.

  •  با استفاده از کنسول مدیریت پکیج

فرمان زیر را در کنسول مدیریت پکیج وارد کنید.

LinqToExcel

  •  آخرین راه حل افزون ارجاعات LinqToExcel مستقیماً در پروژه‌تان است. می‌توانید آن‏ها را از اینجا دانلود کنید.

حال بیایید شروع به بررسی تعدادی از ویژگی‌ها و امکانات کتابخانه‌ی LinqToExcel کنیم.

پیش از هر چیز، یک فایل اکسل جدید در ماشین محلی (local machine) خود ایجاد کرده، و نام دلخواهی برای آن بگذارید.

سپس، می‌توانید سطر داده‌های زیر را در صفحه‌ی اول همانطور که در ادامه به اشتراک گذاشته شده اضافه کنید.

LinqToExcel

ایجاد کلاس 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();  

نتیجه

LinqToExcel

کوئری گرفتن از یک 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();  

نتیجه

LinqToExcel

در کوئری دیگر، اگر بخواهیم محصولاتی که 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));  
}  

نتیجه

LinqToExcel

حال، می‌خواهیم یک کوئری که تمامی محصولاتی که یا در دسته‌ی “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();  

نتیجه

LinqToExcel

نگاشت ویژگی به ستون

برای نگاشت نام ستون‌های 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;  
}  

نتیجه

LinqToExcel

کوئری گرفتن از یک  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();  

نتیجه

LinqToExcel

کوئری گرفتن از یک بازه‌ی خاص درون یک 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(); 

نتیجه

LinqToExcel

کوئری گرفتن از یک 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();  

نتیجه

LinqToExcel

کوئری گرفتن از نام  Worksheet

برای گرفتن نام تمامی Worksheet ها در یک صفحه گستر، از متد GetWorksheetNames() استفاده خواهیم کرد.

var worksheetNames = ConxObject.UrlConnexion.GetWorksheetNames();  
foreach(var result in worksheetNames) {  
    Console.WriteLine(result);  
}  
Console.ReadKey();  

نتیجه

LinqToExcel

کوئری گرفتن از نام ستون‌ها

برای انتخاب نام تمامی ستون‌ها در یک Worksheet ، از متد GetColumnNames() استفاده خواهیم کرد.

var columnNames = ConxObject.UrlConnexion.GetColumnNames("Products");  
foreach(var result in columnNames) {  
    Console.WriteLine(result);  
} 

نتیجه

LinqToExcel

اتصال پایدار

اگر بخواهید از اتصالی یکسان در تمامی کوئری‌های اجرا شده توسط 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();  
}  

زهره سلطانیان

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.