ASP.NET MVC使用EPPlus,导出数据到Excel中

好久没写博客了,今天特地来更新一下,今天我们要学习的是如何导出数据到Excel文件中,这里我使用的是免费开源的Epplus组件。

源代码下载:https://github.com/caofangsheng93/ExcelExportInMvc

介绍

这篇文章,介绍的是怎样导出数据到Excel文件中,大多数的后端程序都有报表功能:把显示在Grid中的数据导出到Excel文件中,这篇文章中使用的是EPPlus组件。

EPPlus是一个基于OOXML【Open Extended Markup Language 】格式的,操作Excel表格的类库。OOXML是由微软开发的。默认支持微软的Office。

开源网站:http://epplus.codeplex.com/

正文

上面是我们的项目。

首先我们需要引入:EPPlus。

我这里已经引入了。

当我们在程序中使用ORM的时候,我们通常将数据保存在集合中。集合中的数据不能直接导出到Excel文件中。这也就是我们为啥,需要先将List转DataTable的原因。

图1 :导出Excel的步骤

为了完成这篇文章:我们需要四个步骤

1.数据:这里我使用静态数据,来确保这篇文章尽可能通俗易懂。

2.集合:静态数据保存在集合中

3.DataTable:转化泛型集合的数据,保存到DataTable中

4.导出文件:DataTable导出为Excel

首先,我们创建一个类:

public class Student
 {
  public int ID { get; set; }
  public string Name { get; set; }
  public string Sex { get; set; }
  public int Age { get; set; }
  public string Email { get; set; }
 }
Student

然后创建一个静态数据类:

public class StaticDataOfStudent
 {
  public static List<Student> ListStudent
  {
   get
   {
    return new List<Student>()
    {
    new Student(){ID=1,Name="曹操",Sex="男",Email="caocao@163.com",Age=24},
    new Student(){ID=2,Name="李易峰",Sex="女",Email="lilingjie@sina.com.cn",Age=24},
    new Student(){ID=3,Name="张三丰",Sex="男",Email="zhangsanfeng@qq.com",Age=224},
    new Student(){ID=4,Name="孙权",Sex="男",Email="sunquan@163.com",Age=1224},
    };
   }
  }
 }
StaticDataOfStudent

然后就是我们的导出Excel帮助类了:

