最近在做 MVC 项目的时候遇到项目的导出,下面总结下两种导出到excel 的方法

第一种方法: 将文件写到本地,然后返回这个File 或者返回这个 File 的绝对地址

   其中  _hostingEnvironment  可以在全局读取的配置文件的工具类 Globals 中配置

  直接上代码:

private IHostingEnvironment _hostingEnvironment;
public XlsxController(IHostingEnvironment hostingEnvironment)
{
_hostingEnvironment = hostingEnvironment;
}
public IActionResult ExportData(int programmeId)
{
//获取方案名称
var programmeName = ProgrammeService.GetProgrammeNameById(programmeId);
//获取列表内容
var dataFromDb = ProgrammeService.GetProgrammeStatisticEnrolmentExportList(programmeId);
var data = dataFromDb.Select(a => new ProgrammeStatisticsEnrolmentDetailsExportViewModel
{
UserName = a.UserName,
Phone = a.Phone,
EnrolTime = a.EnrolTimeStr
}).ToList(); var sWebRootFolder = _hostingEnvironment.WebRootPath; var sFileName = $"XXX-{programmeName}.xlsx"; var file = new FileInfo(Path.Combine(sWebRootFolder, sFileName));
using (var package = new ExcelPackage(file))
{ //如果之前有同名的文件先删除然后重新创建
var count = package.Workbook.Worksheets.Count; if (count > )
{
for (var i = ; i < count; i++)
{
package.Workbook.Worksheets.Delete(i + );
}
package.File.Delete();
} // 添加worksheet
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Sheet1"); //添加头
worksheet.Cells[, ].Value = "姓名";
worksheet.Cells[, ].Value = "手机号";
worksheet.Cells[, ].Value = "报名时间"; //添加值
for (var i = ; i < data.Count; i++)
{
worksheet.Cells[$"A{i + 2}"].Value = data[i].UserName;
worksheet.Cells[$"B{i + 2}"].Value = data[i].Phone;
worksheet.Cells[$"C{i + 2}"].Value = data[i].EnrolTime;
}
package.Save();
}
var returnFile = File(sFileName, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
returnFile.FileDownloadName = sFileName;
return returnFile;
}

第二种方法: 用写流文件的方法 将文件写入浏览器

  这里首先我们需要一个导出的工具类 如下:

    /// <summary>
/// 公共工具类
/// </summary>
public class CommonHelper
{ //获取列名委托方法
public delegate string GetColumnName(string columnName); #region 导入导出Excel相关 /// <summary>
/// 将泛类型集合List类转换成DataTable
/// </summary>
/// <param name="list">泛类型集合</param>
/// <returns>返回转换后的DataTable</returns>
public static DataTable ListToDataTable<T>(List<T> entitys)
{
//生成DataTable的structure
var dt = new DataTable();
try
{
//检查泛型实体是否为空
if (entitys == null || entitys.Count < )
{
return dt;
}
//取出第一个实体的所有Propertie
var entityType = entitys[].GetType();
var entityProperties = entityType.GetProperties();
for (var i = ; i < entityProperties.Length; i++)
{
dt.Columns.Add(entityProperties[i].Name);
}
//将所有entity添加到DataTable中
foreach (object entity in entitys)
{
//检查所有的的实体都为同一类型
if (entity.GetType() != entityType)
{
throw new Exception("要转换的集合元素类型不一致");
}
var entityValues = new object[entityProperties.Length];
for (var i = ; i < entityProperties.Length; i++)
{
entityValues[i] = entityProperties[i].GetValue(entity, null);
}
dt.Rows.Add(entityValues);
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
return dt;
} /// <summary>
/// 将dataTable转换为Excel字节流
/// </summary>
/// <param name="dt"></param>
/// <param name="getColumnName"></param>
/// <returns></returns>
public static byte[] GetExcelForXLSX(DataTable dt, GetColumnName getColumnName)
{
var xssfworkbook = new XSSFWorkbook();
var sheet = xssfworkbook.CreateSheet("Sheet");
//表头
var row = sheet.CreateRow(); for (var i = ; i < dt.Columns.Count; i++)
{
var cell = row.CreateCell(i);
//列名称,数据库中字段
var columnName = dt.Columns[i].ColumnName;
var convertColumnName = getColumnName(columnName);
cell.SetCellValue(convertColumnName);
} //数据
for (var i = ; i < dt.Rows.Count; i++)
{
var row1 = sheet.CreateRow(i + );
for (var j = ; j < dt.Columns.Count; j++)
{
var cell = row1.CreateCell(j);
cell.SetCellValue(dt.Rows[i][j].ToString());
}
}
//转为字节数组
var stream = new MemoryStream();
xssfworkbook.Write(stream);
var buf = stream.ToArray();
return buf;
} #endregion
}

  

  然后我们就可以导出了

     /// <summary>
/// 表格列名称
/// </summary>
private static string GetColumnNameForDetail(string columnName)
{
switch (columnName)
{ case "UserName":
return CommonConst.Column_Programme_Detail_UserName;
case "Phone":
return CommonConst.Column_Programme_Detail_Phone;
case "EnrolTime":
return CommonConst.Column_Programme_Detail_EnrolTime;
default:
return String.Empty;
}
} /// <summary>
/// 导出excel
/// </summary>
[HttpGet]
public void ExportData(int programmeId)
{
//获取方案名称
var programmeName = ProgrammeService.GetProgrammeNameById(programmeId);
//获取列表内容
var dataFromDb = ProgrammeService.GetProgrammeStatisticEnrolmentExportList(programmeId);
var data = dataFromDb.Select(a => new ProgrammeStatisticsEnrolmentDetailsExportViewModel
{
UserName = a.UserName,
Phone = a.Phone,
EnrolTime = a.EnrolTimeStr
}).ToList(); var sFileName = string.Format(CommonConst.Export_Programme_Detail_Excel_Name, programmeName);
var dataTable = CommonHelper.ListToDataTable(data);
var result = CommonHelper.GetExcelForXLSX(dataTable, GetColumnNameForDetail);
Response.ContentType = ResponseConfigure.ContentTypeExcel;
SetResponseHeaderForDetail(sFileName);
Response.Body.Write(result);
Response.Body.Flush();
Response.Body.Close();
} /// <summary>
/// 设定导出的标头内容
/// </summary>
/// <param name="fileName">导出的文件名</param>
private void SetResponseHeaderForDetail(string fileName)
{
Response.Headers.Add(ResponseConfigure.ContentDisposition,
ResponseConfigure.Attachment + HttpUtility.UrlEncode(fileName));
}

 

.NET CORE 2.1 导出excel文件的两种方法的更多相关文章

  1. Java导出Excel文件的两种方法

    将数据以Excel表格的形式导出:首先下载poi的jar包,导入项目中,或者使用maven仓库管理,在pom文件添加:<dependency>    <groupId>org. ...

  2. web导出excel文件的几种方法

    总的来说,两种方法:服务器端生成和浏览器端生成. 服务器端生成就是:根据用户请求,获取相应的数据,使用poi/jxl, jacob/jawin+excel,或是用数据拼html的table或是cvs纯 ...

  3. mysql导出excel文件的几种方法

    方法一 用mysql的命令和shell select * into outfile './bestlovesky.xls' from bestlovesky where 1 order by id d ...

  4. 读取Excel文件的两种方法

    第一种方法:传统方法,采用OleDB读取EXCEL文件, 优点:写法简单,缺点:服务器必须安有此组件才能用,不推荐使用 private DataSet GetConnect_DataSet2(stri ...

  5. 读取Excel文件的两种方法比较 以及用NPOI写入Excel

    1. 采用NPOI方式,只需引用NPOI.dll,但目前最高只能到2.4.0版. 缺点:只支持.xls,不支持.xlsx格式.github上的2.4.1版支持.xlsx,但总提示缺ICSharpCod ...

  6. Oracle导出DMP文件的两种方法

    本文转载自:http://www.cnblogs.com/o-andy-o/archive/2013/06/05/3118611.html   导出: 方法一:利用PL/SQL Developer工具 ...

  7. PHP导出excel文件的几种方式

    PHP导出excel文件的几种方式 先说说动态生成的内容当作文件来下载的方法: 1.通过把Content-Type设置为application/octet-stream,可以把动态生成的内容当作文件来 ...

  8. 转:PHP导出excel文件的几种方式

    PHP导出excel文件的几种方式 文章来源:http://www.cnblogs.com/fredshare/archive/2012/10/29/2744243.html 先说说动态生成的内容当作 ...

  9. .NET环境下导出Excel表格的两种方式和导入两种类型的Excel表格

    一.导出Excel表格的两种方式,其中两种方式指的是导出XML数据类型的Excel(即保存的时候可以只需要修改扩展名为.xls)和真正的Excel这两种. using System; using Sy ...

随机推荐

  1. map的访问

    映射表(map) 在每个条目被插入时将之按键进行排序.取迭代器指向值时将返回value_type结构,它有两个数据成员:first,second.访问first获得键的数据,访问second获得值的数 ...

  2. MySQL Innodb 神秘消失

    问题描述: 早晨接到 Zabbix 报警,提示 Host: 10.10.1.2, MySQL 主从同步失败. 登录服务器查看具体情况. shell > mysql mysql> show ...

  3. CentOS Grub、BASH 故障、解决方法

    简介: Grub 常见的两种故障:Grub.conf 文件丢失.MBR 损坏 ( 不管恢复怎么样,还是先备份好吧 ) 一.Grub.conf 文件丢失 shell > rm -rf /boot/ ...

  4. Failed to start component [StandardEngine[Catalina].

    出现以下的错误的原因: 检查 web.xml文件,应该是<filter>和<filter-mapping>或者<servlet>和<servlet-mappi ...

  5. 简单例子让你很好的理解:协议与委托 (Protocol and Delegate)

    1 协议: 协议,类似于Java或C#语言中的接口,它限制了实现类必须拥有哪些方法. 它是对对象行为的定义,也是对功能的规范. 示例: 1 2 3 4 5 6 7 8 9 // GoodChild.h ...

  6. zabbix主机自动注册

    一.主机自动注册的流程 zabbix agent指定server active主动自己的信息提供给zabbix_server,zabbix_server根据提供的信息自动添加主机,方便. 二. lin ...

  7. 测试URL

    http://localhost:8080/dmonitor-webapi/monitor/vm/342?r=1410331220921&indexes=cpu&indexes=mem ...

  8. Linux静态库与动态库详解

    引言 为了代码的复用性和模块化,我们常常使用一些库文件,在Windows操作系统下位.lib .dll作为静态库和动态库的后缀名. 在Linux下,静态链接库名字一般为libabcdef.a,其中ab ...

  9. 安装CentOS 6.4 64 位操作系统

    1.安装 CentOS 6.4 64位操作系统的一些困境: 1.1 CentOS 6.4 64位操作系统的ISO文件有4G多,通过U盘安装的方式已经不可取(FAT32 只支持最大4G文件); 1.2 ...

  10. 实践作业3:白盒测试----junit的难点DAY11.

    本次白盒测试 需要独立完成整个项目和工具的配置安装运行操作,并编写.运行测试脚本,并完成实验的一些小细节等等. 首先,导入Junit测试框架所需的Jar包 然后编写测试脚本,为.java运行程序,见打 ...