相信很多童鞋都开发过Execl的导入导出功能,最近产品中无论是后台数据分析的需要,还是前端满足用户管理的方便,都有Execl导入导出的维护需求产生。

以前做这个功能,如果是web,利用HttpContext.Current.Response.ContentType ="application/ms-excel";就可以导出html数据表格到execl中,这种方法的问题就是编码格式的兼容性太差,用Mac OS之类的 office打开直接乱码给你看。或者是调用office的COM组件,或宏脚本的方式操作Execl,这种方式的主要问题就是客户端必须要安装office,如果你装的是wps还玩不转。

最近产品中使用了NPOI这个开源组件后,上诉方法直接感觉太Out了。先感受一下代码的魅力:

      /// <summary>
/// 导出Execl
/// </summary>
/// <returns></returns>
public FileResult DataExportToExecl()
{
7 //创建Excel文件的对象
NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();
NPOI.SS.UserModel.ISheet sheet1 = book.CreateSheet("Sheet1"); //添加一个sheet var _data = CardHelper.GetAllData(); //获取list数据,也可以分页获取数据,以获得更高效的性能 //给sheet1添加第一行的头部标题
NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow();
row1.CreateCell().SetCellValue("排名");
row1.CreateCell().SetCellValue("CardID");
row1.CreateCell().SetCellValue("姓名");
row1.CreateCell().SetCellValue("手机");
row1.CreateCell(4).SetCellValue("职位");
row1.CreateCell(5).SetCellValue("所在公司");
row1.CreateCell(6).SetCellValue("创建时间"); //将数据逐步写入sheet1各个行
for (int i = ; i < _data.Count; i++)
{
NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + ); rowtemp.CreateCell().SetCellValue(i+);
rowtemp.CreateCell().SetCellValue(_data[i].ID);
rowtemp.CreateCell().SetCellValue(_data[i].RealName);
rowtemp.CreateCell().SetCellValue(_data[i].Cellphone);
rowtemp.CreateCell(4).SetCellValue(string.IsNullOrEmpty(_data[i].WorTitle) ? "无" : _data[i].WorTitle);
rowtemp.CreateCell(5).SetCellValue(string.IsNullOrEmpty(_data[i].Company) ? "无" : _data[i].Company);
rowtemp.CreateCell(6).SetCellValue(_data[i].CreateDate.ToString());
}
// 写入到客户端
System.IO.MemoryStream ms = new System.IO.MemoryStream();
book.Write(ms);
ms.Seek(, SeekOrigin.Begin);
return File(ms, "application/vnd.ms-excel", DateTime.Now.ToString("yyyyMMdd") + ".xls");
}

在前端你只要用超文本链接到这个Action就可以了,至于是纯文本还是按钮的方式,就根据自己喜好了。

         /// <summary>
/// 导入Execl信息
/// </summary>
/// <returns></returns>
private DataView LoadExeclFile()
{
//虚拟生成一个DataTable
DataTable dt = new DataTable();
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Phone", typeof(string));
dt.Columns.Add("CID", typeof(string));
dt.Columns.Add("Status", typeof(string));
DataRow newRow = null; string filepath = @"data.xls";  //读取本地Execl,当前路径是该程序的所在目录
HSSFWorkbook wb = new HSSFWorkbook(new FileStream(filepath, FileMode.Open));
HSSFSheet sheet = wb.GetSheet("data") as HSSFSheet; //获取execl中名字为data的sheet表格数据 if (sheet == null)
{
MessageBox.Show("检查是否文件路径和文件名称有误!");
}
else
{
//导入数据
for (int i = ; i <= sheet.LastRowNum; i++) //获得所有行数
{
IRow row = sheet.GetRow(i); //读取当前行数据
if (row != null)
{
newRow = dt.NewRow();
newRow["Name"] = row.GetCell().ToString();
newRow["Phone"] = row.GetCell().ToString();
newRow["CID"] = row.GetCell().ToString();
newRow["Status"] = row.GetCell().ToString(); if (IsMobile(row.GetCell().ToString()))
{
dt.Rows.Add(newRow);
} }
} } return dt.DefaultView;
}

这个Execl导入功能实现的是将数据导入Gridview中去,你如果想导入到数据库或其他数据存储介质,代码换成:

         /// <summary>
/// 导入Execl信息
/// </summary>
/// <returns></returns>
private void LoadExeclFile()
{
string filepath = @"data.xls";  //读取本地Execl,当前路径是该程序的所在目录
HSSFWorkbook wb = new HSSFWorkbook(new FileStream(filepath, FileMode.Open));
HSSFSheet sheet = wb.GetSheet("data") as HSSFSheet; //获取execl中名字为data的sheet表格数据 if (sheet != null)
{
//导入数据
for (int i = ; i <= sheet.LastRowNum; i++) //获得所有行数
{
IRow row = sheet.GetRow(i); //读取当前行数据
if (row != null)
{
InsertDataIntoDB(row.GetCell(0).ToString(),row.GetCell(1).ToString(),row.GetCell(2).ToString(),row.GetCell(3).ToString());
            }
           } 
44        }
45      }

看过代码之后,我相信你能感知到NPOI的对Execl操作的强大已经无法用言语形容了。上诉的导入导出应该是平常开发中使用最频繁的Execl操作了,而且NPOI基本上已经将各类方法封装到极致了,除非你有特殊业务场景,不然只要稍作修改,就能满足自己不同的业务需求了。当然,上诉方案还是有些问题所在的,解决思路大体类似,时间换空间,或空间换时间。比如:

