C# 导出gridview数据
将gridview导出到Excel电子表格的最佳方式是什么 除了我的Gridview没有导出属性。最快的方法是什么?for.net在我们的用例中运行得非常好 该库允许您使用XML生成Excel工作簿,它100%使用C#构建,不需要安装Excel来生成文件。它公开了一个简单的对象模型来生成XML工作簿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控件的内置集成,但是编写一个通用适配器非常简单,可以在其他项目中重用。可能有一些方法可以做到这一点,但是如果您想自己做,您可以编写一些代码来遍历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格式。然后,我将静态地将页眉和页脚字符串存储到您的程序中,以便您可以根据需要输出它们。所有其他文件将动态生成。我发布了一些示例代码。