/// <summary>
 /// Excel导出帮助类
 /// </summary>
 public class ExcelExportHelper
 {
  public static string ExcelContentType
  {
   get
   {
 return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
   }
  }
  /// <summary>
  /// List转DataTable
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="data"></param>
  /// <returns></returns>
  public static DataTable ListToDataTable<T>(List<T> data)
  {
   PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
   DataTable dataTable = new DataTable();
   for (int i = 0; i < properties.Count; i++)
   {
    PropertyDescriptor property = properties[i];
    dataTable.Columns.Add(property.Name, Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType);
   }
   object[] values = new object[properties.Count];
   foreach (T item in data)
   {
    for (int i = 0; i < values.Length; i++)
    {
     values[i] = properties[i].GetValue(item);
    }
    dataTable.Rows.Add(values);
   }
   return dataTable;
  }
  /// <summary>
  /// 导出Excel
  /// </summary>
  /// <param name="dataTable">数据源</param>
  /// <param name="heading">工作簿Worksheet</param>
  /// <param name="showSrNo">//是否显示行编号</param>
  /// <param name="columnsToTake">要导出的列</param>
  /// <returns></returns>
  public static byte[] ExportExcel(DataTable dataTable, string heading = "", bool showSrNo = false, params string[] columnsToTake)
  {
   byte[] result = null;
   using(ExcelPackage package=new ExcelPackage())
   {
    ExcelWorksheet workSheet = package.Workbook.Worksheets.Add(string.Format("{0}Data", heading));
    int startRowFrom = string.IsNullOrEmpty(heading) ? 1 : 3; //开始的行
    //是否显示行编号
    if (showSrNo)
    {
     DataColumn dataColumn = dataTable.Columns.Add("#", typeof(int));
     dataColumn.SetOrdinal(0);
     int index = 1;
     foreach (DataRow item in dataTable.Rows)
     {
      item[0] = index;
      index++;
     }
    }
    //Add Content Into the Excel File
    workSheet.Cells["A" + startRowFrom].LoadFromDataTable(dataTable, true);
    // autofit width of cells with small content
    int columnIndex = 1;
    foreach (DataColumn item in dataTable.Columns)
    {
     ExcelRange columnCells = workSheet.Cells[workSheet.Dimension.Start.Row, columnIndex, workSheet.Dimension.End.Row, columnIndex];
     int maxLength = columnCells.Max(cell => cell.Value.ToString().Count());
     if (maxLength < 150)
     {
      workSheet.Column(columnIndex).AutoFit();
     }
     columnIndex++;
    }
    // format header - bold, yellow on black
    using (ExcelRange r = workSheet.Cells[startRowFrom, 1, startRowFrom, dataTable.Columns.Count])
    {
     r.Style.Font.Color.SetColor(System.Drawing.Color.White);
     r.Style.Font.Bold = true;
     r.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
     r.Style.Fill.BackgroundColor.SetColor(System.Drawing.ColorTranslator.FromHtml("#1fb5ad"));
    }
    // format cells - add borders
    using (ExcelRange r = workSheet.Cells[startRowFrom + 1, 1, startRowFrom + dataTable.Rows.Count, dataTable.Columns.Count])
    {
     r.Style.Border.Top.Style = ExcelBorderStyle.Thin;
     r.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
     r.Style.Border.Left.Style = ExcelBorderStyle.Thin;
     r.Style.Border.Right.Style = ExcelBorderStyle.Thin;

     r.Style.Border.Top.Color.SetColor(System.Drawing.Color.Black);
     r.Style.Border.Bottom.Color.SetColor(System.Drawing.Color.Black);
     r.Style.Border.Left.Color.SetColor(System.Drawing.Color.Black);
     r.Style.Border.Right.Color.SetColor(System.Drawing.Color.Black);
    }
    // removed ignored columns
    for (int i = dataTable.Columns.Count - 1; i >= 0; i--)
    {
     if (i == 0 && showSrNo)
     {
      continue;
     }
     if (!columnsToTake.Contains(dataTable.Columns[i].ColumnName))
     {
      workSheet.DeleteColumn(i + 1);
     }
    }
    if (!String.IsNullOrEmpty(heading))
    {
     workSheet.Cells["A1"].Value = heading;
     workSheet.Cells["A1"].Style.Font.Size = 20;

     workSheet.InsertColumn(1, 1);
     workSheet.InsertRow(1, 1);
     workSheet.Column(1).Width = 5;
    }
    result = package.GetAsByteArray();
   }
   return result;
  }
  /// <summary>
  /// 导出Excel
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="data"></param>
  /// <param name="heading"></param>
  /// <param name="isShowSlNo"></param>
  /// <param name="ColumnsToTake"></param>
  /// <returns></returns>
  public static byte[] ExportExcel<T>(List<T> data, string heading = "", bool isShowSlNo = false, params string[] ColumnsToTake)
  {
   return ExportExcel(ListToDataTable<T>(data), heading, isShowSlNo, ColumnsToTake);
  }
 }

到此为止,后端服务器的代码,基本搞完,现在开始设计我们的前端代码:

我们创建一个ViewModel,用来显示数据:

public class StudentViewModel
 {
  public List<Student> ListStudent
  {
   get
   {
    return StaticDataOfStudent.ListStudent;
   }
  }
 }

然后创建一个控制器:

 public class HomeController : Controller
 {
  // GET: Home
  public ActionResult Index()
  {
   StudentViewModel model = new StudentViewModel();
   return View(model);
  }
  public FileContentResult ExportToExcel()
  {
   List<Student> lstStudent = StaticDataOfStudent.ListStudent;
   string[] columns = { "ID", "Name","Age"};
   byte[] filecontent = ExcelExportHelper.ExportExcel(lstStudent,"", false, columns);
   return File(filecontent, ExcelExportHelper.ExcelContentType, "MyStudent.xlsx");
  }
 }

