最近在做 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. Strem String Memory TStringStream

    System.SysUtils 一.TStringStream方法 Strem>String TMemoryStream to String stm: TStream; ss: TStringS ...

  2. AOP的MethodBeforeAdvice

    使用Spring自动生成代理类,spring利用的是动态代理机制 接口 Java代码 public interface UserDao { void addUser(); void deleteUse ...

  3. axis2 webService开发指南(2)

    1  Axis2的简单WebService示例 1.1 新建一个web工程,创建一个类Greeting,用于当作webservice服务 代码如下: package amyservices; impo ...

  4. 前端开发之JavaScript基础篇一

    主要内容: 1.JavaScript介绍 2.JavaScript的引入方法和输出及注释 3.javaScript变量和命名规则 4.五种基本数据类型 5.运算符 6.字符串处理 7.数据类型转换   ...

  5. ReentrantLock(重入锁)功能详解和应用演示

    目录 1. ReentrantLock简介 2. ReentrantLock和synchronized的相同点 2.1 ReentrantLock是独占锁且可重入的 3. ReentrantLock相 ...

  6. _LightColor0将会是主要的directional light的颜色。

    LightMode是个非常重要的选项,因为它将决定该pass中光源的各变量的值.如果一个pass没有指定任何LightMode tag,那么我们就会得到上一个对象残留下来的光照值,这并不是我们想要的. ...

  7. Spring Data JPA + layui的前台分页插件layPage实现页面的分页

    一.后台代码: 1.1 controller层代码 @RequestMapping("/xxxxxx") public String showInformationCode(Str ...

  8. CS4.1 RPM打包函数分析

    shell举例说明:脚本名称叫test.sh 入参三个: 1 2 3运行test.sh 1 2 3后$*为"1 2 3"(一起被引号包住)$@为"1" &quo ...

  9. c语言和设计模式

    在网上看到一个博客专门写了关于设计模式的文章,感觉很有用.其实,我感觉数据结构 算法 设计模式 这三样同等重要啊. 数据结构 算法相对而言接触的比较多,但设计模式这个东西真的一头雾水,有时候觉得别人写 ...

  10. java的web.xml中<url-pattern>配置[转]

    <servlet-mapping> <servlet-name>downLoadFile</servlet-name> <url-pattern>*.l ...