使用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这个组 ...
随机推荐
- 时序分析:HMM模型(状态空间)
关于HMM模型:时序分析:隐马尔科夫模型 HMM用于手势识别: 训练时每一种手势对应一个HMM-Model,识别率取最大的一个HMM即可. 类似于一个封装的完成多类识别器功能单层网络. 优点: 尤其 ...
- Maya API编程快速入门
一.Maya API编程简介 Autodesk® Maya® is an open product. This means that anyone outside of Autodesk can ch ...
- 大型工程多个目录下的Makefile写法
1.前言 目前从事于linux下程序开发,涉及到多个文件,多个目录,这时候编译文件的任务量比较大,需要写Makefile.关于Makefile的详细内容可以参考网上流传非常广泛的<跟我一起写Ma ...
- 【sqli-labs】 less16 POST - Blind- Boolian/Time Based - Double quotes (基于bool型/时间延迟的双引号POST型盲注)
' or 1=1# -->失败 1" or 1=1# -->失败 1') or 1=1# -->失败 1") or 1=1# -->成功 判断为双引号变形注 ...
- c#动态类型Dynamic
需引用System.Dynamic命名空间 来源:http://www.cnblogs.com/ryanding/archive/2010/12/09/1900106.html dynamic Cus ...
- XML-20100: (Fatal Error) Expected ';'. xml转word 导出时异常
因为数据中包含特殊字符.需要进行转译. < < 小于号 > > 大于号 & & 和 ' ’ 单引号 " " 双引号 XML ...
- mysql安装包下载地址
1.打开mysql官网 :https://dev.mysql.com/ 2.选择 downlad-->windows-->MySQL Installer -->滑动至页面底部,选择第 ...
- 【转载】Java 反射详解
目录 1.什么是反射? 2.反射能做什么? 3.反射的具体实现 4.根据反射获取父类属性 4.反射总结 反射反射,程序员的快乐! 1.什么是反射? Java反射就是在运行状态中,对于任意一个类,都能够 ...
- 【udacity】机器学习-神经网络
Evernote Export 1.神经网络 神经元 细胞的主体称为细胞体,然后有轴突.突触 他们构建的方式是可以调整的 我们会有一些输入的放电信号视为放电频率或输入的强度 X1w1X2w2X ...
- vue组件的拆分
vue组件的拆分 <div class="div"> <!-- 拆分出来的组件 自定义名字moban --> <moban></moban ...