三步将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日

相关文章

  • C# Linq的Skip()方法 – 跳过序列中指定数量的元素并返回剩余元素

    当使用LINQ(C# language integrated query)对集合进行查询时,我们经常需要对查询结果进行排序、筛选、分组和投影等操作。而 Skip() 方法是其中一个很有用的操作之一。 一、Skip()方法的概述 Skip() 方法是用来跳过指定数量的元素并返回剩余元素的 LINQ 方法。Skip() 方法跳过序列中的从头开始的指定数量的元素,…

    C# 2023年4月19日
    00
  • WinForm相对路径的陷阱

    WinForm相对路径的陷阱是指在Windows窗体应用程序中使用相对路径时可能会遇到的问题。在WinForm应用程序中,使用相对路径可以方便地引用外部文件,例如资源文件、配置文件、图片等,但是如果不注意一些细节,就会出现问题。下面是WinForm相对路径的完整攻略。 1. 了解相对路径和绝对路径 在开始之前,我们需要了解相对路径和绝对路径的概念。相对路径是…

    C# 2023年6月1日
    00
  • C#中的协变与逆变小结

    下面是“C#中的协变与逆变小结”的完整攻略: 什么是协变和逆变 协变和逆变是C#中的两个概念,它们都涉及到了类型转换。简单来说: 协变:表示在类型转换过程中,类型参数可以“向上转”,也就是说如果T1是T2的子类型,那么Func<T1>可以转换为Func<T2>。 逆变:表示在类型转换过程中,类型参数可以“向下转”,也就是说如果T1是T…

    C# 2023年5月14日
    00
  • C#基础概念二十五问 16-20

    “C#基础概念二十五问 16-20” 是一篇讲解 C# 基础概念的文章,其中包含了 25 个问题,我将侧重讲解其中的 16-20 个问题的攻略,以下是详细讲解: 问题16:什么是特性? 答:特性是一种用于为代码声明元数据 (metadata) 的语言结构。它们添加关于定义的附加信息,这些信息可以使用各种工具和框架来进行访问和分析。例如,您可以使用特性来描述程…

    C# 2023年6月1日
    00
  • C#高级静态语言效率利器之泛型详解

    C#高级静态语言效率利器之泛型详解 在C#中,泛型是一种高级的语言特性,它可以使我们编写更加灵活、更加安全、更加高效的代码。本文将对泛型进行详细的讲解,希望能够帮助读者更好地理解泛型。 什么是泛型 泛型可以被理解为一种参数化类型,它将类型作为参数进行传递,从而使我们可以在同一份代码中编写适用于多种类型的代码。使用泛型可以使我们避免在程序中出现冗余的代码,提高…

    C# 2023年5月15日
    00
  • C# 动态加载程序集信息

    C# 动态加载程序集信息是指在程序运行中,动态地从文件系统或网络中加载程序集信息,然后使用反射技术获取程序集中的类型信息并进行调用。这种动态加载程序集信息的方法通常用于实现插件式架构、程序集延迟加载等功能。 实现C# 动态加载程序集信息的步骤如下: 加载程序集 使用Assembly.Load方法,可以从文件系统或网络中加载程序集。如下面的代码: Assemb…

    C# 2023年6月1日
    00
  • C#基于自定义事件EventArgs实现发布订阅模式

    关于 “C#基于自定义事件EventArgs实现发布订阅模式” 的完整攻略,可以从以下几个方面讲解: 一、理解发布订阅模式 简单来说,发布订阅模式(Publish/Subscribe Pattern,又称为观察者模式)是一种消息模型,其中一个消息的发布者 (Publisher) 不会直接向某个特定的订阅者 (Subscriber) 发送消息,而是发布(广播)…

    C# 2023年6月6日
    00
  • 一文详解gRPC快速整合SpringCloud

    一文详解gRPC快速整合SpringCloud 简介 gRPC作为新一代远程过程调用(RPC)框架,通过Protobuf序列化及二进制传输,可以高效、可扩展、可互操作的连接分布式系统,是分布式领域内受到热捧的技术。 Spring Cloud则是一种基于Spring Boot的分布式架构微服务开发工具套件,提供了服务注册、配置管理、流量控制、负载均衡等分布式开…

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