65.9K
CodeProject 正在变化。 阅读更多。
Home

将 DataGrid 导出到 Excel、Word 和文本文件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.63/5 (38投票s)

2005年7月21日

3分钟阅读

viewsIcon

839491

downloadIcon

11862

如何将 DataGrid 导出到 Excel、Word 和文本文件。

引言

DataGrid 是 ASP.NET 中最酷的控件之一。所有开发人员都需要做的一件事是将 DataGrid 数据放入 Excel 表格。在本文中,我将向您展示如何将 DataGrid 数据导出到 Excel 文件、Word 文件以及文本文件。

将 DataGrid 导出到 Excel

DataGrid 导出到 Excel 听起来可能很复杂,但实际上非常简单。让我们看看如何实现这一点。

Response.Clear();
Response.AddHeader("content-disposition", "attachment;filename=FileName.xls");
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = "application/vnd.xls";

System.IO.StringWriter stringWrite = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);

myDataGrid.RenderControl(htmlWrite);
Response.Write(stringWrite.ToString());
Response.End();

上面给出的代码是将 DataGrid 导出到 Excel 文件的完整代码

  • Response.AddHeader 让 ASP.NET 知道我们要导出到名为 FileName.xls 的文件。
  • Response.ContentType 表示正在导出的文件的类型。
  • myDataGrid.RenderControl(htmlWrite) 将数据写入 HtmlTextWriter
  • Response.Write(stringWrite.ToString()); 将请求发送到响应流。

正如您所看到的,将 DataGrid 导出到 Excel 文件非常简单。

将 DataGrid 导出到 Word 文件

您还可以将 DataGrid 导出到 Word 文件。您可能会问为什么有人会这样做。如果您有一个 Word 文档需要一个表格,那么您可以简单地将表格从 DataGrid 导出到 Word 文档。代码与上述代码类似,只是稍作修改。

Response.Clear();
Response.AddHeader("content-disposition", "attachment;filename=FileName.doc");
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = "application/vnd.word";

System.IO.StringWriter stringWrite = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);

myDataGrid.RenderControl(htmlWrite);
Response.Write(stringWrite.ToString());
Response.End();

将 DataGrid 导出到文本文件

有时您需要将 DataGrid 导出到文本文件。在这种情况下,您需要遍历 DataSet 并将文本连接到字符串,或者更确切地说,是 StringBuilder 对象。让我们看看如何实现这一点

Database db = DatabaseFactory.CreateDatabase();
DBCommandWrapper selectCommandWrapper = 
   db.GetStoredProcCommandWrapper("sp_GetLatestArticles");
DataSet ds = db.ExecuteDataSet(selectCommandWrapper);
StringBuilder str = new StringBuilder();

for(int i=0;i<=ds.Tables[0].Rows.Count - 1; i++)
{
  for(int j=0;j<=ds.Tables[0].Columns.Count - 1; j++)
  {
      str.Append(ds.Tables[0].Rows[i][j].ToString());
  }

  str.Append("<BR>");
}

Response.Clear();
Response.AddHeader("content-disposition", 
         "attachment;filename=FileName.txt");
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ContentType = "application/vnd.text";

System.IO.StringWriter stringWrite = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter htmlWrite = 
              new HtmlTextWriter(stringWrite);

Response.Write(str.ToString());
Response.End();

需要注意的重要一点是,这两个 for 循环遍历 DataSet 并将行附加到 StringBuilder 对象中。

将 DataGrid 导出到 Excel 时的格式问题

我想感谢 Sonu Kapoor 帮助我解决了将 DataGrid 导出到 Excel 时的格式问题,并感谢 Juss 提供了代码。

当您将 DataGrid 导出到 Excel 时,它会失去其格式。这意味着您的 DataGrid 可能有一个包含数字的字符串字段,例如“002345”。但是,当您导出网格并在 Excel 文件中看到它时,您会发现数字变成了“2345”。

您可以使用层叠样式表来解决此问题。

Juss 提供的代码

Dim strFileName, strFilePath AsString
Dim oStringWriter AsNew System.IO.StringWriter
Dim oHtmlTextWriter AsNew System.Web.UI.HtmlTextWriter(oStringWriter)
Dim objStreamWriter As StreamWriter
Dim strStyle AsString = "<style>.text { mso-number-format:\@; } </style>"
objStreamWriter = File.AppendText(strFilePath)
DataGrid1.RenderControl(oHtmlTextWriter)
objStreamWriter.WriteLine(strStyle)
objStreamWriter.WriteLine(oStringWriter.ToString())
objStreamWriter.Close()

你们大多数人可能正在思考代码中的“mso-number-format”内容。这是导出列的样式。因此,您需要将属性注入到要更改显示格式的 DataGrid 列中。

DataGrid1.DataBind()
Dim strStyle AsString = "<style>.text { mso-number-format:\@; } </style>"
For intTemp AsInteger = 1 To ds.Tables(0).Rows.Count - 1
   DataGrid1.Items(intTemp).Cells(0).Attributes.Add("class", "text")
Next

您可以导出多种格式。您只需要知道 mso-number-format:\@;。您可以通过打开 Excel 文件并在其中一个单元格中键入一个数字来轻松找到该格式。现在,如果您想将此数字保存为社会安全模式 (xxx-xx-xxxx),请右键单击该单元格并选择一种模式将其保存为社会安全号码。接下来,将 Excel 文件保存为 XML 格式。在记事本中打开 XML 文件,查看列 SSN 使用的样式。 SSN 样式类似于这样:mso-number-format:000\-00\-0000。

只需在新样式中替换 strStyle 变量,就完成了。

有关此问题的完整讨论,请访问 此链接

希望您喜欢这篇文章,祝您编码愉快!

© . All rights reserved.