NPOI MVC 模型导出Excel通用类
通用类:
public enum DataTypeEnum
{
Int = ,
Float = ,
Double = ,
String = ,
DateTime = ,
Date =
}
public class ExportFieldInfo
{
/// <summary>
/// 字段名,用于反射获取值
/// </summary>
public string FieldName { get; set; }
/// <summary>
/// 中文名,用于导出标题
/// </summary>
public string DisplayName { get; set; }
/// <summary>
/// 数据类型,用于强制转换,并进行格式化,其实利用反射也可以获取到数据类型,此处因为要处理Date和Date的显示格式
/// </summary>
public DataTypeEnum DataType { get; set; }
}
public class ExcelHelper<T>
{
/// <summary>
/// 导出到内存流
/// </summary>
/// <param name="datas">需要导出的模型列表</param>
/// <param name="fieldInfies">导出的字段列表信息</param>
/// <param name="sheetRows">每个工作表的行数</param>
/// <returns></returns>
public static MemoryStream ToExcel(List<T> datas, List<ExportFieldInfo> fieldInfies, int sheetRows = )
{
//创建Excel文件的对象
NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
//需要生成工作溥总簿
int sheetCount = datas.Count / sheetRows + ;
int rowCount = datas.Count;
for (int i = ; i < sheetCount; i++)
{
//添加一个sheet
NPOI.SS.UserModel.ISheet sheet = book.CreateSheet("Sheet" + Convert.ToString(i));
//给sheet添加第一行的头部标题
NPOI.SS.UserModel.IRow rowTitle = sheet.CreateRow();
for (int k = ; k < fieldInfies.Count; k++)
{
rowTitle.CreateCell(k).SetCellValue(fieldInfies.ElementAt(k).DisplayName);
}
//处理Excel一张工作簿只能放65536行记录的问题
//因为头部占一行,所以要减1
for (int j = ; j < sheetRows - ; j++)
{
//将数据逐步写入sheet各个行
NPOI.SS.UserModel.IRow rowtemp = sheet.CreateRow(j + );
int dataIndex = i * (sheetRows - ) + j;
for (int k = ; k < fieldInfies.Count; k++)
{
//获取类型
Type type = datas[dataIndex].GetType();
//获取指定名称的属性
System.Reflection.PropertyInfo propertyInfo = type.GetProperty(fieldInfies.ElementAt(k).FieldName);
//获取属性值
var value = propertyInfo.GetValue(datas[dataIndex], null);
switch (fieldInfies.ElementAt(k).DataType)
{
case DataTypeEnum.Int:
rowtemp.CreateCell(k).SetCellValue(Convert.ToInt32(value));
break;
case DataTypeEnum.Float:
rowtemp.CreateCell(k).SetCellValue(Convert.ToDouble(value));
break;
case DataTypeEnum.Double:
rowtemp.CreateCell(k).SetCellValue(Convert.ToDouble(value));
break;
case DataTypeEnum.String:
rowtemp.CreateCell(k).SetCellValue(Convert.ToString(value));
break;
case DataTypeEnum.DateTime:
rowtemp.CreateCell(k).SetCellValue(Convert.ToDateTime(value).ToString("yyyy-MM-dd HH:mm:ss.SSS"));
break;
case DataTypeEnum.Date:
rowtemp.CreateCell(k).SetCellValue(Convert.ToDateTime(value).ToString("yyyy-MM-dd"));
break;
default:
break;
}
}
//所有记录循环完成
if (i * (sheetRows - ) + (j +) == rowCount)
{
// 写入到客户端
System.IO.MemoryStream ms = new System.IO.MemoryStream();
book.Write(ms);
ms.Seek(, SeekOrigin.Begin);
return ms;
}
} }
return null;
}
}
调用:
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="request">请求参数集合</param>
/// <returns></returns>
public FileResult ToExcel(ActiveRecordRequest request)
{
//获取记录信息
Response<ActiveRecord> listInfo = this.CrmService.GetActiveRecordList(request);
//初始化需要导出字段
List<ExportFieldInfo> fieldInfo = new List<ExportFieldInfo>();
fieldInfo.Add(new ExportFieldInfo() {
FieldName = "ActiveDate",
DisplayName = "活动日期",
DataType = DataTypeEnum.Date
});
fieldInfo.Add(new ExportFieldInfo()
{
FieldName = "ActiveSubject",
DisplayName = "活动主题",
DataType = DataTypeEnum.String
});
fieldInfo.Add(new ExportFieldInfo()
{
FieldName = "Remark",
DisplayName = "备注",
DataType = DataTypeEnum.String
});
return File(ExcelHelper<ActiveRecord>.ToExcel(listInfo.Data, fieldInfo), "application/vnd.ms-excel", "活动信息表.xls");
}
js调用:
直接访问Action即可,贴出我json的一部分,这里不适合你们的应用,就是说明一下调用这个函数即可
//导出到Excel
ToExcel: function () {
location.href = "/" + PageParam.Area + "/" + PageParam.AjaxController + "/ToExcel?IsPaging=false";
}
最后上一张导出结果,因为我测试记录有39W,一张工作表只能存65536条记录,所以这里导出成几个工作表了,一张工作表具体多少记录你也可以设置最后那个参数
NPOI MVC 模型导出Excel通用类的更多相关文章
- MVC NPOI Linq导出Excel通用类
之前写了一个模型导出Excel通用类,但是在实际应用中,可能不是直接导出模型,而是通过Linq查询后获取到最终结果再导出 通用类: public enum DataTypeEnum { Int = , ...
- NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中
以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...
- NPOI导入导出EXCEL通用类,可直接使用在WinForm项目中
由于XSSFWorkbook类型的Write方法限制,Write完成后就自动关闭流数据,所以无法很好的支持的Web模式,网上目前也未找到好的解决方案. 注意:若直接使用在WinForm项目中,必需先下 ...
- poi导出excel通用类
一.关键的通用类public class PoiExportUtils { private static HSSFWorkbook workBook; public PoiExportUtils ...
- .Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) 通过MVC控制器导出导入Excel文件(可用于java SSH架构)
.Net MVC 导入导出Excel总结(三种导出Excel方法,一种导入Excel方法) [原文地址] 通过MVC控制器导出导入Excel文件(可用于java SSH架构) public cl ...
- java根据xml配置文件导出excel通用方法
java web项目中时常会用到导出功能,而导出excel几乎是每个项目必备的功能之一.针对形形色色的导出方法及个人平时的工作经验,特将导出excel方法整理成通用的方法,根据xml配置来实现特定的导 ...
- 导入导出Excel工具类ExcelUtil
前言 前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hibe ...
- 导出Excel帮助类
using System; using System.Collections.Generic; using System.Text; using System.Data; using System.D ...
- javaEE开发之导出excel工具类
web开发中,一个系统的普通需求也包含导出excel,一般採用POI做统计报表导出excel. 导出excel工具类: import java.io.FileOutputStream; import ...
随机推荐
- jQuery 事件探秘
jQuery 事件中为 dom 元素动态绑定事件的方式: 绑定事件到元素上 $(selector).bind('eventName', function(){}); 一次绑定多个事件时,事件名用单个空 ...
- prim算法查找最小生成树
我们在图的定义中说过,带有权值的图就是网结构.一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边.所谓的最小成本,就是n个顶点,用n-1条边把一个连通图连接 ...
- 尚学堂Spring视频教程(五):Spring AOP
在第一节中,我们自己模拟了一个Spring,实现一个保存用户的操作,假如现在有一个需求,在保存的时候记录日志,该怎么做呢? 暂且将记录日志操作就简单的变为在保存用户前输出一句话“save start. ...
- Maven(二)使用eclipse创建maven多模块项目
maven作为一种自动化构建工具,在现在的企业应用开发中运用非常普遍. 企业项目一般都比较大,多采用maven管理的多模块项目,下面直接上创建步骤 一.创建一个maven项目
- PHP数组的常用函数
在PHP中数组是种强大的数据类型,他可以做的事情很多,可以存储不同的数据类型在一个数组中,下面我们列出了数组常用的操作,排序,键名对数组排序等做法. /* 数组的常用函数 * * 数组的排序函数 ...
- Apache RewriteHTTPToHTTPS
HTTP to HTTPS Scenario : You want to force people coming to your site to use HTTPS. Either for the e ...
- 15,SFDC 管理员篇 - 变更和部署
Setup | Deploy | Sandbox 通过在Production上建立Dev .Test 两套环境来 Sandbox 有四种类型 Developer Sandbox & Dev ...
- Robotframework框架AndroidLibrary库安装
1.Ruby官网(http://rubyinstaller.org/)下载系统对应安装包进行安装 2.Ruby官网(http://rubyinstaller.org/)下载对应DevKit,运行解压到 ...
- SQL数据库与excel表格之间的数据 导入
- jquery实现旋转木马的插件slick
旋转木马的是一般网站上都会有的图片轮播效果, html: <section id="features" class="blue" style=" ...