.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 ...
随机推荐
- Consul 简介、安装、常用命令的使用
1 Consul简介 Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,Consul的方案更"一站式" ...
- 创建excel,合并单元格,设置单元格样式
package com.huawei.excel; import java.io.File;import java.io.FileOutputStream;import java.util.Date; ...
- 使用C#通过Oracle.DataAccess连接Oracle,部署时需要注意版本问题
平时我们开发使用的是32位的PC机,所以安装的也是Oracle32位的客户端.但是一般服务器都是64位的,安装的也是64位的Oracle客户端,如果要部署使用Oracle.DataAccess连接Or ...
- 2017年Java学习总结
2017年Java学习 Java,是我学习的第三种计算机编程语言,刚拿到这本教材时,我被它的厚度与书中字体的密集程度吓了一跳,不过在学习过程中,有Python,C语言的学习基础上,加上老师的 ...
- UICamera
[UICamera] UICamera是一个命名不太好的组件.实际上,它的名字某种原因只是为了保持向后兼容.UICamera脚本实际做的事是发送NGUI事件给所有被它所附加的摄像机所看见的对象.除此之 ...
- S数据导入
一. 职责下的视图导入先对比UAT172和PROD 177的数据,若177比172多的数据进行删除,若172比177多的数据,重新加入到177. 1.删除177多余的 搜索一个177比172多的,进行 ...
- Think In Java 读后感
近期拜读了Think in Java 一书,这里是一些读后感. 此书不仅仅是市面上那种教会你怎么用系统API来编程的书,那种书太多. 此书不仅仅从头开始讲述了如何 ...
- 编写DLL
想想还是把这个记录下吧,虽然不难,但由于平时写得不多,老是搞忘了. 1.我们来编写一个简单的DLL程序. 首先,我们来看下入口函数DllMain().DllMain()有3个参数: (1)hModul ...
- svn配置多仓库与权限控制
telnet: connect to address 47.106.115.228: Connection refused svn执行上下文错误由于目标计算机积极拒绝无法连接 标签: svn 2017 ...
- rtx 导出所有部门和用户
1>添加Interop.RTXServerApi.dll的引用 2>RTXServerApi.RTXObjectClass和RTXServerApi.RTXObject实现一样,建议使用R ...