使用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这个组 ...
随机推荐
- java 循环document 通用替换某个字符串或特殊字符
document 生成xml时 报错 XML-20100: (Fatal Error) Expected ';'. 查了半天发现是 特殊字符 & 不能直接转出,需要进行转换,因为是通用方法很 ...
- 通过yum仓库安装mysql
1,下载安装包wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm2,安装mysql源yum -y ins ...
- PAT_A1154#Vertex Coloring
Source: PAT A 1154 Vertex Coloring (25 分) Description: A proper vertex coloring is a labeling of the ...
- Python基础学习(day1)
一.Python几点使用规范: 1.关于引号的使用规范 (1)字符串中含有单引号,则使用双引号外扩 print("It's ok") (2)字符串中含有双引号,则使用单引号外扩 p ...
- HDU 4405 Aeroplane chess(概率dp,数学期望)
题目 http://kicd.blog.163.com/blog/static/126961911200910168335852/ 根据里面的例子,就可以很简单的写出来了,虽然我现在还是不是很理解为什 ...
- Linux系统学习之 三:新手必须掌握的Linux命令3
内容预览 1.输入输出重定向 2.管道命令符 3.命令行的通配符 4.常用的转义符号 5.重要的环境变量 一.输入输出重定向 重定向技术的5种模式:1 标准覆盖输出重定向 错误覆盖输出重定向 错误追加 ...
- JSONEncoder
A flat implementation You could use something like this: from sqlalchemy.ext.declarative import Decl ...
- 使用requirejs模块化开发多页面一个入口js的使用方式
描述 知道requirejs的都知道,每一个页面需要进行模块化开发都得有一个入口js文件进行模块配置.但是现在就有一个很尴尬的问题,如果页面很多的话,那么这个data-main对应的入口文件就会很多. ...
- 学习EXTJS6(3)基本概念
ExtJS不再纠缠HTML和CSS上.概念和传统的程序相近.如面板panel,布局Layout.组件Component等等. 1.渲染Render:ExtJS页面在浏览器中装载完成后完全展现出来的一个 ...
- 通过fmt标签格式化el表达式中的日期、小数
首先引入fmt外部文件包 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" % ...