تولید فایل‌های اکسل حرفه‌ای بدون نیاز به نصب مجموعه‌ی آفیس
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: چهار دقیقه


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

  • #
    ‫۱۰ سال و ۱۰ ماه قبل، شنبه ۱۶ آذر ۱۳۹۲، ساعت ۱۶:۲۰
    سلام آقای نصیری ، من نیاز دارم از بانک اطلاعاتی گزارش اکسل بگیرم . میخوام از EPPlus استفاده کنم اما به دلایلی روی سرور x64 نمیخوام از dll‌های x86 استفاده کنم . برای همین چون EP 32 بیتی هست نمیشه اینکار رو بکنم . من سورس EP رو 64 بیلد کردم و خودش اوکی هست اما dll مربوط به WindowsBase هم 32 هست. چیکار کنیم ؟ در نظر داشته باشید در نهایت 64 بیتی بودن فوق العاده مهمه . ممنون
    • #
      ‫۱۰ سال و ۱۰ ماه قبل، شنبه ۱۶ آذر ۱۳۹۲، ساعت ۱۶:۳۴
      - فایل‌های استاندارد آن روی Any CPU کامپایل شده‌اند. ادامه در اینجا
      + وابستگی WindowsBase هم یک فایل استاندارد مجموعه دات نت است و نه خارج از آن و در WPF از آن استفاده می‌شود. بنابراین مشکلی ندارد (چون حتی اگر یک dll بومی ویندوز هم باشد، با توجه به اینکه عملا دو نگارش X86 و X64 دات نت وجود دارند، بسته به سیستم مورد استفاده، یکی از آن‌ها به صورت خودکار در ابتدای کار نصب دات نت فریم ورک، نصب خواهد شد).
  • #
    ‫۱۰ سال و ۸ ماه قبل، یکشنبه ۲۰ بهمن ۱۳۹۲، ساعت ۱۸:۴۳
    سلام
    من دارم از epplus استفاده می‌کنم. به range هایی که تعریف می‌کنم فونت "B Nazanin" میدم اما اعمال نمیشه، هر چند با انتخاب یک سلول فونت رو درست نشون میده. جالب اینکه وقتی یک فایل اکسل با فونت نازنین و درست باز دارم اگرهمزمان فایل اکسل گزارش رو باز کنم، فونت رو اعمال می‌کنه. ممنون میشم راهنماییم بفرمایید که چطور مشکل رو حل کنم. با سپاس. 
    • #
      ‫۱۰ سال و ۸ ماه قبل، یکشنبه ۲۰ بهمن ۱۳۹۲، ساعت ۲۱:۳۳
      در مثال مطلب فوق، تنظیم زیر، فونت ستون ماه را تغییر می‌دهد:
      worksheet.Column(1).Style.Font.Name = "B Nazanin";
      worksheet.Column(1).Style.Font.Size = 15;

  • #
    ‫۹ سال و ۱۱ ماه قبل، پنجشنبه ۱۵ آبان ۱۳۹۳، ساعت ۲۲:۴۸
    سلام، اگر بخواهم تعدادی کاربر را همراه با عکس کاربری آنها را در یک فایل اکسل نمایش بدهم. چه کاری باید انجام دهم.  باید هنگام خواندن هر کاربر یک شی از کلاس Image درست کنم و عکس کاربر را تک تک به آن بدهم و آن شی را به فایل اکسل ارسال کنم؟
    سپاس از لطف شما
    • #
      ‫۹ سال و ۱۱ ماه قبل، پنجشنبه ۱۵ آبان ۱۳۹۳، ساعت ۲۳:۰۰
      پروژه PdfReport، برای تهیه خروجی اکسل، از همین کتابخانه استفاده می‌کند. متدی که در آن تصویر را به یک سلول اضافه می‌کند، به شرح زیر است (پارامتر data آن محتوای تصویر است؛ مثلا File.ReadAllBytes):
              void addImageFromStream(byte[] data)
              {
                  if (data == null) return;
                  using (var ms = new MemoryStream(data))
                  {
                      var image = Image.FromStream(ms);
                      _worksheet.Row(_row).Height = (image.Height + 1).Pixel2RowHeight();
                      _worksheet.Column(_col).Width = _worksheet.Pixel2ColumnWidth(image.Width + 1);
                      var picture = _worksheet.Drawings.AddPicture("pic" + _row + _col, image);
                      picture.From.Column = _col - 1;
                      picture.From.Row = _row - 1;
                      picture.From.ColumnOff = 2.Pixel2Mtu();
                      picture.From.RowOff = 2.Pixel2Mtu();
                      picture.SetSize(image.Width, image.Height);
                  }
              }
  • #
    ‫۷ سال و ۱۰ ماه قبل، پنجشنبه ۲۰ آبان ۱۳۹۵، ساعت ۰۲:۲۶
    البته الان دیگه این کتابخانه از طریق نیوگت هم قابل دسترسه:
    Install-Package EPPlus
  • #
    ‫۷ سال و ۴ ماه قبل، دوشنبه ۱ خرداد ۱۳۹۶، ساعت ۰۴:۵۴
    یک نکته‌ی تکمیلی
    از این کتابخانه برای خواندن فایل‌های اکسل هم می‌توان استفاده کرد. یک مثال
  • #
    ‫۶ سال و ۱۰ ماه قبل، دوشنبه ۲۲ آبان ۱۳۹۶، ساعت ۱۴:۰۳
    جهت اطلاع

    از EPPlus 4.5.0-beta به بعد، پشتیبانی از NET Core. نیز به آن اضافه شده‌است.