使用 HTML 将 DataGridView 或 Datatable 中的数据导出到 Excel 表格






3.50/5 (3投票s)
将数据导出到 Excel 是许多解决方案提供商的日常需求。本文展示了如何使用简单的 HTML 将数据迁移到 Excel。

引言
几乎所有财务和其他离散软件都要求强大的报告工具。在创建报告工具时,数据迁移成为许多开发人员的日常需求。本文介绍了一种使用简单 HTML 执行此迁移的简单技术。对于 HTML 新手,请快速浏览以下链接
背景
Microsoft Excel 是一个多功能的平台。许多公司在 Excel 中管理数据时感觉很舒适,尽管还有许多其他软件远优于它,但通过基于 Web 或桌面应用程序创建 Excel 工作表在格式化工作表(如合并单元格、更改单元格背景色、文本大小、字体族和颜色)时会变得很困难。本文提出的解决此问题的方法是将整个数据集合转换为 datatable
/ dataset
或 Gridview
的纯 HTML stream
,然后将此 stream
写入文件并保存为(* .XLS* 默认 Excel 格式)。结果,创建了一个 Excel 工作表。在下面的文章中,我将展示两种不同的方法来使用以下技术
- 以定义的格式创建自定义 Excel 工作表。
- 从数据表/数据网格视图创建 Excel 工作表(使用“*ExcelToExport.cs*”)
创建简单的 Excel 工作表
我将从创建简单的 Excel 工作表开始,为此你需要创建一个简单的数据录入表单,我的看起来像这样
单击“创建 Excel 工作表”按钮的事件,但在此之前,你需要 Sytem.Diagnostics
命名空间,因此请在文件开头添加以下代码
using System.Diagnostics;
protected void Btn_Save_Click(object sender, EventArgs e)
{
// Creating an HTML Stream, this HTML stream will create the desired
// Excel sheet in an HTML format
String HtmlStream;
HtmlStream = "<html><body><style type='text/css'>.lblcaptions
{ font: bold small Verdana;}.mainTable{
background: #F7F6F3; color: #333333;}</style><table class='mainTable'
cellpadding='0' cellspacing='0' border='1' width='100%'>";
HtmlStream += "<tr><td style='text-align:center;
background-color:Aqua;' colspan='4'><span class='lblcaptions'>
CLIENT INFORMATION FORM</span></td></tr>";
HtmlStream += "<tr><td style='text-align:center;
background-color:Aqua;' colspan='4'><span class='lblcaptions'>
Kindly write / type in 'CAPITAL LETTERS'</span></td></tr>";
HtmlStream += "<tr><td style='text-align:left; width:25%;'>
<span class='lblcaptions'>TCS ACCOUNT #</span></td>";
HtmlStream += "<td style='text-align:left; width:75%;' colspan='3'>" +
txtAccountNumber.Text + "</td>";
HtmlStream += "<tr><td style='text-align:left; width:25%;'>
<span class='lblcaptions'>TITLE OF ACCOUNT</span></td>";
HtmlStream += "<td style='text-align:left; width:75%;' colspan='3'>" +
txtTitleOfAccount.Text + "</td></tr>";
HtmlStream += "<tr><td style='text-align:left; width:25%;'>
<span class='lblcaptions'>BILLING ADDRESS</span><br /></td>
<td style='text-align:left; width:75%;' colspan='3'>" +
txtbillingaddress.Text + "</td></tr>";
HtmlStream += "<tr><td style='text-align:left; width:25%;'>
<span class='lblcaptions'>REGISTERED OFFICE ADDRESS</span><br /></td>
<td style='text-align:left; width:75%;' colspan='3'>" + txtofficeadd.Text +
"<br /></td></tr>";
HtmlStream += "<tr><td style='text-align:left; width:25%;'>
<span class='lblcaptions'>INDUSTRY</span><br /></td>
<td style='text-align:left; width:75%;' colspan='3'>" + txtIndustry.Text +
"<br /></td></tr>";
HtmlStream += "<tr><td style='text-align:left; width:25%;'>
<span class='lblcaptions'>CONTACT PERSON</span><br /></td>
<td style='text-align:left; width:25%;'>" + txtcontact.Text + "<br /></td>
<td style='text-align:left; width:25%;'><span class='lblcaptions'>
DESIGNATION</span><br /></td><td style='text-align:left; width:25%;'>" +
txtDesigation.Text + "<br /></td></tr>";
HtmlStream += "<tr><td style='text-align:left; width:25%;'>
<span class='lblcaptions'>MOBILE #</span><br /></td>
<td style='text-align:left; width:75%;' colspan='3'>" + txtMobile.Text +
"<br /></td></tr>";
HtmlStream += "<tr><td style='text-align:left; width:25%;'>
<span class='lblcaptions'>NTN #</span><br /></td>
<td style='text-align:left; width:25%;'>" + txtNTN.Text + "<br /></td>
<td style='text-align:left; width:25%;'><span class='lblcaptions'>NIC#</span>
<br /></td><td style='text-align:left; width:25%;'>" + txtNIC.Text +
"<br /></td></tr>";
HtmlStream += "<tr><td style='text-align:left; width:25%;'>
<span class='lblcaptions'>GST #</span><br /></td>
<td style='text-align:left; width:75%;' colspan='3'>" + txtgst.Text +
"<br /></td></tr>";
HtmlStream += "<tr><td style='text-align:left; width:25%;'>
<span class='lblcaptions'>TELEPHONE #</span><br /></td>
<td style='text-align:left; width:75%;' colspan='3'>" + txttelephone.Text +
"<br /></td></tr>";
HtmlStream += "<tr><td style='text-align:left; width:25%;'>
<span class='lblcaptions'>FAX #</span><br /></td><td style='text-align:left;
width:25%;'>" + txtfax.Text + "<br /></td><td style='text-align:left;
width:25%;'><span class='lblcaptions'>UAN #</span><br /></td>
<td style='text-align:left; width:25%;'>" + txtuan.Text + "<br /></td></tr>";
HtmlStream += "<tr><td style='text-align:left; width:25%;'>
<span class='lblcaptions'>EMAIL</span><br /></td>
<td style='text-align:left; width:75%;' colspan='3'>" +
txtEmail.Text + "<br /></td></tr>";
HtmlStream += "<tr><td style='text-align:left; width:25%;'>
<span class='lblcaptions'>WEBSITE</span><br /></td>
<td style='text-align:left; width:75%;' colspan='3'>" + txtwebsite.Text +
"<br /></td></tr>";
HtmlStream += "<tr><td style=' background-color:Aqua;' colspan='4'><br />
</td></tr>";
HtmlStream += "</table></body></html>";
// Creating a file 'test.XLS' as a sample excel sheet
// You Might get any error regarding Access Path Denied,
// as some operating systems dont give access to C:\, so please change the path
// here instead of "c:\\test.xls"
System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\test.xls");
file.WriteLine(HtmlStream);// now writing the stream to the file
file.Close();// closing the streamwriter
// Provide the actual path if not using this default path
Process.Start("c:\\test.xls");// Opening the excel sheet
}
以下是上述代码片段的摘要
- 创建
string
HTMLStream
,此HTMLStream
将包含所需 Excel 工作表的HTML
代码。 - 此
HTMLStream
与 Default.aspx 标记代码文件中的相同,但 ASP 文本框被SPAN
标签替换,其中包含文本框的文本。 - 为名为“*test.xls*”的空 Excel 文件创建
Stream
Writer。 - 将
HTMLStream
写入文件。 - 关闭 Stream Writer 并打开最近创建的文件“*test.xls*”。
有关更多说明,请遵循代码中的注释。
最终结果将是这样的
通过创建此 Excel 工作表,我们设法通过简单的 HTML 执行了一些简单的格式化技术,如合并单元格、拆分单元格和更改背景色,因此文档看起来既美观又简洁,同时导出了我们的数据。现在,让我们进入下一个示例。
将 GridView 数据集合或 Datatable 数据集合导出到 Excel 工作表
本示例将展示如何将 DataGridView
数据集合或 Datatable
数据集合导出到 Excel 工作表。我已尽力使其非常简单,为此,我创建了一个名为“*ExportToExcel.cs*”的类。此类包含我们的 Excel 导出代码。CreateExcelSheet
方法已重载,因此可用于 gridview
和 datatable
。
public bool CreateExcelSheet(GridView GV, string path)
{
String HtmlStream;
HtmlStream = "<html><body><style type='text/css'>.lblcaptions
{ font: bold small Verdana;}.mainTable{
background: #F7F6F3; color: #333333;}
</style><table class='mainTable' width='100%'>";
// Creating Header Row
HtmlStream += "<tr>";
for (int field = 0; field < GV.HeaderRow.Cells.Count; field++)
{
HtmlStream += "<td style='text-align:center;'><span class='lblcaptions'>" +
GV.HeaderRow.Cells[field].Text + "</span><br /></td>";
}
HtmlStream += "</tr>";
//Creating DataRows
foreach (GridViewRow row in GV.Rows)
{
HtmlStream += "<tr>";
foreach (TableCell cell in row.Cells)
{
HtmlStream += "<td>"+cell.Text+"</td>";
}
HtmlStream += "</tr>";
}
HtmlStream += "</table></body></html>";
// Creating an XLS file and writing the HTML stream the file.
System.IO.StreamWriter file = new System.IO.StreamWriter(path);
file.WriteLine(HtmlStream);
file.Close();
return true;
}
以下是上述代码片段的摘要
- 上述
CreateExcelSheet
方法接受一个GRID VIEW
对象和一个string
作为所需创建的 Excel 文件的路径。 - 创建一个
String
HTMLStream
,其目的与上一个示例相同,最初将head
、body
、style
标签添加到string
中。 - 通过循环遍历列和行来填充
<td>
和<tr>
标签,将ASP GRID
转换为HTML TABLE
标签。 - 最后,将整个数据集合转换为
<tr>
和<td>
标签。 - 为作为参数提供的路径的空 Excel 文件创建
Stream
Writer。 - 将
HTMLStream
写入文件。 - 关闭
Stream
Writer。
有关更多说明,请遵循代码中的注释。
public bool CreateExcelSheet(DataTable dt, string path)
{
String HtmlStream;
HtmlStream = "<html><body><style type='text/css'>.lblcaptions
{ font: bold small Verdana;}.mainTable{ background: #F7F6F3;
color: #333333;}</style><table class='mainTable' width='100%'>";
// Creating Header Row
HtmlStream += "<tr>";
for (int field = 0; field < dt.Columns.Count; field++)
{
HtmlStream += "<td style='text-align:center;'>
<span class='lblcaptions'>" + dt.Columns[field].ColumnName.ToString() +
"</span><br /></td>";
}
HtmlStream += "</tr>";
//Creating DataRows
foreach (DataRow row in dt.Rows)
{
HtmlStream += "<tr>";
for (int field = 0; field < dt.Columns.Count; field++)
{
HtmlStream += "<td>" + row[field].ToString() + "</td>";
}
HtmlStream += "</tr>";
}
HtmlStream += "</table></body></html>";
// Creating an XLS file and writing the HTML stream the file.
System.IO.StreamWriter file = new System.IO.StreamWriter(path);
file.WriteLine(HtmlStream);
file.Close();
Process.Start(path);
return true;
}
}
以下是上述代码片段的摘要
- 上述
CreateExcelSheet
方法接受一个DATATBLE
对象和一个string
作为所需创建的 Excel 文件的路径。 - 创建一个
String
HTMLStream
,其目的与上一个示例相同,最初将head
、body
、style
标签添加到string
中。 - 通过循环遍历列和行来填充
<td>
和<tr>
标签,将DATABLE
转换为HTML TABLE
标签。 - 最后,将整个数据集合转换为
<tr>
和<td>
标签。 - 为作为参数提供的路径的空 Excel 文件创建
Stream
Writer。 - 将
HTMLStream
写入文件。 - 关闭
Stream
Writer。
有关更多说明,请遵循代码中的注释。
现在,我们只需要创建该类的对象并调用其相关方法即可。
(注意:这里我用 XML 文件的数据集合填充了 gridview
,并使用“*ExporttoExcel.cs*”来创建 Excel 文件。)
ExportToExcel excl = new ExportToExcel();
protected void Page_Load(object sender, EventArgs e)
{
// Creating a Dummy Dataset
DataSet Records = new DataSet();
// Filling the dataset with XML data in books.xml file
Records.ReadXml(Server.MapPath("books.xml"));
// binding the gridview with the dataset
gvRecords.DataSource = Records;
gvRecords.DataBind();
// creating an excel
// You Might get any error regarding Access Path Denied,
// as some operating systems dont give access to C:\,
// so please change the path here instead of "c:\\test.xls"
excl.CreateExcelSheet(this.gvRecords, "C:\\Test.xls");
// This method can also be used like this excel.CreateExcelSheet
// (Records.Tables[0], "C:\\Test.xls") this is because the method has been overloaded
}
![]() |
![]() |
包含记录集合的 DataGridView
|
包含 GridView 记录集合的 Excel 工作表
|
欢迎提出建议和推荐。如果您发现任何错误,请报告,否则请尽情享用。
结论
以上示例解释的核心概念是,如果您想以清晰美观的方式将数据导出到 Excel,您必须为此创建一个 HTML,该 HTML 需要在本地浏览器中查看相同的格式,然后将此 HTML 写入 Excel 文件即可。为此,可以使用“*ExcelToExport.cs*”类文件轻松地将 datatables 和 gridviews 转换为 Excel 文件。
历史
- 原始版本于 2011 年 12 月 14 日提交