使用NPOI实现简单的Excel导出功能
【1】NPOI
NPOI.dll
NPOI.POIFS.dll
NPOI.HSSF.dll
NPOI.Util.dll
蓝后,贴一个帮助类,包含List转换成DataTable方法以及将DataTable导出到Excel表格的方法:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel; namespace NPOIExportDemo.Utility
{
/// <summary>实体转换辅助类</summary>
public class EntityConvertHelper<T> where T : class, new()
{
/// <summary>List转换成DataTable, 主键为自增长</summary>
/// <typeparam name="T">类型</typeparam>
/// <param name="value">List</param>
/// <returns>DataTable</returns>
public static DataTable ConvertToDataTable(List<T> value)
{
var properties = TypeDescriptor.GetProperties(typeof(T));
var dataTable = new DataTable();
for (var i = ; i < properties.Count; i++)
{
var property = properties[i];
dataTable.Columns.Add(property.Name, property.PropertyType);
}
var data = new object[properties.Count];
value.ForEach(x =>
{
for (var i = ; i < data.Length; i++)
{
data[i] = properties[i].GetValue(x);
}
dataTable.Rows.Add(data);
});
//移除PkValue列
if (dataTable.Columns.Contains("PkValue"))
{
dataTable.Columns.Remove("PkValue");
}
return dataTable;
} /// <summary>导出</summary>
/// <param name="list">List数据</param>
/// <param name="columnAndName">要导出的列名和表头名称字典(Key:列名,Value:表头名称)</param>
/// <returns>结果(使用时记得回收)</returns>
public static IWorkbook Export(List<T> list, Dictionary<string, string> columnAndName)
{
if (list == null || list.Count.Equals()) return null;
DataTable table = ConvertToDataTable(list);
var columnList = (from DataColumn column in table.Columns select column.ColumnName).ToList();
var keyList = columnAndName.Keys.ToList();
var outColumnList = keyList.Where(x => !columnList.Contains(x)).ToList();
if (outColumnList.Count > )
{
throw new Exception("要导出的列名和表头名称字典包含DataTable所没有的列名");
}
IWorkbook workbook = new XSSFWorkbook();
ISheet sheet = workbook.CreateSheet();
IRow headerRow = sheet.CreateRow();
List<string> headerTitle = columnAndName.Values.ToList();
for (int index = ; index < headerTitle.Count; index++)
{
headerRow.CreateCell(index).SetCellValue(headerTitle[index]);
}
int rowIndex = ;
foreach (DataRow row in table.Rows)
{
IRow dataRow = sheet.CreateRow(rowIndex);
List<string> clounmContentList = new List<string>();
foreach (var key in keyList)
{
clounmContentList.Add(row[key].ToString());
}
for (int index = ; index < clounmContentList.Count; index++)
{
dataRow.CreateCell(index).SetCellValue(clounmContentList[index]);
}
rowIndex++;
}
return workbook;
}
}
}
EntityConvertHelper.cs
紧接着,我们就要在controller里面去调用它们啦~
using NPOIExportDemo.Utility;
using System;
using System.Collections.Generic;
using System.IO;
using System.Web;
using System.Web.Mvc; namespace NPOIExportDemo.Controllers
{
public class NPOIDemoController : Controller
{
// GET: NPOIDemo
public ActionResult Index()
{
return View();
} public void Export()
{
List<Info> infos = new List<Info>()
{
new Info {Name = "Tomcat", Age = , Time = "2017-08-03 10:34:37"},
new Info {Name = "Jerry", Age = , Time = "2017-08-03 10:34:37"},
new Info {Name = "Mike", Age = , Time = "2017-08-03 10:34:37"},
new Info {Name = "J.M", Age = , Time = "2017-08-03 10:34:37"},
new Info {Name = "aaa", Age = , Time = "2017-08-03 10:34:37"}
};
Dictionary<string, string> dic = new Dictionary<string, string>()
{
{"Name", "姓名"},
{"Age", "年龄"},
{"Time", "时间"}
};
try
{
using (MemoryStream ms = new MemoryStream())
{
var workBook = EntityConvertHelper<Info>.Export(infos, dic);
workBook.Write(ms);
string filename = "报表导出" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ".xlsx";
if (Request.Browser.Browser == "IE")
filename = HttpUtility.UrlEncode(filename);
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment;fileName=" + filename);
Response.BinaryWrite(ms.ToArray());
Response.End();
}
}
catch (Exception e)
{
}
}
} public class Info
{
public string Name { get; set; }
public int Age { get; set; }
public string Time { get; set; }
}
}
NPOIDemoController.cs
最后94页面啦~
<script src="~/scripts/jquery-1.12.3.js"></script> <form action="/NPOIDemo/Export" method="post" id="exportform">
<button type="submit">导出</button>
</form>
Index.cshtml
这个就很单纯的使用了一个form表单提交形式的按钮,其他应该也是可以的~
我的代码分享差不多就是这样,当然最牛的帮助类的代码都是前辈们提供给我的,在此向他们献上我的膝盖(扑通~)。
如果大家有什么疑问可以留言问我,或者觉得好用的话给点个赞,我好向亲爱的前辈们有个交代~
/****************************我是可爱的分割线*********************************/

