本篇文章是在MVC设计模式下,基于windows系统的Excel导出

1.前台的实现不用我多说了吧,加一个a标签链接地址跳到它所调用的方法里面,可以根据当前页面的查询条件去传值,从而查询出你想要的数据然后导出

下面我们就直接来看控制器里的方法和对数据的处理

/// <summary>
/// 导出数据
/// </summary>
/// <returns></returns>
public void ExportData(int pageIndex, int limit, string name, string startVisitTime, string endVisitTime, string addUser)
{
int count = 0;
string fileExt = ".xls";
try
{
if (pageIndex != 0)
{
pageIndex = 0;
}
List<VisitsRecordDto> visitRecord = visitRecordReportInterface.GetVisitRecordList(pageIndex, limit, name, startVisitTime, endVisitTime, addUser, out count);
Dictionary<string, string> columnNames = new Dictionary<string, string> {
{ "AddUser","添加人" },
{ "VisitsTime", "拜访日期" },
{ "CustomerName", "客户名称" },
{ "LinkMan", "联系人" },
{ "CustomerNeed", "客户需求" },
{ "ExistingProblem", "存在的问题" },
{ "SuccessEffect", "达成的效果" },
{ "NextPlan", "下一步跟进计划" },
{ "VisitEvalaute", "拜访评价" },
{ "Score", "拜访评分" }
};
byte[] stream = Common.ExcelHelper.CollectionsToExcel<VisitsRecordDto>(visitRecord, fileExt, columnNames);
//获取文件的ContentType
var provider = new FileExtensionContentTypeProvider();
var memi = provider.Mappings[fileExt];
Response.ContentType = memi;
Encoding utf8 = Encoding.UTF8;
//将已经解码的字符再次进行编码.
string encode = HttpUtility.UrlEncode("拜访总结报表.xls", utf8).ToUpper();

Response.Headers.Add("Content-Disposition", "attachment;filename=" + encode);
Response.Body.Write(stream);
Response.Body.Flush();
Response.Body.Close();
}
catch (Exception ex)
{

}
}

3.将Excel转换为Datatable

