‏نمایش پست‌ها با برچسب OpenXML. نمایش همه پست‌ها
‏نمایش پست‌ها با برچسب OpenXML. نمایش همه پست‌ها

۱۳۸۹/۱۲/۰۳

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


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

۱۳۸۷/۰۹/۱۳

توليد فايل Word بدون نصب MS Word بر روي سرور


يكي از مواردي كه ممكن است در محيط كاري با آن برخورد داشت، تقاضاي توليد فايل word يك گزارش با فرمتي مشخص از يك برنامه ASP.Net است. براي مثال يك قالب درست كرده‌اند كه header‌ و footer و كلا يك فرمت رسمي دارد. الان برنامه شما بايد اين فايل word رسمي را با گزارشي كه توليد مي‌كند پر كند. حالا اينجاست كه گرفتاري برنامه نويس شروع مي‌شود! روي سرور بايد word نصب باشد تا توسط اشياء COM آن بتوان يك چنين كارهايي را آن‌هم با ASP.Net كه به صورت پيش فرض كمترين سطح دسترسي را روي سيستم دارد انجام داد. يا اينكه بايد به سراغ كامپوننت‌هاي تجاري رفت و حالا اينجا با اين وضع تحريم و غيره چگونه بتوان آنها را خريداري كرد يا شايد احتمالا در سايت‌هاي وارز بتوان نسخه تكه پاره شده آنها را يافت. مشكلي هم كه اين نوع كامپوننت‌ها دارند اين است كه ممكن است سال ديگر اصلا ساپورت نشوند. محصولات مايكروسافت هم كه مرتبا در حال به روز رساني هستند. در اين حالت برنامه متكي به اين نوع كامپوننت‌هاي تجاري سورس بسته در همان نگارش قبلي خود مجبور است باقي بماند.
خوشبختانه با ارائه آفيس 2007 و فرمت OpenXML فايلهاي آن، اين مشكل تقريبا مرتفع شده است. مايكروسافت نيز براي سهولت توليد اين نوع اسناد، OpenXML SDK را ارائه داده است كه از آدرس زير قابل دريافت است:
Open XML Format SDK 1.0

البته پيش نمايش نگارش دو SDK آن نيز موجود است كه در مطلب جاري به آن پرداخته نخواهد شد.

فايل‌هاي office 2007 از يك فايلzip تشكيل شده از چند فايل xml داخل آن، ايجاد شده‌اند. براي مثال يك فايل docx را با winrar يا امثال آن باز كنيد (تصوير زير):



براي كار با اينگونه اسناد بايد با اصطلاحات زير آشنا شد:
Package : فايل zip شما (همان فايل براي مثال docx) اينجا يك بسته نام دارد.
Parts : اجزاي اين بسته كه همان فايل‌هاي آن هستند، parts ناميده شده اند.
Relations : اگر به فايل‌هاي موجود در يك بسته دقت كنيد، فايلهايي با پسوند rels را خواهيد ديد كه بيانگر نحوه ارتباط Parts با يكديگر هستند.
Relations Ids: هر ارتباط با يك ID منحصربفرد تعريف مي‌گردد.

اگر علاقمند باشيد كه پوستري را در اين رابطه مشاهده نمائيد مي‌توان به آدرس زير مراجعه نمود.
Open XML Developer Map

نحوه استفاده از OpenXML SDK در دات نت:
ابتدا بايد ارجاعي را به فايل DocumentFormat.OpenXml.dll كه پس از نصب در مسير OpenXMLSDK\1.0.1825\lib قرار گرفته است به پروژه افزود. سپس نياز است تا ارجاعي به كتابخانه WindowsBase نيز به برنامه افزوده شود (تصوير زير). افزودن ارجاعي به اين كتابخانه جهت كامپايل برنامه ضروري است (شكل زير).


تا اينجا ارجاعات برنامه به صورت زير خواهند بود:



يك مثال ساده:
قصد داريم يك فايل docx ساده را با استفاده از OpenXML SDK ايجاد كنيم. در مثال زير فرمت متغير docXml را مي‌توان با ايجاد يك فايل docx ساده در word و سپس باز كردن بسته فشرده شده آن و مشاهده محتواي فايل word\document.xml بدست آورد.
using System.IO;
using System.Text;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;

namespace OpenXMLTestApp
{
class CWord
{

public static void CreateDocument(string documentFileName, string text)
{
using (WordprocessingDocument wordDoc =
WordprocessingDocument.Create(documentFileName, WordprocessingDocumentType.Document))
{
MainDocumentPart mainPart = wordDoc.AddMainDocumentPart();

string docXml =
@"<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>
<w:document xmlns:w=""http://schemas.openxmlformats.org/wordprocessingml/2006/main"">
<w:body><w:p><w:r><w:t>#REPLACE#</w:t></w:r></w:p></w:body>
</w:document>";

docXml = docXml.Replace("#REPLACE#", text);

using (Stream stream = mainPart.GetStream())
{
byte[] buf = (new UTF8Encoding()).GetBytes(docXml);
stream.Write(buf, 0, buf.Length);
}
}
}
}
}

و نحوه استفاده از آن مي‌تواند به صورت زير باشد:

CWord.CreateDocument("test.docx", "سلام دنيا");

اين كتابخانه كار ايجاد فايل‌هاي xml ، توليد روابط بين‌ آنها و همچنين بسته بندي و zip كردن نهايي را به صورت خودكار انجام مي‌دهد.

براي مطالعه بيشتر مي‌توان به منابع زير مراجعه نمود:

يك ويديوي آموزشي رايگان از مايكروسافت
دريافت

سؤالات متداول در MSDN
http://msdn.microsoft.com/en-us/library/bb491088.aspx
البته اگر پس از نصب SDK به پوشه doc آن مراجعه نمائيد، اين سؤال و جواب‌ها را در فايل راهنماي chm آن نيز مي‌توان پيدا كرد.

مثال ديگري در مورد ايجاد يك گزارش از بانك اطلاعاتي و گرفتن خروجي docx از آن
http://openxmldeveloper.org/articles/GenerateWordTable.aspx
البته اين مثال خيلي قديمي است و قسمت‌هاي كار با پكيج را با SDK‌ ارائه شده مي‌توان به صورت خودكار انجام داد. اما حداقل نحوه توليد جداول استاندارد OpenXML را مي‌توان از آن ايده گرفت.

مثالي در مورد نحوه قرار دادن عكس در فايل docx توليدي

همچنين مثال‌هاي بيشتري را در وبلاگ‌هاي مربوطه مي‌توان يافت:
http://blogs.msdn.com/brian_jones/
http://blogs.msdn.com/ericwhite/default.aspx