--导出数据量很大的话,获取数据以及对数据加工处理,多会遇到性能问题,严重的话甚至是内存溢出,程序报错。解决思路很简单, 代码改造一下,采用分页获取数据,导出到多个sheet或者分成多个execl导出,代码我就懒得写了。

总结一下NPOI的优缺点吧:

优点:使用超级简洁,小白也能看的明白。独立组件,引用即可。无需第三方依赖。编码灵活控制,兼容性优秀。性能使用下来非常优异,源码写的也特漂亮...

缺点:如果有,请告诉我吧!

利用NPOI导出数据到Execl的更多相关文章

  1. NPOI导出数据到Excel

    NPOI导出数据到Excel   前言 Asp.net操作Excel已经是老生长谈的事情了,可下面我说的这个NPOI操作Excel,应该是最好的方案了,没有之一,使用NPOI能够帮助开发者在没有安装微 ...

  2. 利用fputcsv导出数据备份数据

    今天,分享一个利用fputcsv导出数据备份数据的方法,我也时看到些零零散散的代码,想着拼起来,所以我只提供些思路,以及简单的代码,至于怎么组合能够让它更强大,尽情去探索吧 讲之前先上一段获取数据库里 ...

  3. php利用phpexcel导出数据

    php中利用phpexcel导出数据的实现代码.对phpexcel类库不熟悉的朋友,可以阅读下<phpexcel中文帮助手册>中的内容,具体实例大家可以phpexcel快速开发指南中的相关 ...

  4. Winform .NET 利用NPOI导出大数据量的Excel

    前言:公司让做一个导出数据到Excel的小工具,要求是用户前端输入sql语句,点击导出按钮之后,将数据导出到Excel,界面如图所示:文件下端显示导出的进度 遇到的问题: 1.使用NPOI进行Exce ...

  5. C#利用NPOI导出Excel类(简单版)

    代码: using System.Data; using System.IO; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; namespac ...

  6. NPOI导出多表头Execl(通过html表格遍历表头)

    关于NPOI的相关信息,我想博客园已经有很多了,而且NPOI导出Execl的文章和例子也很多,但导出多表头缺蛮少的:今天要讲的通过自己画html表格:通过html表格来导出自定义的多表头: 先来看要实 ...

  7. java利用poi导出数据到excel

    背景: 上一篇写到利用jtds连接数据库获取对应的数据,本篇写怎样用poi将数据到处到excel中,此程序为Application 正文: 第三方poi jar包:poi驱动包下载 代码片段: /** ...

  8. 利用OLEDB导出数据到Excel

    原帖地址:http://blog.csdn.net/cpp2017/archive/2008/04/02/2245396.aspx 利用OELDB数据访问对象操作Excel文件,达到将数据导出到Exc ...

  9. ASP.NET基于NPOI导出数据

    using System; using System.Collections; using System.Collections.Generic; using System.IO; using Sys ...

随机推荐

  1. ViewBag & ViewData

    ViewBag 和ViewData 是ASP.NET MVC 开发当中大家使用很多的传递数据的方法 VB可以称为VD的一块语法糖, VB是使用C# 4.0动态特征, 使得VD也具有动态特性. 下面就是 ...

  2. 一个类似 Twitter 雪花算法 的 连续序号 ID 产生器 SeqIDGenerator

    项目地址 :     https://github.com/kelin-xycs/SeqIDGenerator 今天 QQ 群 里有网友问起产生唯一 ID 的方法 有哪些,  讨论了各种方法 . 有网 ...

  3. Java单播、广播、多播(组播)---转

    一.通信方式分类 在当前的网络通信中有三种通信模式:单播.广播和多播(组播),其中多播出现时间最晚,同时具备单播和广播的优点. 单播:单台主机与单台主机之间的通信 广播:当台主机与网络中的所有主机通信 ...

  4. tcpdump过滤某个端口

    一般我们使用Tcpdump时都是使用: Java代码   tcpdump -i ethx      www.2cto.com   下面这条命令就是查看80端口的访问量,进行排序,取前20位    Ja ...

  5. LOJ 2312(洛谷 3733) 「HAOI2017」八纵八横——线段树分治+线性基+bitset

    题目:https://loj.ac/problem/2312 https://www.luogu.org/problemnew/show/P3733 原本以为要线段树分治+LCT,查了查发现环上的值直 ...

  6. 学习笔记: jstack与线程状态

    jstatck可以打印JVM内部所有线程 1.查看有哪些java进程 2.查看所有线程的信息 重定向到5579.txt文件中 jstack 5579 > 5579.txt 3.线程的状态 New ...

  7. Java消息机制 ActiveMQ入门实例

    转载自:http://www.cnblogs.com/wyh3721/p/5917316.html 1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/  ...

  8. MAC JDK默认安装路径 JAVA路径

    打开终端,执行     /usr/libexec/java_home -V 默认JDK1.6(Apple自带JDK)路径:   /System/Library/Java/JavaVirtualMach ...

  9. eval 日期对象

    js中,eval相当于python中的eval(表达式)和exec(代码)的集合. var d = new Date();    #申明一个新的日期对象,方便之后调用,它的方法getDate();ge ...

  10. Thinkphp 3.1. 3 ueditor 1.4.3 添加水印

    1.引入Ueditor  <!-- 实例化编辑器 --> <script type="text/javascript"> window.UEDITOR_HO ...