我们的视图代码:

@model ExportToExcel.Models.StudentViewModel
@{
 ViewBag.Title = "Excel文件导出";
}
<div class="panel">
 <div class="panel-heading">
  <a href="@Url.Action("ExportToExcel")" class="btn btn-primary">Export</a>
 </div>
 <div class="panel-body">
  <table class="table table-striped table-bordered">
   <thead>
    <tr>
     <th>ID</th>
     <th>Name</th>
     <th>Sex</th>
     <th>Age</th>
     <th>Email</th>
    </tr>
   </thead>
   <tbody>
    @foreach (var item in Model.ListStudent)
    {
     <tr>
      <td>@item.ID</td>
      <td>@item.Name</td>
      <td>@item.Sex</td>
      <td>@item.Age</td>
      <td>@item.Email</td>
     </tr>
    }
   </tbody>
  </table>
 </div>
</div>

效果图:

点击Export之后,就导出了Excel文件到浏览器中:打开之后。

总结:这个导出帮助类,可以定制导出那些列。

   string[] columns = { "ID", "Name","Age"};
   byte[] filecontent = ExcelExportHelper.ExportExcel(lstStudent,"", false, columns);
   return File(filecontent, ExcelExportHelper.ExcelContentType, "MyStudent.xlsx"); 

这里我只是导出这三列。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!

(0)

