使用NPOI导入导出标准Excel
尝试过很多Excel导入导出方法,都不太理想,无意中逛到oschina时,发现了NPOI,无需Office COM组件且不依赖Office,顿时惊为天人,怀着无比激动的心情写下此文。
曾使用过的方法
- 直接导出html,修改后缀名为.xls,这个方法有点像骗人的把戏,而且不能再导入
- 使用Jet OLEDB引擎来进行导入导出,完全使用sql语句来进行操作,缺点能控制的东西非常有限,比如格式就难以控制
- 使用Office COM组件进行导入导出,对环境依赖性太强(如“检索 COM 类工厂…”错误);且需要通过打开Excel.exe进程进行操作;虽然可以通过关闭工作表以及Marshal.ReleaseComObject方法来释放资源,但依然避免不了性能差。
关于NPOI
NPOI是POI项目的.NET版本,是由@Tony
Qu(http://tonyqus.cnblogs.com/)等大侠基于POI开发的,可以从http://npoi.codeplex.com/下载到它的最新版本。它不使用Office
COM组件(Microsoft.Office.Interop.XXX.dll),不需要安装Microsoft Office,支持对Office 97-2003的文件格式,功能比较强大。更详细的说明请看作者的博客或官方网站。
它的以下一些特性让我相当喜欢:
- 支持对标准的Excel读写
- 支持对流(Stream)的读写 (而Jet OLEDB和Office COM都只能针对文件)
- 支持大部分Office COM组件的常用功能
- 性能优异 (相对于前面的方法)
- 使用简单,易上手
使用NPOI
本文使用的是它当前的最新版本1.2.4,此版本的程序集缩减至2个:NPOI.dll、Ionic.Zip.dll,直接引用到项目中即可。
对于我们开发者使用的对象主要位于NPOI.HSSF.UserModel空间下,主要有HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell,对应的接口为位于NPOI.SS.UserModel空间下的IWorkbook、ISheet、IRow、ICell,分别对应Excel文件、工作表、行、列。
简单演示一下创建一个Workbook对象,添加一个工作表,在工作表中添加一行一列:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;public class NPOIWrite{ void CreateSheet() { IWorkbooknew HSSFWorkbook();//创建Workbook对象 ISheet"Sheet1");//创建工作表 IRow//在工作表中添加一行 ICell//在行中添加一列 cell.SetCellValue("test");//设置列的内容 }} |
相应的读取代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
using System.IO;using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;public class NPOIRead{ void GetSheet(Stream { IWorkbooknew HSSFWorkbook(stream);//从流内容创建Workbook对象 ISheet//获取第一个工作表 IRow//获取工作表第一行 ICell//获取行的第一列 string value//获取列的值 }} |
使用NPOI导出
从DataTable读取内容来创建Workbook对象:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
public static MemoryStream{ MemoryStreamnew MemoryStream(); using (table) { using (IWorkbooknew HSSFWorkbook()) { using (ISheet { IRow // foreach (DataColumnin table.Columns) headerRow.CreateCell(column.Ordinal).SetCellValue(column.Caption);//If // int rowIndex foreach (DataRowin table.Rows) { IRow foreach (DataColumnin table.Columns) { dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString()); } rowIndex++; } workbook.Write(ms); ms.Flush(); ms.Position } } } return ms;} |
如果看不惯DataTable,那么DataReader也行:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
public static MemoryStream{ MemoryStreamnew MemoryStream(); using (reader) { using (IWorkbooknew HSSFWorkbook()) { using (ISheet { IRow int cellCount // for (int i { headerRow.CreateCell(i).SetCellValue(reader.GetName(i)); } // int rowIndex while (reader.Read()) { IRow for (int i { dataRow.CreateCell(i).SetCellValue(reader[i].ToString()); } rowIndex++; } workbook.Write(ms); ms.Flush(); ms.Position } } } return ms;} |
以上代码把创建的Workbook对象保存到流中,可以通过以下方法输出到浏览器,或是保存到硬盘中:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
static void SaveToFile(MemoryStreamstring fileName){ using (FileStreamnew FileStream(fileName, { byte[] fs.Write(data, fs.Flush(); datanull; }}static void RenderToBrowser(MemoryStreamstring fileName){ if (context.Request.Browser.Browser"IE") fileName context.Response.AddHeader("Content-Disposition","attachment;fileName=" + context.Response.BinaryWrite(ms.ToArray());} |
使用NPOI导入
需要注意的是,sheet.LastRowNum = sheet.PhysicalNumberOfRows - 1,这里可能存在BUG:当没有数据或只有一行数据时sheet.LastRowNum为0,PhysicalNumberOfRows 表现正常。
这里读取流中的Excel来创建Workbook对象,并转换成DataTable:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
static DataTable{ using (excelFileStream) { using (IWorkbooknew HSSFWorkbook(excelFileStream)) { using (ISheet//取第一个表 { DataTablenew DataTable(); IRow//第一行为标题行 int cellCount//LastCellNum int rowCount//LastRowNum //handling for (int i { DataColumnnew DataColumn(headerRow.GetCell(i).StringCellValue); table.Columns.Add(column); } for (int i { IRow DataRow if (rownull) { for (int j { if (row.GetCell(j)null) dataRow[j] } } table.Rows.Add(dataRow); } return table; } } }} |
或者是直接生成SQL语句来插入到数据库:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
public static int RenderToDb(Streamstring insertSql,{ int rowAffected using (excelFileStream) { using (IWorkbooknew HSSFWorkbook(excelFileStream)) { using (ISheet//取第一个工作表 { StringBuildernew StringBuilder(); IRow//第一行为标题行 int cellCount//LastCellNum int rowCount//LastRowNum for (int i { IRow if (rownull) { builder.Append(insertSql); builder.Append("); for (int j { builder.AppendFormat("'{0}',","'","''")); } builder.Length builder.Append(");"); } if ((i { //每50条记录一次批量插入到数据库 rowAffected builder.Length } } } } } return rowAffected;} |
这里的Excel可能没有数据,所以可以加一个方法来检测:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public static bool HasData(Stream{ using (excelFileStream) { using (IWorkbooknew HSSFWorkbook(excelFileStream)) { if (workbook.NumberOfSheets { using (ISheet { return sheet.PhysicalNumberOfRows } } } } return false;} |
结尾
好吧,不说啥了,放代码:点击下载
使用NPOI导入导出标准Excel的更多相关文章
- c#.net 使用NPOI导入导出标准Excel (asp.net winform csharp)
尝试过很多Excel导入导出方法,都不太理想,无意中逛到oschina时,发现了NPOI,无需Office COM组件且不依赖Office,顿时惊为天人,怀着无比激动的心情写下此文. 曾使用过的方法 ...
- ASP.NET- 使用NPOI导入导出标准Excel
尝试过很多Excel导入导出方法,都不太理想,无意中逛到oschina时,发现了NPOI,无需Office COM组件且不依赖Office,顿时惊为天人,怀着无比激动的心情写下此文. 曾使用过的方法 ...
- 使用NPOI导入导出标准的Excel
关于NPOI NPOI是POI项目的.NET版本,是由@Tony Qu(http://tonyqus.cnblogs.com/)等大侠基于POI开发的,可以从http://npoi.codeplex. ...
- c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出
c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出 using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using S ...
- NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中
以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...
- NPOI导入导出Excel
.net mvc利用NPOI导入导出excel 注意:如何导出的提交方式ajax导出是失效的! 解决方案是:js处理l两个表单的提交 代码: 第一步. 在页面里面加入2个隐藏的iframe, 如下 ...
- .Net core NPOI导入导出Excel
最近在想.net core NPOI 导入导出Excel,一开始感觉挺简单的,后来真的遇到很多坑.所以还是写一篇博客让其他人少走一些弯路,也方便忘记了再重温一遍.好了,多的不说,直接开始吧. 在.Ne ...
- JAVA实现数据库数据导入/导出到Excel(POI)
准备工作: 1.导入POI包:POI下载地址http://mirrors.tuna.tsinghua.edu.cn/apache/poi/release/src/(重要) 如下 2.导入Java界面美 ...
- Npoi导入导出Excel操作
之前公司的一个物流商系统需要实现对订单的批量导入和导出,翻阅了一些资料,最后考虑使用NPOI实现这个需求. 在winform上面实现excel操作:http://www.cnblogs.com/Cal ...
随机推荐
- HTA基础
HTA是HTML应用程序(HTML Application)的缩写,可以使用HTML中的绝大多数标签.脚本等.直接将HTML保存成HTA的格式,就是一个能够独立运行的应用软件. 与普通HTML网页相比 ...
- 洛谷 [P1801] 黑匣子
这道题是一道splay裸题,然而身为蒟蒻的我并不会,所以这道题我维护的是一个大根堆与一个小根堆结合起来的类似沙漏的结构. 本题难点在于询问的不是最大最小值,而是第K小值,所以我们想到了维护这样两个堆, ...
- 51NOD 1238 最小公倍数之和 V3 [杜教筛]
1238 最小公倍数之和 V3 三种做法!!! 见学习笔记,这里只贴代码 #include <iostream> #include <cstdio> #include < ...
- 学习H5仿制网站时遇到的问题
学习H5的第二周,开始仿制网站,在本过程中也发现了自己存在的更多问题. 1.TOP块:在制作top中,遇到的第一个问题,一旦top左右的背景色不同该怎样去调整 解决方式:建立两个div取代一个div ...
- 事务与隔离级别------《Designing Data-Intensive Applications》读书笔记10
和数据库打交道的程序员绕不开的话题就是:事务,作为一个简化访问数据库的应用程序的编程模型.通过使用事务,应用程序可以忽略某些潜在的错误场景和并发问题,由数据库负责处理它们.而并非每个应用程序都需要事务 ...
- linux常用命令(不断更新)
睡眠命令(第一步可省去): 1.查看你的系统支持什么模式:cat /sys/power/state(我的系统为:freeze mem disk) 2.切换到管理员模式下,执行命令:echo " ...
- Python编程软件的安装与使用——Windows、Linux和Mac
Python版本:3.6.2 操作系统:Windows 作者:SmallWZQ 最近,有读者透露:Python软件如何安装?为什么自己安装的软件会有各种"奇怪"的问题?据此,本 ...
- shiro权限控制的简单实现
权限控制常用的有shiro.spring security,两者相比较,各有优缺点,此篇文章以shiro为例,实现系统的权限控制. 一.数据库的设计 简单的五张表,用户.角色.权限及关联表: CREA ...
- 克隆虚拟机以及两台linux机器相互登录:linux学习第四篇
克隆虚拟机 1. 克隆 之后自己命名克隆的虚拟机并自己选择存放位置,完成克隆 2. 克隆虚拟机之后对新的虚拟机修改网络配置,以免冲突(将配置文件里的UUID去掉,并修改IP地址) ...
- Egret学习笔记 (Egret打飞机-3.实现背景循环滚动)
游戏背景里面的猪脚飞机看起来是一直在向前飞,但是实际上只是一个视觉差而已. 猪脚是出于不动的状态,背景从上到下滚动,然后让玩家觉得飞机在不停的往前飞.(当然这只是其中一种实现思路) 差不多就是这样,然 ...