۱۳۸۷/۰۹/۱۳

توليد فايل 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