导出gridview数据

时间:2009-09-10 18:02:11

标签: c# asp.net vb.net gridview export-to-excel

将gridview导出到Excel电子表格的最佳方法是什么? This seems easy

除了我的Gridview没有导出属性。最快的方法是什么?

7 个答案:

答案 0 :(得分:1)

对此可能有些东西,但是如果你想自己做,你可以编写一些代码来遍历GridView.Rows集合,然后是GridViewRow.Cells集合。

从那里构建一个CSV文件应该很容易,Excel可以读它没问题。

CSV文件只是文本文件,其值在引号内,用逗号分隔。像这样:

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

你可以弹出记事本打开并手动构建一个以试用它。

答案 1 :(得分:1)

我已经好几次了。 Excel具有XML版本。它以.xml扩展名结尾,但您只需将文件的扩展名更改为.xls,XML格式的文件就可以在excel中打开了。

这种方法的最大障碍是excel XML格式。我通常使用我想要的近似格式在excel中创建一个excel文件。然后我将Excel文件保存为XML格式,并在文本编辑器中打开它。

我通常会从此Excel示例页面创建一个模板文件。然后,当我在Gridview中导出信息时,我只需要为包含我计划填充的单元格的部分创建xml,我只是在前面添加,并将文本附加到模板文件中。

打开xml格式的excel文件后,您将相对容易地找出所需的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);
}

答案 2 :(得分:1)

导出到Excel中将此代码写入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();

答案 3 :(得分:0)

This library .net对我们的用例非常有用。

  

此库允许您使用XML生成Excel工作簿,它在C#中100%构建,并且根本不需要安装Excel来生成文件。它公开了一个简单的对象模型来生成XML工作簿。

没有与GridView控件的内置集成,但编写通用适配器很容易,并且可以在其他项目中重复使用。

答案 4 :(得分:0)

我使用了CarlosAg.ExcelXmlWriter link

我遍历所有GridViews HeaderCells,然后遍历所有行。唯一的问题是,如果您允许分页并且您有多个页面,则必须将PageSize设置为较高的值(我设置为10000000),然后再次DataBind GridView并执行您的工作。然后重新设置旧的PageSize值。如果有人知道更好的解决方案,那么欢迎你。

编辑:try / catch是存在的,因为由于某种原因,无法检查控件类型,然后转换为Label或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;
    }

答案 5 :(得分:0)

此方法直接进入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

答案 6 :(得分:-1)

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

您必须安装excel并引用项目中的Office互操作库。 添加:

导入Microsoft.Office.Core, 导入Microsoft.Office.Interop

上面的解决方案采用gridview并从中拉出html。然后将其写入excel。来自网格的html将包括样式属性,例如padding&颜色。它还可以使可排序的列标题看起来像链接。当我使用它时,我编写了一个自定义解析器来删除所有不需要的样式,只给我原始数据。我将把这项任务留给你,因为它是针对每个网格的。

将Verify覆盖包含在VerifyRenderingInServerForm中是非常重要的,即使其中没​​有任何代码。