三步将Asp.Net页面输出到EXCEL里

下面是“三步将Asp.Net页面输出到Excel里”的完整攻略,包含两个示例。

1. 引用Excel操作库

在输出Asp.Net页面到Excel前,需要先引用Excel操作库。常用的Excel操作库包括:

  • NPOI(Nuget包名:NPOI)
  • EPPlus(Nuget包名:EPPlus)

这里以NPOI为例。我们可以通过Nuget引入NPOI:

Install-Package NPOI

或者在项目的Packages.config文件中手动添加:

<packages>
  <package id="NPOI" version="2.5.3" targetFramework="net461" />
</packages>

2. 编写输出代码

输出代码的核心是将Asp.Net页面转换成Excel数据格式。下面是一个示例代码,用于将GridView中的数据输出到Excel:

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class ExcelSample : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindGrid();
        }
    }

    private void BindGrid()
    {
        var data = new List<Customer>()
        {
            new Customer {Name = "Tom", Age = 18},
            new Customer {Name = "Jerry", Age = 20},
            new Customer {Name = "Lucy", Age = 22},
        };
        gvData.DataSource = data;
        gvData.DataBind();
    }

    protected void btnExport_Click(object sender, EventArgs e)
    {
        var wb = new HSSFWorkbook();
        var sheet = wb.CreateSheet("Sheet1");

        var row = sheet.CreateRow(0);
        for (int i = 0; i < gvData.HeaderRow.Cells.Count; i++)
        {
            row.CreateCell(i).SetCellValue(gvData.HeaderRow.Cells[i].Text);
        }

        for (int i = 0; i < gvData.Rows.Count; i++)
        {
            row = sheet.CreateRow(i + 1);
            for (int j = 0; j < gvData.Rows[i].Cells.Count; j++)
            {
                row.CreateCell(j).SetCellValue(gvData.Rows[i].Cells[j].Text);
            }
        }

        var fileName = "Export" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".xls";
        var ms = new MemoryStream();
        wb.Write(ms);
        Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
        Response.ContentType = "application/vnd.ms-excel";
        Response.BinaryWrite(ms.ToArray());
        wb = null;
        ms.Close();
        ms = null;
        Response.End();
    }
}

public class Customer
{
    public string Name { get; set; }
    public int Age { get; set; }
}

这个例子中,我们首先在页面加载时绑定GridView的数据,然后通过按钮的点击事件将数据输出到Excel文件。输出的过程中,我们创建一个Workbook对象,再创建一个Sheet对象,然后逐行逐列地将数据填入Sheet中,并最终将Workbook对象写入内存流中,并输出给客户端。在Response对象中设置Content-Disposition、Content-Type等属性,后在BinaryWrite方法中输出二进制数据。

3. 测试输出结果

当你运行代码,点击"Export"按钮时,Excel文件会被下载到本地。你可以双击打开它,看看输出结果是否与你预期一致。

下面是一个输出进阶版的示例代码,用于将自定义的数据集合输出到Excel:

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class ExcelSample : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindData();
        }
    }

    private void BindData()
    {
        var data = new List<Student>()
        {
            new Student {Name = "Tom", Age = 18, Gender = "M", Score = 85},
            new Student {Name = "Jerry", Age = 20, Gender = "M", Score = 90},
            new Student {Name = "Lucy", Age = 22, Gender = "F", Score = 88},
        };
        gvData.DataSource = data;
        gvData.DataBind();
    }

    protected void btnExport_Click(object sender, EventArgs e)
    {
        var fileName = "Export" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".xls";
        var ms = ExportDataToExcel(PrepareData(), fileName);
        Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
        Response.ContentType = "application/vnd.ms-excel";
        Response.BinaryWrite(ms.ToArray());
        ms.Close();
        ms = null;
        Response.End();
    }

    private MemoryStream ExportDataToExcel(IEnumerable<Student> data, string fileName)
    {
        var wb = new HSSFWorkbook();
        var sheet = wb.CreateSheet("Sheet1");

        var rowIndex = 0;

        // header
        var row = sheet.CreateRow(rowIndex++);
        row.CreateCell(0).SetCellValue("Name");
        row.CreateCell(1).SetCellValue("Age");
        row.CreateCell(2).SetCellValue("Gender");
        row.CreateCell(3).SetCellValue("Score");

        // data
        foreach (var item in data)
        {
            row = sheet.CreateRow(rowIndex++);
            row.CreateCell(0).SetCellValue(item.Name);
            row.CreateCell(1).SetCellValue(item.Age);
            row.CreateCell(2).SetCellValue(item.Gender);
            row.CreateCell(3).SetCellValue(item.Score);
        }

        var ms = new MemoryStream();
        wb.Write(ms);
        wb = null;
        ms.Seek(0, SeekOrigin.Begin);
        return ms;
    }

    private IEnumerable<Student> PrepareData()
    {
        var data = new List<Student>()
        {
            new Student {Name = "Tom", Age = 18, Gender = "M", Score = 85},
            new Student {Name = "Jerry", Age = 20, Gender = "M", Score = 90},
            new Student {Name = "Lucy", Age = 22, Gender = "F", Score = 88},
            new Student {Name = "Amy", Age = 19, Gender = "F", Score = 92},
            new Student {Name = "Bob", Age = 21, Gender = "M", Score = 84},
            new Student {Name = "John", Age = 20, Gender = "M", Score = 85},
            new Student {Name = "Lily", Age = 22, Gender = "F", Score = 90},
        };

        // apply filter
        if (!string.IsNullOrEmpty(txtNameFilter.Text))
        {
            data = data.Where(s => s.Name.IndexOf(txtNameFilter.Text.Trim(), StringComparison.OrdinalIgnoreCase) >= 0).ToList();
        }

        return data;
    }
}

