عموما بر روی سرورهای برنامههای وب، نرم افزار خاصی نصب نمیشود. برای مثال اگر نیاز به تولید فایل اکسل بر روی سرور باشد، سرور دار بعید است که آفیس را برای شما نصب کند و همچنین مایکروسافت هم این یک مورد را اصلا توصیه و پشتیبانی نمیکند (ایجاد چندین وهله از برنامه آفیس (تعامل با اشیاء 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;
}
}
}