۱۳۸۹/۱۲/۰۳

توليد فايل‌هاي اكسل حرفه‌اي بدون نياز به نصب مجموعه‌ي آفيس


عموما بر روي سرورهاي برنامه‌هاي وب، نرم افزار خاصي نصب نمي‌شود. براي مثال اگر نياز به توليد فايل اكسل بر روي سرور باشد، سرور دار بعيد است كه آفيس را براي شما نصب كند و همچنين مايكروسافت هم اين يك مورد را اصلا توصيه و پشتيباني نمي‌كند (ايجاد چندين وهله از برنامه آفيس (تعامل با اشياء COM) بر روي سرور توسط يك برنامه‌ي وب چند كاربره).
اگر سايت‌ها را هم جستجو كنيد پر است از مقالاتي مانند تبديل GridView به اكسل ... كه تنها هنر آن‌ها انتخاب قسمت table مانند GridView و رندر كردن آن در مرورگر با پسوندي به نام xls يا xlsx است. به عبارتي فايل نهايي توليد شده استاندارد نيست. فقط يك html table است با پسوند xls/xlsx كه برنامه‌ي اكسل مي‌داند به چه صورتي بايد آن‌را باز كند (كه گاها در اين بين فارسي سازي آن مشكل ساز مي‌شود). اين فايل نهايي توليدي عاري است از امكانات پيشرفته‌ و حرفه‌اي اكسل. براي مثال اضافه كردن فرمول به آن، تبديل اطلاعات به نمودارهاي اكسل به صورت خودكار، داشتن فايلي با چندين work sheet‌ مختلف، اعمال قالب‌هاي مختلف، صفحه بندي بهتر و غيره.
مايكروسافت از سال 2007 توليد فايل‌هاي آفيس را با معرفي استاندارد OpenXML كه توسط مؤسسه ايزو هم پذيرفته شده، بسيار ساده‌تر كرده است. OpenXML SDK‌ در دسترس است و توسط آن مي‌توان فايل‌هاي اكسل حرفه‌اي را بدون نياز به نصب مجموعه‌ي آفيس توليد كرد. كار كردن با OpenXML SDK هم در نگاه اول شايد ساده به نظر برسد اما آن هم ريزه كاري‌هاي خاص خودش را دارد كه نمونه‌اي از آن‌را در مطلب "توليد فايل Word بدون نصب MS Word بر روي سرور" مي‌توانيد مشاهده كنيد. به عبارتي اين مجموعه جهت نوشتن كتابخانه‌هاي ويژه‌ي شما باز است ...
در اين بين يكي از حرفه‌اي‌ترين كتابخانه‌هايي كه امكانات توليد فايل‌هاي اكسل را به كمك OpenXML SDK‌ سهولت مي‌بخشد، كتابخانه‌ي سورس باز EPPlus است:


مثالي در مورد نحوه‌ي استفاده از آن:
مي‌خواهيم يك DataTable را به يك فايل اكسل واقعي (نه يك html table با پسوند xlsx) تبديل كنيم با اين شرايط كه يكي از قالب‌هاي جديد آفيس به آن اعمال شود؛ جمع كل يكي از ستون‌ها توسط اكسل محاسبه گرديده و همچنين عرض دقيق ستون‌ها نيز در برنامه تنظيم گردد. نموداري نيز به صورت خودكار اين اطلاعات را نمايش دهد:




using System.Data;
using System.IO;
using OfficeOpenXml;
using OfficeOpenXml.Drawing.Chart;
using OfficeOpenXml.Style;
using OfficeOpenXml.Table;

namespace EPPlusTest
{
class Program
{
static void Main(string[] args)
{
var newFile = new FileInfo("Test.xlsx");
if (newFile.Exists)
{
newFile.Delete();
}

//ايجاد يك سري اطلاعات دلخواه
var table = createDt();

using (var package = new ExcelPackage(newFile))
{
// اضافه كردن يك ورك شيت جديد
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("مخارج");

//اضافه كردن يك جدول جديد از ديتاتيبل دريافتي
worksheet.Cells["A1"].LoadFromDataTable(table, true, TableStyles.Dark9);

//نمايش جمع ستون هزينه‌هاي ماه‌ها
var tbl = worksheet.Tables[0];
//زير آخرين رديف يك سطر اضافه مي‌كند
tbl.ShowTotal = true;
//فرمول نحوه‌ي محاسبه جمع ستون انتساب داده مي‌شود
tbl.Columns[1].TotalsRowFunction = RowFunctions.Sum;

//تعيين عرض ستون‌هاي جدول
worksheet.Column(1).Width = 14;
worksheet.Column(2).Width = 12;

//تنظيم متن هدر
worksheet.HeaderFooter.oddHeader.CenteredText = "مثالي از نحوه‌ي استفاده از ايي پي پلاس";

//مي‌خواهيم سرستون‌ها در وسط ستون قرار گيرند
worksheet.Cells["A1"].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
worksheet.Cells["B1"].Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;

//افزودن يك نمودار جديد به شيت جاري
var chart = worksheet.Drawings.AddChart("chart1", eChartType.Pie3D);
chart.Title.Text = "نمودار هزينه‌هاى سال";
chart.SetPosition(Row: 2, RowOffsetPixels: 5, Column: 3, ColumnOffsetPixels: 5);
chart.SetSize(PixelWidth: 320, PixelHeight: 360);
chart.Series.Add("B2:B13", "A2:A13");
chart.Style = eChartStyle.Style26;

//تنظيم يك سري خواص فايل نهايي
package.Workbook.Properties.Title = "مثالي از ايي پي پلاس";
package.Workbook.Properties.Author = "وحيد";
package.Workbook.Properties.Subject = "ايجاد فايل اكسل بدون نرم افزار اكسل";

//تنظيم نحوه‌ي نمايش فايل زمانيكه در نرم افزار اكسل گشوده مي‌شود
worksheet.View.PageLayoutView = true;
worksheet.View.RightToLeft = true;

// ذخير سازي كليه موارد اعمالي در فايل
package.Save();
}
}

private static DataTable createDt()
{
var table = new DataTable("مخارج");
table.Columns.Add("ماه", typeof(string));
table.Columns.Add("هزينه", typeof(decimal));

table.Rows.Add("فروردين", 100);
table.Rows.Add("ارديبهشت", 250);
table.Rows.Add("خرداد", 80);
table.Rows.Add("تير", 300);
table.Rows.Add("مرداد", 200);
table.Rows.Add("شهريور", 150);
table.Rows.Add("مهر", 250);
table.Rows.Add("آبان", 200);
table.Rows.Add("آذر", 400);
table.Rows.Add("دي", 100);
table.Rows.Add("بهمن", 130);
table.Rows.Add("اسفند", 80);
return table;
}
}
}