使用NPOI实现简单的Excel导出功能的更多相关文章
- excel导出功能优化
先说说优化前,怎么做EXCEL导出功能的: 1. 先定义一个VO类,类中的字段按照EXCEL的顺序定义,并且该类只能用于EXCEL导出使用,不能随便修改. 2. 将查询到的结果集循环写入到这个VO类中 ...
- excel导出功能原型
本篇博客是记录自己实现的excel导出功能原型,下面我将简单介绍本原型: 这是我自制的窗体,有一个ListView和一个Button(导出)控件. 这是我在网上找到了使用exel需要引用的库. usi ...
- Atitit.excel导出 功能解决方案 php java C#.net版总集合.doc
Atitit.excel导出 功能解决方案 php java C#.net版总集合.docx 1.1. Excel的保存格式office2003 office2007/2010格式1 1.2. 类库选 ...
- 用SpringMvc实现Excel导出功能
以前只知道用poi导出Excel,最近用了SpringMvc的Excel导出功能,结合jxl和poi实现,的确比只用Poi好,两种实现方式如下: 一.结合jxl实现: 1.引入jxl的所需jar包: ...
- 利用Aspose.Cells完成easyUI中DataGrid数据的Excel导出功能
我准备在项目中实现该功能之前,google发现大部分代码都是利用一般处理程序HttpHandler实现的服务器端数据的Excel导出,但是这样存在的问题是ashx读取的数据一般都是数据库中视图的数据, ...
- java利用EasyPoi实现Excel导出功能
easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言( ...
- asp.net excel导出功能
以下是我在项目开发中所做的关于Excel导出功能,不足之处还望大家指正,相互学习 protected void btn_Export_Click(object sender, EventArgs e) ...
- Delphi实现带有格式的Excel导出功能
功能预览 运行预览 模板样式 存储返参 导出的Excel 2. 代码实现 //执行sql的函数 procedure TForm1.GetReportData(astrsql:string); var ...
- 使用NPOI组件完成的Excel导出导入(附源代码,测试通过)
最近遇到一个Excel导入导出的问题,要支持winform和webform,这里我是一个认真严谨的coder,所以决定把这个记录下来!和大家一起分享一下!如果需要的同学可以下载哦! 对于NPOI这个组 ...
随机推荐
- 三维重建:SLAM算法的考题总结
参考英文维基:https://en.wikipedia.org/wiki/Slam 参考文档:视觉slam研究分析的一点认识 1. 请简单描述您对机器人的SLAM的概念理解? 答: 机器人需要在自身位 ...
- logger日志
Level 描述 ALL 各级包括自定义级别 DEBUG 指定细粒度信息事件是最有用的应用程序调试 ERROR 错误事件可能仍然允许应用程序继续运行 FATAL 指定非常严重的错误事件,这可能导致应用 ...
- 怎样在PDF文件中查找某个特定的词?
不得不说中国的修饰词太多了例如:“滚”可以这样说,请你以一种圆润的方式离开:上次小编在路上听到某男子打电话,好像是给女孩子,那口才,是真的牛,夸人不带重复的.要不是我男孩子,我都想以身相许了.人们常常 ...
- 查看占用某端口的进程——netstat、findstr 的使用
netstat 检验本机各端口的网络连接情况 -a 显示所有连接和侦听端口(如Windows共享服务 的135,445端口) -n 不进行IP地址到主机名的解析 -o 显示拥有的与每个连接关联的进 ...
- json-lib与Jackson的区别和用法分析
一.Jackson概述 1.jackson包和版本 Jackson fasterxml和codehaus的区别: 他们是Jackson的两大分支.也是两个版本的不同包名.Jackson从2.0开始改用 ...
- 设计模式 第一天 UML图,设计模式原则:开闭原则、依赖倒转原则、接口隔离原则、合成复用原则、迪米特法则,简单工厂模式
1 课程大纲 2 UML的概述 总结: UML unified model language 统一建模语言 一共有十种图: 类图 用例图 时序图 * 对象图 包图 组件图 部署图 协作图 状态图 (最 ...
- [bzoj4766] 文艺计算姬 (矩阵树定理+二分图)
传送门 Description "奋战三星期,造台计算机".小W响应号召,花了三星期造了台文艺计算姬.文艺计算姬比普通计算机有更多的艺 术细胞.普通计算机能计算一个带标号完全图的生 ...
- 在vue项目中引用element-ui时 让el-input 获取焦点的方法
在制作项目的时候遇到一个需求,点击一个按钮弹出一个input输入框,并让输入框获得焦点,项目中引用了ElementUI 在网上查找了很多方法,但是在实际使用中发现了一个问题无论是使用$ref获取inp ...
- 12.IDEA中自动导资源包
在idea工程中,当你赋值一个类文件的部分代码,粘贴到另一个文件中时,需要导入原来文件中的包资源, 自动设置如下
- 用vue2.x注册一个全局的弹窗alert组件、confirm组件
一.在实际的开发当中,弹窗是少不了的,默认系统的弹窗样式太丑,难以满足项目的实际需求,所以需要自己定义弹窗组件,把弹窗组价定义为全局的,这样减少每次使用的时候引入麻烦,节省开发时间.本文将分享如何定义 ...