سؤال

ما هي أفضل طريقة لتصدير طريقة عرض الشبكة إلى جدول بيانات Excel؟ هذا يبدو سهلا

باستثناء أن Gridview الخاص بي لا يحتوي على سمة تصدير.ما هي أسرع طريقة للقيام بذلك؟

هل كانت مفيدة؟

المحلول

في تصدير إلى التفوق كتابة هذا الرمز على btnexporttoExcel الحدث Click.

    string attachment = "attachment; filename=Export.xls";

    Response.ClearContent();

    Response.AddHeader("content-disposition", attachment);

    Response.ContentType = "application/ms-excel";

    StringWriter sw = new StringWriter();

    HtmlTextWriter htw = new HtmlTextWriter(sw);

    // Create a form to contain the grid

    HtmlForm frm = new HtmlForm();

   gv.Parent.Controls.Add(frm);

    frm.Attributes["runat"] = "server";

    frm.Controls.Add(gv);

    frm.RenderControl(htw);



    //GridView1.RenderControl(htw);

    Response.Write(sw.ToString());

    Response.End();

نصائح أخرى

من المحتمل أن يكون هناك شيء ما لهذا، ولكن إذا كنت تريد أن تفعل ذلك بنفسك، فيمكنك فقط كتابة بعض التعليمات البرمجية التي تدخل في مجموعة GridView.Rows، ثم مجموعة GridViewRow.Cells داخل ذلك.

من المفترض أن يكون من السهل جدًا إنشاء ملف CSV من هناك، ويمكن لبرنامج Excel قراءته دون أي مشكلة.

ملفات CSV هي مجرد ملفات نصية تحتوي على قيم داخل علامات الاقتباس، مفصولة بفواصل.مثله:

"value", "value", "value"
"value", "value", "value"

يمكنك فقط فتح برنامج "المفكرة" وإنشاء واحدة يدويًا لتجربتها.

لقد فعلت هذا عدة مرات.يحتوي Excel على إصدار XML.وينتهي الأمر بامتداد .xml، ولكن يمكنك فقط تغيير امتداد الملف إلى .xls وسيتم فتح الملف بتنسيق XML في برنامج Excel بشكل جيد.

أكبر عقبة أمام هذا النهج هي تنسيق Excel XML.أقوم عادةً بإنشاء ملف Excel في Excel بالتنسيق التقريبي الذي أرغب فيه.أقوم بعد ذلك بحفظ ملف Excel بتنسيق XML، وفتحه في محرر النصوص.

عادةً ما أقوم بإنشاء ملف قالب من صفحة نموذج Excel هذه.ثم عندما أقوم بتصدير المعلومات في Gridview، كل ما علي فعله هو إنشاء ملف XML للقسم الذي يحتوي على الخلايا التي أخطط لملءها، وأقوم فقط بإلحاق النص الموجود بالفعل في ملف القالب مسبقًا وإلحاقه.

بمجرد فتح ملف Excel بتنسيق XML، ستكتشف ملف XML المطلوب بسهولة نسبية.الجزء الأصعب في الفهم هو الطريقة التي تشير بها الخلايا إلى خيارات التنسيق، الموجودة في الجزء العلوي من ملف XML.

حظا سعيدا، اسمحوا لي أن أعرف إذا كنت بحاجة إلى مزيد من التوضيح.

يحرر:سوف تحتاج فقط إلى إنشاء ملف Excel للقالب مرة واحدة فقط، فقط لتتعرف على ملف XML المطلوب الذي ستحتاج إلى إنشائه.بمجرد إنشاء ملف XML، استخدم الكود التالي لإرساله إلى المستخدم:

string fileName = "ExportedFile.xls";
Response.Clear();
Response.Buffer = true;
Response.ContentType = "text/xml";
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
ExportToExcel(HttpContext.Current.Response.OutputStream, testUID);
Response.End();



public static void ExportToExcel(Stream outputStream)
{
    XmlTextWriter xmlSink = new XmlTextWriter(outputStream, Encoding.Default);

    //ExcelHeaderString and ExcelStylesString are from the template
    xmlSink.WriteRaw(ExcelHeaderString);
    xmlSink.WriteRaw(ExcelStylesString);

    //write your elements here
    xmlSink.WriteElement("YourElements");

    //ExcelFooterString is from the template
    xmlSink.WriteRaw(ExcelFooterString);
}

هذه المكتبة للحصول على صافي عملت بشكل جيد جدا لحالات الاستخدام لدينا.

<اقتباس فقرة>   

وهذه المكتبة تسمح لك لتوليد إكسل المصنفات باستخدام XML، أنها بنيت 100٪ في C # و لا يتطلب Excel مثبت على الإطلاق لإنشاء ملفات. وإنما يعرض نموذج كائن بسيط لتوليد المصنفات XML.

وليس هناك التكامل المدمج في مع عنصر تحكم GridView، ولكن كتابة محول عام من السهل بما فيه الكفاية، وسوف تكون قابلة لإعادة الاستخدام في مشاريع أخرى.

وهذه الطريقة يذهب مباشرة إلى تنسيق Excel دون الحاجة XML يتم تثبيتها على الملقم أو باستخدام XML.

        Protected Sub ExportToExcel()

        Dim gv1 As GridView = FindControlRecursive(objPlaceHolder, "GridView1")
        If Not gv1 Is Nothing Then
            Response.ClearHeaders()
            Response.ClearContent()

            ' Set the content type to Excel
            Response.ContentType = "application/vnd.ms-excel"

            ' make it open the save as dialog
            Response.AddHeader("content-disposition", "attachment; filename=ExcelExport.xls")

            'Turn off the view state 
            Me.EnableViewState = False

            'Remove the charset from the Content-Type header 
            Response.Charset = String.Empty

            Dim myTextWriter As New System.IO.StringWriter
            Dim myHtmlTextWriter As New System.Web.UI.HtmlTextWriter(myTextWriter)
            Dim frm As HtmlForm = New HtmlForm()
            Controls.Add(frm)
            frm.Controls.Add(gv1)

            'Get the HTML for the control 
            frm.RenderControl(myHtmlTextWriter)

            'Write the HTML to the browser 
            Response.Write(myTextWriter.ToString())
            'End the response 
            Response.End()
        End If
    End Sub