/// <summary>
/// 集合导出Excel
/// </summary>
/// <param name="list">集合</param>
/// <param name="fileExt">文件后缀</param>
/// <param name="columnNames">列名转换</param>
/// <param name="dicOnly">部分转换</param>
/// <returns></returns>
public static byte[] CollectionsToExcel<T>(List<T> list, string fileExt, Dictionary<string, string> columnNames,bool dicOnly=false)
{
if (list.Count() <= 0)
{
return null;
}
DataTable dt = CollectionsToDataTable<T>(list);
IWorkbook workbook;
ICellStyle cellStyle;
ICellStyle headerCellStyle;
if (fileExt == ".xlsx")
{
workbook = new XSSFWorkbook();
cellStyle = (XSSFCellStyle)workbook.CreateCellStyle();
headerCellStyle = (XSSFCellStyle)workbook.CreateCellStyle();
}
else if (fileExt == ".xls")
{
workbook = new HSSFWorkbook();
cellStyle = (HSSFCellStyle)workbook.CreateCellStyle();
headerCellStyle = (HSSFCellStyle)workbook.CreateCellStyle();
}
else
{
workbook = null;
cellStyle = (HSSFCellStyle)workbook.CreateCellStyle();
headerCellStyle = (HSSFCellStyle)workbook.CreateCellStyle();
return null;
}

ISheet sheet = string.IsNullOrEmpty(dt.TableName) ? workbook.CreateSheet("Sheet1") : workbook.CreateSheet(dt.TableName);

IFont font = workbook.CreateFont();
font.FontName = "宋体";
font.FontHeightInPoints = 9;

cellStyle.Alignment = HorizontalAlignment.Left;
cellStyle.VerticalAlignment = VerticalAlignment.Center;
cellStyle.BorderBottom = BorderStyle.Thin;
cellStyle.BorderTop = BorderStyle.Thin;
cellStyle.BorderLeft = BorderStyle.Thin;
cellStyle.BorderRight = BorderStyle.Thin;
cellStyle.SetFont(font);

IFont headerFont = workbook.CreateFont();
headerFont.FontName = "宋体";
headerFont.FontHeightInPoints = 9;
headerFont.Boldweight = short.MaxValue;
headerCellStyle.Alignment = HorizontalAlignment.Center;
headerCellStyle.VerticalAlignment = VerticalAlignment.Center;
headerCellStyle.FillForegroundColor = 22;
headerCellStyle.FillPattern = FillPattern.SolidForeground;
headerCellStyle.BorderBottom = BorderStyle.Thin;
headerCellStyle.BorderTop = BorderStyle.Medium;
headerCellStyle.BorderLeft = BorderStyle.Thin;
headerCellStyle.BorderRight = BorderStyle.Thin;
headerCellStyle.SetFont(headerFont);

if (dicOnly == true)
{
for (int i = dt.Columns.Count - 1; i >= 0; i--)
{
string rowName = dt.Columns[i].ColumnName;
if (!columnNames.Keys.Contains(rowName))
{
dt.Columns.RemoveAt(i);
}
}
}

//表头
IRow row = sheet.CreateRow(0);
row.HeightInPoints = 20;
for (int i = 0; i < dt.Columns.Count; i++)
{
sheet.SetColumnWidth(i, 25 * 256);
ICell cell = row.CreateCell(i);
cell.CellStyle = headerCellStyle;
string rowName = dt.Columns[i].ColumnName;
if (columnNames.Keys.Contains(rowName))
{
cell.SetCellValue(columnNames[rowName]);
}
else
{
cell.SetCellValue(dt.Columns[i].ColumnName);
}
}

//数据
for (int i = 0; i < dt.Rows.Count; i++)
{
//将数据从表格第二行开始填入
IRow row1 = sheet.CreateRow(i + 1);
row1.HeightInPoints = 15;
for (int j = 0; j < dt.Columns.Count; j++)
{
ICell cell = row1.CreateCell(j);
cell.CellStyle = cellStyle;
cell.SetCellValue(dt.Rows[i][j].ToString());
}
}

//转为字节数组
MemoryStream stream = new MemoryStream();
workbook.Write(stream);
var buf = stream.ToArray();
workbook.Close();
stream.Close();
stream.Dispose();
return buf;
}

将集合转换为datatable

/// <summary>
/// 将集合转为DataTable
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <returns></returns>
public static DataTable CollectionsToDataTable<T>(List<T> list)
{
Type type = typeof(T);
DataTable dt = new DataTable();
foreach (PropertyInfo item in type.GetProperties())
{
dt.Columns.Add(item.Name, typeof(string));
}
foreach (T item in list)
{
DataRow Row = dt.NewRow();
foreach (PropertyInfo propertyInfo in type.GetProperties())
{
if (propertyInfo.PropertyType == typeof(DateTime?))
{
Row[propertyInfo.Name] = propertyInfo.GetValue(item) == null ? "" : DateTime.Parse(propertyInfo.GetValue(item).ToString()).ToString("yyyy-MM-dd");
}
else
{
Row[propertyInfo.Name] = propertyInfo.GetValue(item);
}
}
dt.Rows.Add(Row);
}
return dt;
}

