最近在做 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. MyEclipse显示 Install new software 在线安装插件选项

    转自:https://blog.csdn.net/greatpresident/article/details/8950869 昨天不知道怎么就删除了电脑中的eclipse 我x,还原不回来了. 今天 ...

  2. [转]DWZ表单验证规则一览表(留着自己用)

    <form onsubmit="return validateCallback(this)" class="pageForm" action=" ...

  3. 转 查看linux文件目录的大小和文件夹包含的文件数

    du -sh 文件夹路径 查看linux文件目录的大小和文件夹包含的文件数 统计总数大小 du -sh xmldb/ du -sm * | sort -n //统计当前目录大小 并安大小 排序 du ...

  4. 基于 DirectX11 的 MMDViewer 02-创建一个窗口

    项目的创建和配置: 1.新建一个 Win32 空项目 2.创建源码文件夹.库文件夹和资源文件夹 3.在 VS2013(我使用的 IDE 是 vs2013)配置这些文件夹 这里使用了 $(Solutio ...

  5. a.call(b); call 方法

    a.call(b); a.apply(b,[]) function class1() { this.name = function(){ alert("class1的方法name()&quo ...

  6. 第五章 大数据平台与技术第11讲 MapReduce编程

    在大规模的数据当中,需要分发任务,需要进行分布式的并行编程.Hadoop这样一种开源的大数据分析平台. Map阶段 Reduce阶段:相同的键把它聚集到一起之后,然后通过Reduce方式把相同的键聚集 ...

  7. linux: 空指令(:)

    :指令 描述: 空命令,除了参数替换和重定向外不执行任何操作,总是保证退出码为0. eg1:创建文件(不需要调用其它程序,速度更快) :>/path/to/file 测试: 创建10000个不存 ...

  8. Web内容回顾

    -----------------siwuxie095 Java EE 三层结构 1.Web 层:Struts2 框架 2.Service 层:Spring 框架 3.DAO 层:Hibernate ...

  9. leetcode BFS解题思路

    Word Ladder 思路一:单向bfs, 使用visited数组记录哪些已经访问过了, 访问过的就不允许再次入队, 同时这里想到的是使用26个英文字母,枚举可能的取值, 类似brute force ...

  10. 心理学轨迹及AI基础理论读后感

    今天简单的看了下心理学轨迹及AI基础理论发现世界确实是那3%的人改变的,我等屁民还努力在红尘中争渡,下面简单记录下我刚看完的思路,算做个笔记给自己看.. 模型建立的最终结果可以解读所有的心理学现象,可 ...