利用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 ...
随机推荐
- 常用gui软件使用技巧
xmind powerdesinger notepad++ firefox office ========================================= win10企业版安装 xm ...
- day28 1.缓冲区 2.subprocess 3.黏包现象 4.黏包现象解决方案 5.struct
1.缓冲区: 输入缓冲区 输出缓冲区 2. subprocess的使用import subprocess sub_obj = subprocess.Popen('ls', #系统指令shell=Tr ...
- python re正则模块
re 正则表达式操作 本模块提供了类似于Perl的正则表达式匹配操作.要匹配的模式和字符串可以是Unicode字符串以及8位字符串. 正则表达式使用反斜杠字符('\')来表示特殊的形式或者来允许使用 ...
- 逻辑回归(logic regression)的分类梯度下降
首先明白一个概念,什么是逻辑回归:所谓回归就是拟合,说明x是连续的:逻辑呢?就是True和False,也就是二分类:逻辑回归即使就是指对于二分类数据的拟合(划分). 那么什么是模型呢?模型其实就是函数 ...
- java IO流(二)
一.字符编码 char计算机存储的都是二进制数据,其实就是一个一个的数值字符要存储,就必须让这个字符对应一个数 将一个字符转成数字,这个过程就叫编码,反过来将一个数字转成字符就叫解码 中国大陆 (GB ...
- centos 6.X 安装nodejs v6.11.0和npm
下载nodejs wget -c https://nodejs.org/dist/v6.11.0/node-v6.11.0-linux-x64.tar.xz 安装gcc++ yum install - ...
- [3] 注解(Annotation)-- 深入理解Java:注解(Annotation)--注解处理器
转载 http://www.cnblogs.com/peida/archive/2013/04/26/3038503.html 深入理解Java:注解(Annotation)--注解处理器 如果没有用 ...
- Android adb 模拟滑动 按键 点击事件
模拟事件全部是通过input命令来实现的,首先看一下input命令的使用: usage: input ... input text <string> input keyeven ...
- %cd% 与 %~dp0% 区别
@echo off echo path:%~dpnx0% ipconfig /all|findstr "\<IPv4 适配器\>" %cd% 在批处理和命令窗口都能使 ...
- PHP批量添加数据
<?php // 连接数据库 header('content-type:text/html;charset=utf-8'); define('DB_HOST','127.0.0.1'); def ...