public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Gender { get; set; }
    public int Score { get; set; }
}

这个例子中,我们精简了页面结构,仅保留了一个GridView和一个输出按钮。数据绑定和输出的核心代码分别封装在了BindData、PrepareData、ExportDataToExcel三个方法中。PrepareData用于准备数据,ExportDataToExcel用于将数据导出到Excel文件中。这里我们加入了一个简单的查询功能,可以根据姓名来筛选学生。

这里举的是两个例子,只是涵盖了Excel导出的两个方面,但实际使用中,需要根据具体情况进行探索、迭代和优化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:三步将Asp.Net页面输出到EXCEL里 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • .NET中堆栈和堆的特点与差异介绍

    在.NET中,堆和栈是两种常见的内存分配方式。堆和栈的特点和差异如下: 堆的特点 堆是一种动态分配的内存区域,用于存储对象和数据结构。 堆的大小可以动态增长或缩小,由垃圾回收器负责管理。 堆中的对象可以通过引用来访问,引用是指向对象在堆中的地址。 堆中的对象可以被多个线程共享。 堆中的对象的生命周期由垃圾回收器来管理。 栈的特点 栈是一种静态分配的内存区域,…

    C# 2023年5月17日
    00
  • ASP.NET C#中Application的用法教程

    下面是ASP.NET C#中Application的用法教程的完整攻略: 什么是 Application? 在 ASP.NET C# 中,Application 可以理解为全局变量,它在整个应用程序范围内都可用。Application 可以存储和访问应用程序的常用的数据,并在不同的页面和会话之间共享这些数据。 如何使用 Application? 在 C# 中…

    C# 2023年5月15日
    00
  • c#继承与多态使用示例

    我可以为您解释下“C#继承与多态使用示例”的完整攻略。 标题 标题是标识文章主题的必要元素,我们可以通过#符号来对标题进行标注,例如: # C#继承与多态使用示例 继承 在 C# 中,类可以通过继承从另一个类中获得其成员。继承的语法为: class SubClass : SuperClass { //子类成员 } 在此示例中,SubClass 会从 Supe…

    C# 2023年6月1日
    00
  • C#如何给枚举类型增加一个描述特性详解

    C#可以通过给枚举类型增加描述特性(Description Attribute),为每个枚举成员添加对应的文字说明,方便代码的阅读和维护。 实现的步骤如下: 1. 定义枚举类型 首先需要定义一个枚举类型,以示例说明为例: public enum Gender { [Description("未知")] Unknown = 0, [Desc…

    C# 2023年6月1日
    00
  • .Net(c#)汉字和Unicode编码互相转换实例

    .Net(c#)汉字和Unicode编码互相转换实例 在 .Net(c#) 中,我们可以很方便地进行汉字和 Unicode 编码之间的转换。本文将为您介绍汉字和 Unicode 编码的基本概念,并提供两个示例说明。 汉字和 Unicode 编码 Unicode 编码是一种字符编码标准,它使用一个编号来表示每个字符。Unicode 编码可以用来表示汉字、英文字…

    C# 2023年6月1日
    00
  • C#基础知识之字符串和正则表达式

    C#基础知识之字符串和正则表达式 一、字符串 1. 字符串的定义 在 C# 中,字符串是一个不可变的对象,表示文字和其他字符序列。C# 中的字符串对象是 System.String 类型的实例。创建字符串即是创建 String 对象,并使用双引号或 @-引号字符串来表示字符串值。如: string str1 = "Hello world!&quot…

    C# 2023年6月1日
    00
  • C#生成DLL文件的方法

    C#是一种广泛使用的面向对象编程语言,典型的用途是在Windows操作系统上开发桌面应用程序。通过生成DLL文件,我们可以使C#程序与其他语言的程序进行无缝交互。以下是生成C# DLL文件的完整攻略: 第一步:创建新的C#类库项目 在Visual Studio中,选择“File” -> “New” -> “Project”,在“New Proje…

    C# 2023年6月1日
    00
  • c# 实现模糊PID控制算法

    c# 实现模糊PID控制算法攻略 什么是PID控制? PID控制是指通过对被控对象给出适当的控制量来使被控对象的输出接近于所要求的期望输出,并且能够根据被控对象给出的反馈信息来调整控制量,从而提高控制的精度。PID控制算法包含三个部分,分别是比例控制、积分控制、微分控制。 什么是模糊PID控制? 对于一些非线性或者模糊的系统,传统PID控制算法无法处理。此时…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部