.NET CORE 2.1 导出excel文件的两种方法
最近在做 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文件的两种方法的更多相关文章
- Java导出Excel文件的两种方法
将数据以Excel表格的形式导出:首先下载poi的jar包,导入项目中,或者使用maven仓库管理,在pom文件添加:<dependency> <groupId>org. ...
- web导出excel文件的几种方法
总的来说,两种方法:服务器端生成和浏览器端生成. 服务器端生成就是:根据用户请求,获取相应的数据,使用poi/jxl, jacob/jawin+excel,或是用数据拼html的table或是cvs纯 ...
- mysql导出excel文件的几种方法
方法一 用mysql的命令和shell select * into outfile './bestlovesky.xls' from bestlovesky where 1 order by id d ...
- 读取Excel文件的两种方法
第一种方法:传统方法,采用OleDB读取EXCEL文件, 优点:写法简单,缺点:服务器必须安有此组件才能用,不推荐使用 private DataSet GetConnect_DataSet2(stri ...
- 读取Excel文件的两种方法比较 以及用NPOI写入Excel
1. 采用NPOI方式,只需引用NPOI.dll,但目前最高只能到2.4.0版. 缺点:只支持.xls,不支持.xlsx格式.github上的2.4.1版支持.xlsx,但总提示缺ICSharpCod ...
- Oracle导出DMP文件的两种方法
本文转载自:http://www.cnblogs.com/o-andy-o/archive/2013/06/05/3118611.html 导出: 方法一:利用PL/SQL Developer工具 ...
- PHP导出excel文件的几种方式
PHP导出excel文件的几种方式 先说说动态生成的内容当作文件来下载的方法: 1.通过把Content-Type设置为application/octet-stream,可以把动态生成的内容当作文件来 ...
- 转:PHP导出excel文件的几种方式
PHP导出excel文件的几种方式 文章来源:http://www.cnblogs.com/fredshare/archive/2012/10/29/2744243.html 先说说动态生成的内容当作 ...
- .NET环境下导出Excel表格的两种方式和导入两种类型的Excel表格
一.导出Excel表格的两种方式,其中两种方式指的是导出XML数据类型的Excel(即保存的时候可以只需要修改扩展名为.xls)和真正的Excel这两种. using System; using Sy ...
随机推荐
- delphi IOS 通知 TNotification
delphi IOS 通知 TNotification http://blogs.embarcadero.com/ao/2013/05/01/39450 TNotification http://d ...
- @manyToOne.@oneToMany
@ManyToOne注解的这端,是多端 1.在注释@ManyToOne(cascade=CascadeType.REFRESH,optional=true)中将属性optional设置为true,这可 ...
- C# 发送和接受Get请求
1.发送Get请求 public static string HttpGet(string Url, string postDataStr) { HttpWebRequest request = (H ...
- input子系统分析之三:驱动模块
内核版本:3.9.5 本节将以even handler来分析设备的注册和打开的过程,分析之前不妨回顾一下上节介绍的数据结构. 结合前两节分析可知,input子系统分为3层,最上一层是event han ...
- go_内建变量类型
bool, string (u)int, (u)int8, (u)int16, (u)int32, (u)int64, uintptr (uintptr 是指针) byte, rune(表示字符cha ...
- 【ZOJ 3228】Searching the String 【AC自动机】
题意 给出n个模式串和一个文本串,输出各个模式串在文本串中出现的次数.模式串有两种类型,0类型代表可以有重叠,1类型代表不能有重叠.模式串可能出现重复. 分析 算是AC自动机的模板题? 因为模式串可以 ...
- Activiti 乱码问题
新版本运行起来中文看起来正常了许多,至少生成图片过程中不会出现乱码了,但不出预料的再次遇到部署时乱码问题,除了保存时报错,还会导致流程实例的节点名称是乱码. 1. IE报错定义时错误提示: 元素类型 ...
- zabbix自定义key监控nginx和fpm(网站并发数)
一. nginx编译参数 监控nginx,主要讲解监控并发数 --prefix=/usr/local/nginx --with-http_stub_status_module zabbix编译参数的查 ...
- Result Grouping / Field Collapsing-结果分组
WiKi:http://wiki.apache.org/solr/FieldCollapsing Introduction 字段折叠和结果分组是考虑相同solr功能的两种不同的方式. 字段折叠折叠一组 ...
- 下拉菜单--JavaScript触发方法
1. $(function(){ $(".dropdown-toggle").one("click",function(){ $(this).dropdown( ...