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 ...
随机推荐
- 01-C#入门(函数一)
只有在动手写代码的时候,才能真正理解到代码的逻辑思想,所以,开始写代码吧. 函数的意义:降低相同功能的代码重复编写,提高重复代码的维护效率. 函数 一个文件由命令空间(namespace).类(cla ...
- Mware vCenter Server 识别固态硬盘为(非SSD)是什么原因?
人工定义一下: 用root登录进ESXi控制台:esxcli storage nmp device list #列出储存清单esxcli storage nmp satp rule add -s VM ...
- system verilog中的跳转操作
在verilog中,使用disable声明来从执行流程中的某一点跳转到另一点.特别地,disable声明使执行流程跳转到标注名字的声明组末尾,或者一个任务的末尾. verilog中的disable命令 ...
- ubuntu 13.10 mono asp.net服务 安装
ubuntu 13.10 从官方文档http://www.mono-project.com/Mod_mono 可看到 Mod_Mono is an Apache 2.0/2.2/2.4.3 modul ...
- 使用Struts2搭建登录注册示例
使用Struts2来搭建mvc网站框架还是比较容易的,Struts2提供了各项辅助功能,保证了web开发的快速方便.下面使用struts2来搭建一个登录注册示例. 0 项目结构截图 1 搭建Strut ...
- python 实现树结构的打印
class TreeNode: def __init__(self,value): self.children = [] self.value = value def add_child(self,* ...
- AndroidManifest.xml的android:name是否带.的区别
android项目里面的AndroidManifest.xml,会有这样的定义 <activity android:name=".Main" ...
- OCR图像识别技术-Asprise OCR
// csc AspriseDemo.cs /r:AspriseOcr.dll // 注意注册:AspriseOCR.InputLicense("123456", "12 ...
- zookeeper入门学习
1.基本概念 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的 ...
- MFC自绘控件不错的网站收集,不定时更新。
找资料的时候,遇到好的网站收集起来,当时看看就忘记网址,下次再找又找不到,写下来才记得牢.欢迎大家留言,共同收集. 国外的: 1.codeproject https://www.codeproject ...