Private Function FindControlRecursive(ByVal root As Control, ByVal id As String) As Control
    If root.ID = id Then
        Return root
    End If
    Dim c As Control
    For Each c In root.Controls
        Dim t As Control = FindControlRecursive(c, id)
        If Not t Is Nothing Then
            Return t
        End If
    Next
    Return Nothing
End Function

واعتدت CarlosAg.ExcelXmlWriter صلة .

وأنا يحلق من خلال جميع GridViews HeaderCells ومن ثم من خلال كافة الصفوف. الشيء الوحيد هو أنه إذا كنت تسمح الترحيل وقمت أكثر من صفحة واحدة لديك لتعيين حجم الصفحة إلى قيمة عالية (أنا وضعت على 10000000) ثم DataBind وGridView مرة أخرى والقيام عملك. بعد ذلك تعيين قيمة حجم الصفحة القديمة مرة أخرى. اذا كان هناك من يعرف حلا أفضل، وكنت موضع ترحيب.

وتحرير: حاول / catch هناك لأن لسبب ما لم يكن ممكنا للتحقق من نوع عنصر التحكم ثم يلقي إلى تسمية أو LinkButton ==> control.GetType()

.

إليك قانون بلدي.

 public static Workbook CreateWorkbook(GridView gridView)
    {
        int pageSize = gridView.PageSize;
        gridView.PageSize = 10000000;
        gridView.DataBind();

        Workbook workbook = new Workbook();
        Worksheet sheet = workbook.Worksheets.Add("Export");

        WorksheetStyle style = workbook.Styles.Add("headerStyle");
        style.Font.Bold = true;
        style = workbook.Styles.Add("defaultStyle");
        style.Alignment.WrapText = true;
        style = workbook.Styles.Add("infoStyle");
        style.Font.Color = "Red";
        style.Font.Bold = true;

        sheet.Table.Rows.Add(new WorksheetRow());

        WorksheetRow headerRow = new WorksheetRow();
        foreach (DataControlFieldHeaderCell cell in gridView.HeaderRow.Cells)
        {
            if (!string.IsNullOrEmpty(cell.Text))
                headerRow.Cells.Add(cell.Text, DataType.String, "headerStyle");
            else
                foreach (Control control in cell.Controls)
                {
                    LinkButton linkButton = new LinkButton();
                    try
                    {
                        linkButton = (LinkButton)control;
                    }
                    catch { }

                    if (!string.IsNullOrEmpty(linkButton.Text))
                        headerRow.Cells.Add(linkButton.Text, DataType.String, "headerStyle");
                    else
                    {
                        Label label = new Label();
                        try
                        {
                            label = (Label)control;
                        }
                        catch { }
                        if (!string.IsNullOrEmpty(label.Text))
                            headerRow.Cells.Add(label.Text, DataType.String, "headerStyle");
                    }
                }
        }

        sheet.Table.Rows.Add(headerRow);

        foreach (GridViewRow row in gridView.Rows)
        {
            WorksheetRow wrow = new WorksheetRow();
            foreach (TableCell cell in row.Cells)
            {
                foreach (Control control in cell.Controls)
                {
                    if (control.GetType() == typeof(Label))
                    {
                        wrow.Cells.Add(((Label)control).Text, DataType.String, "defaultStyle");
                    }
                }
            }
            sheet.Table.Rows.Add(wrow);
        }

        gridView.PageSize = pageSize;

        return workbook;
    }
Private exportToExcel As Boolean = False

Private Sub LoadInExcel()
    Me.Response.ClearContent()
    Me.Response.AddHeader("content-disposition", "attachment; filename=MyFile.xls")
    Me.Response.ContentType = "application/ms-excel"
    Dim sw1 As New IO.StringWriter
    Dim htw1 As HtmlTextWriter = New HtmlTextWriter(sw1)
    GridView1.RenderControl(htw1)
    Response.Write(sw1.ToString())
    Response.End()
End Sub

Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
    ' Confirms that an HtmlForm control is rendered for the specified ASP.NET
    ' server control at run time.
End Sub

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
    If exportToExcel Then
        LoadInExcel()
    End If

    MyBase.Render(writer)
End Sub

Protected Sub btnPrint_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPrint.Click
    exportToExcel = True
End Sub

ويجب أن يكون التفوق تثبيت والرجوع إلى مكتبات إمكانية التشغيل المتداخل مكتب في المشروع. إضافة:

واردات Microsoft.Office.Core، واردات Microsoft.Office.Interop

والحل فوق يأخذ gridview ويسحب أتش تي أم أل للخروج منه. ثم يكتب إلى التفوق. سوف أتش تي أم أل القادمة من الشبكة تتضمن سمات نمط مثل الحشو ولون. وسوف تقدم أيضا عناوين الأعمدة للفرز تبدو الروابط. عندما كنت هذا كتبت محلل مخصص لتجريد كل التصميم غير المرغوب فيها من أن تعطيني فقط على البيانات الخام. سأترك هذه المهمة متروك لكم لأنه معين على كل شبكة.

ومن المهم جدا أن تقوم بتضمين تجاوز لVerifyRenderingInServerForm، على الرغم من أنه لا يوجد أي رمز داخل منه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top