Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 导出gridview数据_C#_Asp.net_Vb.net_Gridview_Export To Excel - Fatal编程技术网

C# 导出gridview数据

C# 导出gridview数据,c#,asp.net,vb.net,gridview,export-to-excel,C#,Asp.net,Vb.net,Gridview,Export To Excel,将gridview导出到Excel电子表格的最佳方式是什么 除了我的Gridview没有导出属性。最快的方法是什么?for.net在我们的用例中运行得非常好 该库允许您使用XML生成Excel工作簿,它100%使用C#构建,不需要安装Excel来生成文件。它公开了一个简单的对象模型来生成XML工作簿 没有与GridView控件的内置集成,但是编写一个通用适配器非常简单,可以在其他项目中重用。可能有一些方法可以做到这一点,但是如果您想自己做,您可以编写一些代码来遍历GridView.Rows集合,

将gridview导出到Excel电子表格的最佳方式是什么

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

for.net在我们的用例中运行得非常好

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


没有与GridView控件的内置集成,但是编写一个通用适配器非常简单,可以在其他项目中重用。

可能有一些方法可以做到这一点,但是如果您想自己做,您可以编写一些代码来遍历GridView.Rows集合,然后是其中的GridViewRow.Cells集合

从那里构建CSV文件应该很容易,Excel可以毫无问题地读取它

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

"value", "value", "value"
"value", "value", "value"
你可以打开记事本,手工制作一个来试用

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将包括填充和颜色等样式属性。它还将使可排序的列标题看起来像链接。当我使用它时,我编写了一个自定义解析器来去除所有不需要的样式,只提供原始数据。我将把这个任务留给您,因为它是特定于每个网格的


非常重要的是,您必须包含对VerifyRenderingInServerForm的覆盖,即使其中没有任何代码。

我已经多次这样做了。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);
}

我使用了
CarlosAg.ExcelXmlWriter

我循环浏览了所有
gridview
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;
    }

此方法直接转换为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

在导出到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();

如果superuserI想通过编程来完成,我不同意。我想是的,布莱恩。我想通过编程的方式来实现这一点。我喜欢你的做法。但是,我不允许导入microsoft.office.Core我在哪里可以获取microsoft office文件?@Eric-您可以通过在同一台计算机上安装office来获取这些文件。但是,应该注意的是,在服务器上运行Office通常不是最佳做法。1。此方法不需要计算机上的Microsoft Office。2.永远不要在服务器上运行非SharePoint/non-MOSS Office组件,这会违反许可证并带来性能风险。我同意在生产服务器上安装Office是一种不好的做法。有时,我们为了在时间限制下得到我们所需要的结果而改变规则。上面的XML解决方案是最好的答案,但是创建模板和解析XML可能会很麻烦。我的问题是,我必须在每台机器上都这样做,对吗?我必须在每台机器上创建一个excel文件。这是一个将在公司范围内使用的应用程序。我想你应该将其编程到包含GridView的代码中。我对你的说法有点困惑。您正在创建基于web的应用程序还是桌面应用程序?是。这是正确的。我将尝试对此进行编程。这是一个基于web的应用程序。我可能是那个困惑的人。但是你说你必须在excel中创建一个excel文件。我必须在每台使用此应用程序的计算机上都这样做,对吗?不,我是告诉您首先创建一个模板excel文件,以便您能够了解所需的XML格式。然后,我将静态地将页眉和页脚字符串存储到您的程序中,以便您可以根据需要输出它们。所有其他文件将动态生成。我发布了一些示例代码。