使用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() { IWorkbook new 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 { IWorkbook new 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 { MemoryStream new MemoryStream(); using (table) { using (IWorkbook new HSSFWorkbook()) { using (ISheet { IRow // foreach (DataColumn in table.Columns) headerRow.CreateCell(column.Ordinal).SetCellValue(column.Caption); //If // int rowIndex foreach (DataRow in table.Rows) { IRow foreach (DataColumn in 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 { MemoryStream new MemoryStream(); using (reader) { using (IWorkbook new 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(MemoryStream string fileName) { using (FileStream new FileStream(fileName, { byte [] fs.Write(data, fs.Flush(); data null ; } } static void RenderToBrowser(MemoryStream string 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 (IWorkbook new HSSFWorkbook(excelFileStream)) { using (ISheet //取第一个表 { DataTable new DataTable(); IRow //第一行为标题行 int cellCount //LastCellNum int rowCount //LastRowNum //handling for ( int i { DataColumn new DataColumn(headerRow.GetCell(i).StringCellValue); table.Columns.Add(column); } for ( int i { IRow DataRow if (row null ) { 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(Stream string insertSql, { int rowAffected using (excelFileStream) { using (IWorkbook new HSSFWorkbook(excelFileStream)) { using (ISheet //取第一个工作表 { StringBuilder new StringBuilder(); IRow //第一行为标题行 int cellCount //LastCellNum int rowCount //LastRowNum for ( int i { IRow if (row null ) { 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 (IWorkbook new 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 ...
随机推荐
- xBIM 多个IFC文件合并
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- 常系数齐次线性递推 & 拉格朗日插值
常系数齐次线性递推 具体记在笔记本上了,以后可能补照片,这里稍微写一下,主要贴代码. 概述 形式: \[ h_n = a_1 h_{n-1}+a_2h_{n-2}+...+a_kh_{n-k} \] ...
- bzoj 3996: [TJOI2015]线性代数 [最小割]
3996: [TJOI2015]线性代数 题意:给出一个NN的矩阵B和一个1N的矩阵C.求出一个1*N的01矩阵A.使得 \(D=(A * B-C)* A^T\)最大.其中A^T为A的转置.输出D.每 ...
- BZOJ 3992: [SDOI2015]序列统计 [快速数论变换 生成函数 离散对数]
3992: [SDOI2015]序列统计 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1017 Solved: 466[Submit][Statu ...
- HttpGet HttpPost
public string HttpGet(string Url, string postDataStr) { HttpWebRequest request = (HttpWebRequest)Web ...
- Leetcode刷题C#版之Toeplitz Matrix
题目: Toeplitz Matrix A matrix is Toeplitz if every diagonal from top-left to bottom-right has the sam ...
- OpenCV角点检测源代码分析(Harris和ShiTomasi角点)
OpenCV中常用的角点检测为Harris角点和ShiTomasi角点. 以OpenCV源代码文件 .\opencv\sources\samples\cpp\tutorial_code\Trackin ...
- win7无法启用网络发现
1. Windows+R 2. 指令services.msc 3.找到以下服务,设为自动并开启服务 Function Discovery Resource Publication SSDP Disco ...
- Ansible playbook循环实践总结<一>
1.标准Loops 标准loops可以直接减少task的次数,如下: [root@zero01 playbook]# vi loops.yaml --- - hosts: all gather_fac ...
- Python个人总结_02
个人学习总结: python 第二课 解释型和编译型语言 计算机是不能够识别高级语言的,当我们运行一个高级语言的时候,需要将高级语言 翻译成计算机能够读懂的机器语言.这个过程分为两类,一个是编译,一个 ...