相关推荐

  • asp.net实现的MVC跨数据库多表联合动态条件查询功能示例

    本文实例讲述了asp.net实现的MVC跨数据库多表联合动态条件查询功能.分享给大家供大家参考,具体如下: 一.控制器中方法 [HttpGet] public ActionResult Search() { ViewBag.HeadTitle = "搜索"; ViewBag.MetaKey = "\"123\""; ViewBag.MetaDes = "\"456\""; string whereText

  • ASP.NET Mvc开发之查询数据

    对于.NET平台上开发WebForm项目,程序员操作数据的方法主要是通过使用ADO.NET.而我们MVC操作数据库呢?与ADO.NET相比又有怎样的优势呢? 一.大家都在谈的EF到底是什么? EF,全称EntityFramWork.就是微软以ADO.NET为基础发展的所谓ORM(对象关系映射框架,或者说是数据持久化框架). 简单的来说就是根据实体对象操作数据表中数据的一种面向对象的操作框架,具体的底层也是调用ADO.NET. 下面我们就来演示怎么使用EF来操作数据库: 在数据库关系图中,表之间的

  • ASP.NET MVC 数据验证及相关内容

    一.数据验证 数据验证的步骤在模型类中添加与验证相关的特性标记在客户端导入与验证相关的js文件和css文件使用与验证相关的Html辅助方法在服务器端判断是否通过服务器端验证常用的验证标记 Required:非空验证StringLength:验证字符串的长度RegularExpression:正则表达式验证Compare:比较两个字段的值是否相等Range:范围验证Remote:服务器验证(需要在controller中编写返回值为JsonResult的Action)自定义验证标记与验证相关的js文

  • ASP.NET中MVC从后台控制器传递数据到前台视图的方式

    本文实例讲述了ASP.NET中MVC从后台控制器传递数据到前台视图的方式.分享给大家供大家参考.具体分析如下: 数据存储模型Model: 复制代码 代码如下: public class CalendarEvent { public string id { get; set; } public DateTime start { get; set; } public DateTime end { get; set; } public string backgroundColor { get; set

  • JQuery对ASP.NET MVC数据进行更新删除

    以前学习ASP.NET MVC时,学习与应用,操作过数据显示,添加,编辑,更新和删除等功能. 很多方法是相通的,看自己是怎样来进行方便,快捷,高效率. 今天Insus.NET写的练习,是直接对绑定在Table的数据进行更新,删除. 在项目中,创建一个实体,也就是说,对数据库时行通信,对数据进行操作: public IEnumerable<ToolLocation> GetAllToolLocations() { sp.ConnectionString = DB.ConnectionString

  • ASP.NET中MVC传递数据的几种形式总结

    本文实例讲述了ASP.NET中MVC传递数据的几种形式.分享给大家供大家参考.具体如下: 在Asp.net mvc开发中,Controller需要向View提供Model,然后View将此Model渲染成HTML.这篇文章介绍三种由Controller向View传递数据的方式,实现一个DropDownList的显示. 第一种:ViewData ViewData是一个Dictionary.使用非常简单,看下面代码: public ActionResult ViewDataWay(int id) {

  • 利用ASP.NET MVC+EasyUI+SqlServer搭建企业开发框架

    我们要搭建的框架是企业级开发框架,适用用企业管理信息系统的开发,如:OA.HR等 1.框架名称:sampleFrame. 2.搭建原则:最少知识原则. 3.先定义一个简单的编码规范:除类名和接口名外,其余首字母小写. 4.准备开发环境:vs2010及以上(mvc4).sqlserver.jquery2.0和easyui1.4.5 首先来看一下列表页面的效果图: 我们期望简洁带前台代码,如下: <table id="dataGrid" class="easyui-data

  • Asp.net mvc 数据调用示例代码

    (1)首先我们创建一个mvc项目,当然最好是mvc1.0版本以上. (2)我这个小Demo,没有重新配置路由解析,使用的是mvc项目默认的路由解析地址.当然如果谁感兴趣也可以自己添加一个默认路由! (3)我这里有一个名字叫Database1.mdf的数据库,里面包含一个News表. (4)然后我们右击Models文件夹,Models>添加新项,选择: 名字可以自己随便起.我这里叫做Test.edmx,然后点击添加. 下一步: 这里我们可以点击新建连接,来选择自己想要的数据库,最下面的是WebCo

  • asp.net mvc4 mysql制作简单分页组件(部分视图)

    在开始做mysql分页功能组件前,便设定的是要有一定可复用性.先在项目里Views文件夹下右键新建名为_PaginationComponent.cshtml,这里html及css我采用的bootstrap分页组件,这可以参考http://v3.bootcss.com/components/. 先将生成项目效果截图呈上: 这里有需要预先知道的,是mysql分页查询与mssql分页查询实现不同点在于,mysql支持limit语句,limit格式为 limit pageIndex*pageSize,p

  • ASP.NET Mvc开发之删除修改数据

    之前那篇文章介绍了ASP.NET MVC使用EF来查询数据和EF中DbQuery<T>泛型对象对数据的延迟加载.今天我们就来看看我们怎么使用EF来删除数据. 其实现在的Web开发通用的模式就是前端使用Js和JQuery来和后端进行数据交互.那么我们就在前端来加两个删除和更新的脚本.代码如下: <!--遍历 Action方法 设置给 ViewData 的集合数据,生成HTML代码--> @foreach (BlogArticle a in ViewData["DataLis

  • ASP.NET MVC DropDownList数据绑定及使用详解

    一:DropDownList 1.1 DropDownList绑定数据 1.1.1 DropDownList 固定绑定 这种方式适合那些已经固定的数据绑定到DropDownList上. 例 复制代码 代码如下: <asp:DropDownList runat="server" ID="ddlArea" Width="120px" > <asp:Listitem value="0">选择性别</as

  • 使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇

    调用jQuery的ajax方法时,jQuery会根据post或者get协议对参数data进行序列化; 如果提交的数据使用复杂的json数据,例如: {userId:32323,userName:{firstName:"李",lastName:"李大嘴"}} 那么服务器是无法正常接收到完整的参数,因为jQuery对data的序列化,是使用了键值对拼装的方式; 参数拼装成 userId=32323&userName=object ; userName所指向的对象

  • asp.net mvc 从数据库中读取图片的实现代码

    首先是创建一个类,继承于ActionResult,记住要引用System.Web.Mvc命名空间,如下: 复制代码 代码如下: public class ImageResult : ActionResult { public ImageFormat ContentType { get; set; } public Image image { get; set; } public string SourceName { get; set; } public ImageResult(string _

随机推荐