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

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.50/5 (3投票s)

2011年12月21日

CPOL

5分钟阅读

viewsIcon

36835

downloadIcon

933

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

Export Excel

引言

几乎所有财务和其他离散软件都要求强大的报告工具。在创建报告工具时,数据迁移成为许多开发人员的日常需求。本文介绍了一种使用简单 HTML 执行此迁移的简单技术。对于 HTML 新手,请快速浏览以下链接

背景

Microsoft Excel 是一个多功能的平台。许多公司在 Excel 中管理数据时感觉很舒适,尽管还有许多其他软件远优于它,但通过基于 Web 或桌面应用程序创建 Excel 工作表在格式化工作表(如合并单元格、更改单元格背景色、文本大小、字体族和颜色)时会变得很困难。本文提出的解决此问题的方法是将整个数据集合转换为 datatable / datasetGridview 的纯 HTML stream,然后将此 stream 写入文件并保存为(* .XLS* 默认 Excel 格式)。结果,创建了一个 Excel 工作表。在下面的文章中,我将展示两种不同的方法来使用以下技术

  • 以定义的格式创建自定义 Excel 工作表。
  • 从数据表/数据网格视图创建 Excel 工作表(使用“*ExcelToExport.cs*”)

创建简单的 Excel 工作表

我将从创建简单的 Excel 工作表开始,为此你需要创建一个简单的数据录入表单,我的看起来像这样

Export Excel Page

在本地浏览器中查看时 Default.aspx 的用户界面

单击“创建 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
    }

以下是上述代码片段的摘要

  1. 创建 string HTMLStream,此 HTMLStream 将包含所需 Excel 工作表的 HTML 代码。
  2. HTMLStream Default.aspx 标记代码文件中的相同,但 ASP 文本框被 SPAN 标签替换,其中包含文本框的文本。
  3. 为名为“*test.xls*”的空 Excel 文件创建 Stream Writer。
  4. HTMLStream 写入文件。
  5. 关闭 Stream Writer 并打开最近创建的文件“*test.xls*”。

有关更多说明,请遵循代码中的注释。

最终结果将是这样的

Export Excel Page

Excel 工作表“test.xls”显示通过给定代码创建的 Excel 工作表

通过创建此 Excel 工作表,我们设法通过简单的 HTML 执行了一些简单的格式化技术,如合并单元格、拆分单元格和更改背景色,因此文档看起来既美观又简洁,同时导出了我们的数据。现在,让我们进入下一个示例。

将 GridView 数据集合或 Datatable 数据集合导出到 Excel 工作表

本示例将展示如何将 DataGridView 数据集合或 Datatable 数据集合导出到 Excel 工作表。我已尽力使其非常简单,为此,我创建了一个名为“*ExportToExcel.cs*”的类。此类包含我们的 Excel 导出代码。CreateExcelSheet 方法已重载,因此可用于 gridviewdatatable

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;
    }

以下是上述代码片段的摘要

  1. 上述 CreateExcelSheet 方法接受一个 GRID VIEW 对象和一个 string 作为所需创建的 Excel 文件的路径。
  2. 创建一个 String HTMLStream,其目的与上一个示例相同,最初将 headbodystyle 标签添加到 string 中。
  3. 通过循环遍历列和行来填充 <td><tr> 标签,将 ASP GRID 转换为 HTML TABLE 标签。
  4. 最后,将整个数据集合转换为 <tr><td> 标签。
  5. 为作为参数提供的路径的空 Excel 文件创建 Stream Writer。
  6. HTMLStream 写入文件。
  7. 关闭 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;
    }
}

以下是上述代码片段的摘要

  1. 上述 CreateExcelSheet 方法接受一个 DATATBLE 对象和一个 string 作为所需创建的 Excel 文件的路径。
  2. 创建一个 String HTMLStream,其目的与上一个示例相同,最初将 headbodystyle 标签添加到 string 中。
  3. 通过循环遍历列和行来填充 <td><tr> 标签,将 DATABLE 转换为 HTML TABLE 标签。
  4. 最后,将整个数据集合转换为 <tr><td> 标签。
  5. 为作为参数提供的路径的空 Excel 文件创建 Stream Writer。
  6. HTMLStream 写入文件。
  7. 关闭 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
}
Export Excel Page Export Excel Page
包含记录集合的 DataGridView
包含 GridView 记录集合的 Excel 工作表

欢迎提出建议和推荐。如果您发现任何错误,请报告,否则请尽情享用。

结论

以上示例解释的核心概念是,如果您想以清晰美观的方式将数据导出到 Excel,您必须为此创建一个 HTML,该 HTML 需要在本地浏览器中查看相同的格式,然后将此 HTML 写入 Excel 文件即可。为此,可以使用“*ExcelToExport.cs*”类文件轻松地将 datatables 和 gridviews 转换为 Excel 文件。

历史

  • 原始版本于 2011 年 12 月 14 日提交
© . All rights reserved.