【1】NPOI

NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。
POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。
使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。
(哈哈,我不会告诉你这一段是从百度百科copy过来的~~)
 
【2】实例操作
我其实也没怎么深入研究,因为最近的MVC项目里目前只需要Excel导出的功能,所以就只尝试了这一种,所幸成功了,但是也借鉴了很多网上博客分享的知识,都是一知半解,最后还是向公司前辈们讨教了一下,就提供给我了一个他们封装好的帮助类。
这样的好东西自然是要拿出来分享啦~经过公司前辈们的恩准,我才得以把这些代码贴出来,这边就做个勤劳的小搬运工好了(:-D)
下面就开始说明具体的一些实现过程:
 
首先,我们需要引用一些必要的程序集:(点我下载哦

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导出功能的更多相关文章

  1. excel导出功能优化

    先说说优化前,怎么做EXCEL导出功能的: 1. 先定义一个VO类,类中的字段按照EXCEL的顺序定义,并且该类只能用于EXCEL导出使用,不能随便修改. 2. 将查询到的结果集循环写入到这个VO类中 ...

  2. excel导出功能原型

    本篇博客是记录自己实现的excel导出功能原型,下面我将简单介绍本原型: 这是我自制的窗体,有一个ListView和一个Button(导出)控件. 这是我在网上找到了使用exel需要引用的库. usi ...

  3. Atitit.excel导出 功能解决方案 php java C#.net版总集合.doc

    Atitit.excel导出 功能解决方案 php java C#.net版总集合.docx 1.1. Excel的保存格式office2003 office2007/2010格式1 1.2. 类库选 ...

  4. 用SpringMvc实现Excel导出功能

    以前只知道用poi导出Excel,最近用了SpringMvc的Excel导出功能,结合jxl和poi实现,的确比只用Poi好,两种实现方式如下: 一.结合jxl实现: 1.引入jxl的所需jar包: ...

  5. 利用Aspose.Cells完成easyUI中DataGrid数据的Excel导出功能

    我准备在项目中实现该功能之前,google发现大部分代码都是利用一般处理程序HttpHandler实现的服务器端数据的Excel导出,但是这样存在的问题是ashx读取的数据一般都是数据库中视图的数据, ...

  6. java利用EasyPoi实现Excel导出功能

    easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言( ...

  7. asp.net excel导出功能

    以下是我在项目开发中所做的关于Excel导出功能,不足之处还望大家指正,相互学习 protected void btn_Export_Click(object sender, EventArgs e) ...

  8. Delphi实现带有格式的Excel导出功能

    功能预览 运行预览 模板样式 存储返参 导出的Excel 2. 代码实现 //执行sql的函数 procedure TForm1.GetReportData(astrsql:string); var ...

  9. 使用NPOI组件完成的Excel导出导入(附源代码,测试通过)

    最近遇到一个Excel导入导出的问题,要支持winform和webform,这里我是一个认真严谨的coder,所以决定把这个记录下来!和大家一起分享一下!如果需要的同学可以下载哦! 对于NPOI这个组 ...

随机推荐

  1. 时序分析:HMM模型(状态空间)

    关于HMM模型:时序分析:隐马尔科夫模型 HMM用于手势识别: 训练时每一种手势对应一个HMM-Model,识别率取最大的一个HMM即可.  类似于一个封装的完成多类识别器功能单层网络. 优点: 尤其 ...

  2. Maya API编程快速入门

    一.Maya API编程简介 Autodesk® Maya® is an open product. This means that anyone outside of Autodesk can ch ...

  3. 大型工程多个目录下的Makefile写法

    1.前言 目前从事于linux下程序开发,涉及到多个文件,多个目录,这时候编译文件的任务量比较大,需要写Makefile.关于Makefile的详细内容可以参考网上流传非常广泛的<跟我一起写Ma ...

  4. 【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# -->成功 判断为双引号变形注 ...

  5. c#动态类型Dynamic

    需引用System.Dynamic命名空间 来源:http://www.cnblogs.com/ryanding/archive/2010/12/09/1900106.html dynamic Cus ...

  6. XML-20100: (Fatal Error) Expected ';'. xml转word 导出时异常

    因为数据中包含特殊字符.需要进行转译. < < 小于号 > > 大于号 & & 和 &apos; ’ 单引号 " " 双引号 XML ...

  7. mysql安装包下载地址

    1.打开mysql官网 :https://dev.mysql.com/ 2.选择 downlad-->windows-->MySQL Installer -->滑动至页面底部,选择第 ...

  8. 【转载】Java 反射详解

    目录 1.什么是反射? 2.反射能做什么? 3.反射的具体实现 4.根据反射获取父类属性 4.反射总结 反射反射,程序员的快乐! 1.什么是反射? Java反射就是在运行状态中,对于任意一个类,都能够 ...

  9. 【udacity】机器学习-神经网络

    Evernote Export 1.神经网络 神经元 细胞的主体称为细胞体,然后有轴突.突触 他们构建的方式是可以调整的 我们会有一些输入的放电信号视为放电频率或输入的强度 X1​w1​X2​w2​X ...

  10. vue组件的拆分

    vue组件的拆分 <div class="div"> <!-- 拆分出来的组件 自定义名字moban --> <moban></moban ...