利用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 ...
随机推荐
- resolve和reject不会终结Promise的参数函数的执行
- node start - hello world http server
Write a file t1.js 'use strict'; const express = require('express'); // Constants const PORT = 8080; ...
- C语言struct小知识
1.C语言里的struct是不能包含成员函数的,只能有数据成员2.C语言struct定义变量只能用一下两种方式:struct { ... } x, y, z;struct point pt;直接poi ...
- yii 分页查询
控制器 <?php namespace backend\controllers; use app\models\Comment; use app\models\Commentstatus; us ...
- django报错解决:view must be a callable or a list/tuple in the case of include().
django版本:1.11.15 django应用,修改urls.py后,访问报错:TypeError at /view must be a callable or a list/tuple in t ...
- JS replace()用法实现replaceAll
由于js没有提供replaceAll,则使用正则表达式实现全局替换. javascript中replace() 方法如果直接用str.replace("-","!&quo ...
- py-day1-3 python基本数据类型
数据的基本类型: 数字:
- operator笔记
# operator.itemgetter(*items) # 获取item >>> from operator import itemgetter # list使用下标进行返回 & ...
- CentOS6.5 安装+ Tengine + PHP + MySQL
简介: Tengine是由淘宝网发起的Web服务器项目.它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性.Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了 ...
- HDMI初识
HDMI初识 1.阅读文档xapp1287 (1) KC705 HDMI Reference Design Block Diagram (2) KC705 HDMI Reference Design ...