利用NPOI导出数据到Execl
相信很多童鞋都开发过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的更多相关文章
- NPOI导出数据到Excel
NPOI导出数据到Excel 前言 Asp.net操作Excel已经是老生长谈的事情了,可下面我说的这个NPOI操作Excel,应该是最好的方案了,没有之一,使用NPOI能够帮助开发者在没有安装微 ...
- 利用fputcsv导出数据备份数据
今天,分享一个利用fputcsv导出数据备份数据的方法,我也时看到些零零散散的代码,想着拼起来,所以我只提供些思路,以及简单的代码,至于怎么组合能够让它更强大,尽情去探索吧 讲之前先上一段获取数据库里 ...
- php利用phpexcel导出数据
php中利用phpexcel导出数据的实现代码.对phpexcel类库不熟悉的朋友,可以阅读下<phpexcel中文帮助手册>中的内容,具体实例大家可以phpexcel快速开发指南中的相关 ...
- Winform .NET 利用NPOI导出大数据量的Excel
前言:公司让做一个导出数据到Excel的小工具,要求是用户前端输入sql语句,点击导出按钮之后,将数据导出到Excel,界面如图所示:文件下端显示导出的进度 遇到的问题: 1.使用NPOI进行Exce ...
- C#利用NPOI导出Excel类(简单版)
代码: using System.Data; using System.IO; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; namespac ...
- NPOI导出多表头Execl(通过html表格遍历表头)
关于NPOI的相关信息,我想博客园已经有很多了,而且NPOI导出Execl的文章和例子也很多,但导出多表头缺蛮少的:今天要讲的通过自己画html表格:通过html表格来导出自定义的多表头: 先来看要实 ...
- java利用poi导出数据到excel
背景: 上一篇写到利用jtds连接数据库获取对应的数据,本篇写怎样用poi将数据到处到excel中,此程序为Application 正文: 第三方poi jar包:poi驱动包下载 代码片段: /** ...
- 利用OLEDB导出数据到Excel
原帖地址:http://blog.csdn.net/cpp2017/archive/2008/04/02/2245396.aspx 利用OELDB数据访问对象操作Excel文件,达到将数据导出到Exc ...
- ASP.NET基于NPOI导出数据
using System; using System.Collections; using System.Collections.Generic; using System.IO; using Sys ...
随机推荐
- 设置 IntelliJ IDEA 的彩色代码主题
首先,给出一系列 IntelliJ IDEA 代码的彩色主题,供大家选择: VibrantUnknown(Darcula) FadeComments NicePython Solarized Have ...
- char/unsigned char/int/short 存储范围
Type Storage size Value range char 1 byte -128 to 127 or 0 to 255 unsigned char 1 byte 0 to 255 sign ...
- C++ vs Objective C
oc Short list of some of the major differences: C++ allows multiple inheritance, Objective-C doesn't ...
- ik_max_word ik_smart 区别 和 单字 查询 不到问题
ik_smart:分词的时候只分一次,句子里面的每个字只会出现一次. 比如:中华人民共和国国歌 入上图,分成:中华人民共和国 国歌 2 部分.每个字都自出现了一次.(我指的每一个位置 的子. 2个国 ...
- spring-IOC容器(二)
一.bean配置里面使用外部属性文件: <bean>中添加context Schema定义,Spring 提供了一个<property-placeholder>元素,可以在be ...
- .NET设计模式 第二部分 创建型模式(1)—:单件模式(Singleton Pattern)
单件模式(Singleton Pattern) ——.NET设计模式系列之二 Terrylee,2005年12月07日 概述 Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问 ...
- C# 多线程控制
C# 多线程控制 通讯 和切换 一.多线程的概念 Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程.什么是进 ...
- mysql show master status为空值
问题 执行show master status,输出结果为空: mysql> show master status; Empty set (0.00 sec) 原因 mysql没有开启日志. 查 ...
- ulimit设置内存限制是否有效
如何使用ulimit限制物理内存 限制物理内存 $ ulimit -m 512000 经测试,无效. 限制物理内存不起作用,ulimit不支持限制物理内存,可见man ulimit手册 -m The ...
- SDRAM初识
SDRAM初识 1. 2. 3. 4. SDRAM分为bank地址和行列地址,看bank地址的位宽就可以推断出bank的数量,行列地址信号是集成在了一个信号中,是并行的. 5. 6. SDRAM与主机 ...