Asp.net Core导出Excel的更多相关文章

  1. Asp.Net Core 导入Excel数据到Sqlite数据库并重新导出到Excel

    Asp.Net Core 导入Excel数据到Sqlite数据库并重新导出到Excel 在博文"在Asp.Net Core 使用 Sqlite 数据库"中创建了ASP.NET Co ...

  2. ASP.NET MVC导出excel

    ASP.NET MVC导出excel 要在ASP.NET MVC站点上做excel导出功能,但是要导出的excel文件比较大,有几十M,所以导出比较费时,为了不影响对界面的其它操作,我就采用异步的方式 ...

  3. JavaScript日历控件开发 C# 读取 appconfig文件配置数据库连接字符串,和配置文件 List<T>.ForEach 调用异步方法的意外 ef 增加或者更新的习惯思维 asp.net core导入excel 一个二级联动

    JavaScript日历控件开发   概述 在开篇之前,先附上日历的代码地址和演示地址,代码是本文要分析的代码,演示效果是本文要实现的效果代码地址:https://github.com/aspwebc ...

  4. asp.net中导出Excel的方法

    一.asp.net中导出Excel的方法: 本文转载 在asp.net中导出Excel有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上:一种是将文件直接将文件输出 ...

  5. ASP.net中导出Excel的简单方法介绍

    下面介绍一种ASP.net中导出Excel的简单方法 先上代码:前台代码如下(这是自己项目里面写的一点代码先贴出来吧) <div id="export" runat=&quo ...

  6. 关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格式不一致的解决办法

    -----转载:http://blog.csdn.net/sgear/article/details/7663502 关于asp.net C# 导出Excel文件 打开Excel文件格式与扩展名指定格 ...

  7. C# asp.net中导出Excel表时总出现"只能在执行 Render() 的过程中调用 RegisterForEventValidation

    C# asp.net中导出Excel表时总出现"只能在执行 Render() 的过程中调用 RegisterForEventValidation 后台添加以下方法:/// <summa ...

  8. asp.net core导出导入excel

    使用NPOI导入导出excel,已经封装好Action可以直接调用 导出 效果图 使用方法 定义导出实体 class Student { public int Id { get; set; } pub ...

  9. ASP.NET MVC导出excel(数据量大,非常耗时的,异步导出)

    要在ASP.NET MVC站点上做excel导出功能,但是要导出的excel文件比较大,有几十M,所以导出比较费时,为了不影响对界面的其它操作,我就采用异步的方式,后台开辟一个线程将excel导出到指 ...

随机推荐

  1. 【spring源码分析】IOC容器初始化(八)

    前言:在上文bean加载过程中还要一个非常重要的方法没有分析createBean,该方法非常重要,因此特意提出来单独分析. createBean方法定义在AbstractBeanFactory中: 该 ...

  2. CentOS 安装 ceph 单机版(luminous版本)

    一.环境准备 CentOS Linux release 7.4.1708 (Core)一台,4块磁盘(sda.sdb,.sdc.sdd) 192.168.27.130 nceph 二.配置环境 1.修 ...

  3. 【转】HTTP请求中的form data和request payload的区别

    jQuery的ajax方法和post方法分别发送请求,在后台Servlet进行处理时结果是不一样的,比如用$.ajax方法发送请求时(data参数是一个JSON.stringify()处理后的字符串, ...

  4. python标准日志模块logging及日志系统设计

    最近写一个爬虫系统,需要用到python的日志记录模块,于是便学习了一下. python的标准库里的日志系统从Python2.3开始支持.只要import logging这个模块即可使用.如果你想开发 ...

  5. IO模型介绍

    先理解几个问题: (1)为什么读取文件的时候,需要用户进程通过系统调用内核完成(系统不能自己调用内核)什么是用户态和内核态?为什么要区分内核态和用户态呢? 在 CPU 的所有指令中,有些指令是非常危险 ...

  6. MapReduce实例——求平均值,所得结果无法写出到文件的错误原因及解决方案

    1.错误原因 mapreduce按行读取文本,map需要在原有基础上增加一个控制语句,使得读到空行时不执行write操作,否则reduce不接受,也无法输出到新路径. 2.解决方案 原错误代码 pub ...

  7. ArrayBlockingQueue源码分析

    ArrayBlockingQueue是一个基于数组实现的有界的阻塞队列. 属性 //底层存储元素的数组.为final说明一旦初始化,容量不可变,所以是有界的. final Object[] items ...

  8. Go之运算符

    逻辑运算符用于连接布尔型表达式.在Java中不同于数学的逻辑表达 3<X<5 ,java 中应该写成 x>3 & x<5 "&" 和&quo ...

  9. 米卡 Mica Logo 存放处

  10. MySQL中怎么对varchar类型排序问题(转)

    在mysql默认order by 只对数字与日期类型可以排序,但对于varchar字符型类型排序好像没有用了,下面我来给各位同学介绍varchar类型排序问题如何解决.   今天在对国家电话号码表进行 ...