الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تصدير البيانات إلى إكسل

مغلق
بدأه محمد حمود في 28 فبراير 2005 · 2 رد · 2,065 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

احتجت في أحد تطبيقات ASP.NET التي عملت عليها مؤخراً أن أقوم بتصدير البيانات الناتجة (وهي على شكل شبكة من البيانات grid) إلى صيغة إكسل، بحيث يتمكن المستخدم من تحميل ملف الإكسل ذلك إلى جهازه.

بعد قراءة وبحث عن أفضل طريقة لتوليد ملف إكسل، وجدت طريقة سهلة للغاية أحببت أن أشارككم بها:

في البداية أذكر بعض الطرق الأخرى التي قرأت عنها:

1- استخدام automation باستخدام مكتبة الإكسل وهي من نوع com وهذه الطريقة بطيئة وينتج عنها مشاكل عديدة لأنها تعمل من جهة السيرفر وتؤدي إلى تشغيل الإكسل في كل مرة على السيرفر....

2- استخدام كريستال ريبورت وأوامر التصدير المتحة فيه

أما عن الطريقة التي استعملتها فمبدؤها هو كما يلي:

قم بإنشاء ملف نصي على جهازك وسمه مثلاً c:\1.txt

ثم انسخ النص التالي والصقه داخل ذلك الملف:

<table border="1">
  <tr>
    <td width="50%">hello excel</td>
    <td width="50%">hello excel</td>
  </tr>
  <tr>
    <td width="50%">hello excel</td>
    <td width="50%">hello excel</td>
  </tr>
</table>

قم بعدها بحفظ الملف ثم تغيير اسمه إلى c:\1.xls

ثم اعمل عليه double click

لاحظ أنه تم فتح الملف بوساطة الإكسل بشكل طبيعي!

إذاً الفكرة هي في تحويل البيانات الجدولية لديك والتي تريد تصديرها إلى إكسل إلى صيغة جدول html ثم تخزنها في ملف نصي امتداده xls بكل بساطة.

أما عن كيفية تنفيذ الفكرة في صفحة aspx، فيمكن استخدام الكود التالي مثلاً:

Imports System
Imports System.Data
Imports System.Configuration

Public Class DataToExcel
    Inherits System.Web.UI.Page

#Region " Web Form Designer Generated Code "

  'This call is required by the Web Form Designer.
  <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

  End Sub

  'NOTE: The following placeholder declaration is required by the Web Form Designer.
  'Do not delete or move it.
  Private designerPlaceholderDeclaration As System.Object

  Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
    'CODEGEN: This method call is required by the Web Form Designer
    'Do not modify it using the code editor.
    InitializeComponent()
  End Sub

#End Region

  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Convert(CType(Session("the_data_set"), DataSet), Response)
  End Sub
    Sub Convert(ByVal ds As System.Data.DataSet, ByVal response As System.Web.HttpResponse)
        'first let's clean up the response.object
        response.Clear()
        response.Charset = ""
        'set the response mime type for excel
        response.ContentType = "application/vnd.ms-excel"
        'create a string writer
        Dim stringWrite As New System.IO.StringWriter
        'create an htmltextwriter which uses the stringwriter
        Dim htmlWrite As New System.Web.UI.HtmlTextWriter(stringWrite)
        'instantiate a datagrid
        Dim dg As New System.Web.UI.WebControls.DataGrid
        'set the datagrid datasource to the dataset passed in
        dg.DataSource = ds.Tables(0)
        'bind the datagrid
        dg.DataBind()
        dg.ShowHeader = False

        'tell the datagrid to render itself to our htmltextwriter
        dg.RenderControl(htmlWrite)
        'all that's left is to output the html
        response.Write(stringWrite.ToString)
        response.End()
    End Sub
End Class

حيث تقوم بحفظ البيانات في dataset ثم تخزنها في session ثم تستدعي الملف الذي أرفقت كوده وهو DataToExcel.aspx فتظهر شاشة التحميل عند المستخدم.

محمد حمود

ماجستير تقنية المعلومات

بكالوريوس هندسة مدنية

محترف إدارة مشاريع (PMP)

مهندس جودة البرمجيات (CSQE)

مبرمج معتمد من مايكروسوفت (MCP)

متخصص في نظم المعلومات الجغرافية GIS

mohamed.hammod(at)gmail.com

www.ShapeViewer.com

#2

قد تعمل هذه الطريقة بشكل او بآخر لكنني لا اعتقد ان هذه هي الطريقة الامثل. فهنا لن يمكنك بناء الماكرو ولا تنسيق الخلايا و لا انشاء صفحات جديدة ولا لا .....

لقد اضطريت لاستخدام اكسل في احد تطبيقاتي الكبيرة وذلك من اجل تسهيل ادخال وتعديل البيانات فالزبون لم يكن على استعداد لادخال الاف القيم في صفحة الانترنت بشكل مباشر فكان الاكسل هو الحل الامثل بالاتجاهين (أي للقراءة من قاعدة البيانات وانزال البيانات على جهاز العميل ومن ثم تعديلها ورفعها الى قاعدة البيانات) فالطبع كان عنصر com هنا هو الحل الأمثل. لكنه وكما قلت يعاني من مشاكل كثر اهملها البطئ (خاصة وان كان طلبات الاكسل تاتي باوقات متفرقة) كما انه في حال حدوث خطأ ما بالبرنامج سيبقى اكسل مفتوحا (اكسل هنا مقصود به اكسل دون الواجهة الرسومية. فكل ما تراه من اكسل في هذه الحال انه ياخذ خوالي 8-10 ميغا بايت من الذاكرة لكل اكسل مفتوح) وفي بعض الاحيان عندما تنسى تحرير كائن من كائنات com التي تستخدمها فانها ستتراكم في الذاكرة وستسبب مشاكل كثيرة.

الخلاصة : ان اسخدام كائنات com هو الحل الذي يقدم لك كل امكانيات اكسل. كل ما تريد فعله قم بتسجيلع كماكرو ثم قم بفتح الماكرو وانسخ الخطوات الى برنامجك. لكنه عليك ان تكون حذرا جدا جدا جدا جدا. ومرة اخرى جدا. فاي خطأ صغير سوف بنتج عنه امتلاء الذاكرة.

وحدن بيبقو متل زهر البيلسان وحدهن بيقطفو وراق الزمان

بيسكرو الغابي بيضلهن متل الشتي يدقوا على بوابي على بوابي

يا زمان يا عشب داشر فوق هالحيطان ضويت ورد الليل عكتابي

برج الحمام مسور و عالي هج الحمام بقيت لحالي لحالي

يا ناطرين التلج ما عاد بدكن ترجعو صرخ عليهن بالشتي يا ديب بلكي بيسمعو

http://www.mazikana.com/Songs/F/Fayrouz/mp...uz---Wahdon.mp3

#3

شكراً لك.

وتحذيرك من استخدام com هو في محله، وإن كان لاغنى عنه في حالتك.

على كل حال لمزيد من المعلومات عن مشاكل استخدام automation على السيرفر والطرق البديلة له، يمكنكم مراجعة الوصلة التالية في موقع مايكروسوفت:

http://support.microsoft.com/kb/257757

محمد حمود

ماجستير تقنية المعلومات

بكالوريوس هندسة مدنية

محترف إدارة مشاريع (PMP)

مهندس جودة البرمجيات (CSQE)

مبرمج معتمد من مايكروسوفت (MCP)

متخصص في نظم المعلومات الجغرافية GIS

mohamed.hammod(at)gmail.com

www.ShapeViewer.com

هذا الموضوع مغلق.

مواضيع مشابهة