转:[Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!

简介:

引言

项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下。

方案一

NPOI

NPOI 是 POI 项目的 .NET 版本。POI是一个开源的Java读写Excel、WORD等微软OLE2组件文档的项目。
使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作。

优势

(一)传统操作Excel遇到的问题:
1、如果是.NET,需要在服务器端装Office,且及时更新它,以防漏洞,还需要设定权限允许.NET访问COM+,如果在导出过程中出问题可能导致服务器宕机。
2、Excel会把只包含数字的列进行类型转换,本来是文本型的,Excel会将其转成数值型的,比如编号000123会变成123。
3、导出时,如果字段内容以“-”或“=”开头,Excel会把它当成公式进行,会报错。
4、Excel会根据Excel文件前8行分析数据类型,如果正好你前8行某一列只是数字,那它会认为该列为数值型,自动将该列转变成类似1.42702E+17格式,日期列变成包含日期和数字的。
(二)使用NPOI的优势
1、您可以完全免费使用该框架
2、包含了大部分EXCEL的特性(单元格样式、数据格式、公式等等)
3、专业的技术支持服务(24*7全天候) (非免费)
4、支持处理的文件格式包括xls, xlsx, docx.
5、采用面向接口的设计架构( 可以查看 NPOI.SS 的命名空间)
6、同时支持文件的导入和导出
7、基于.net 2.0 也支持xlsx 和 docx格式(当然也支持.net 4.0)
8、来自全世界大量成功且真实的测试Cases
9、大量的实例代码
11、你不需要在服务器上安装微软的Office,可以避免版权问题。
12、使用起来比Office PIA的API更加方便,更人性化。
13、你不用去花大力气维护NPOI,NPOI Team会不断更新、改善NPOI,绝对省成本。
NPOI之所以强大,并不是因为它支持导出Excel,而是因为它支持导入Excel,并能“理解”OLE2文档结构,这也是其他一些Excel读写库比较弱的方面。通常,读入并理解结构远比导出来得复杂,因为导入你必须假设一切情况都是可能的,而生成你只要保证满足你自己需求就可以了,如果把导入需求和生成需求比做两个集合,那么生成需求通常都是导入需求的子集,这一规律不仅体现在Excel读写库中,也体现在pdf读写库中,目前市面上大部分的pdf库仅支持生成,不支持导入。

构成

 NPOI 1.2.x主要由POIFS、DDF、HPSF、HSSF、SS、Util六部分组成。

NPOI.POIFS
OLE2/ActiveX文档属性读写库
NPOI.DDF
Microsoft Office Drawing读写库
NPOI.HPSF
OLE2/ActiveX文档读写库
NPOI.HSSF
Microsoft Excel BIFF(Excel 97-2003)格式读写库
NPOI.SS
Excel公用接口及Excel公式计算引擎
NPOI.Util
基础类库,提供了很多实用功能,可用于其他读写文件格式项目的开发
  NPOI组成部分
NPOI 1.x的最新版为NPOI 1.2.5,其中包括了以下功能:
1、读写 OLE2文档
2、读写 DocummentSummaryInformationSummaryInformation
3、基于 LittleEndian的字节读写
4、读写 Excel BIFF格式
5、识别并读写 Excel BIFF中的常见 Record,如RowRecord, StyleRecord, ExtendedFormatRecord
6、支持设置单元格的高、宽、样式等
7、支持调用部分 Excel内建函数,比如说 sum, countif以及计算符号
8、支持在生成的 XLS内嵌入打印设置,比如说横向/纵向打印、缩放、使用的纸张等。
NPOI 2.0主要由SS, HPSF, DDF, HSSF, XWPF, XSSF, OpenXml4Net, OpenXmlFormats组成,具体列表如下:
Assembly名称 模块/命名空间 说明
NPOI.DLL
NPOI.POIFS
OLE2/ActiveX文档属性读写库
NPOI.DLL
NPOI.DDF
微软Office Drawing读写库
NPOI.DLL
NPOI.HPSF
OLE2/ActiveX文档读写库
NPOI.DLL
NPOI.HSSF
微软Excel BIFF(Excel 97-2003, doc)格式读写库
NPOI.DLL
NPOI.SS
Excel公用接口及Excel公式计算引擎
NPOI.DLL
NPOI.Util
基础类库,提供了很多实用功能,可用于其他读写文件格式项目的开发
NPOI.OOXML.DLL NPOI.XSSF Excel 2007(xlsx)格式读写库
NPOI.OOXML.DLL NPOI.XWPF Word 2007(docx)格式读写库
NPOI.OpenXml4Net.DLL NPOI.OpenXml4Net OpenXml底层zip包读写库
NPOI.OpenXmlFormats.DLL NPOI.OpenXmlFormats 微软Office OpenXml对象关系库

(以上内容来自百度百科)从上表可知NPOI组件已支持excel2007,记得之前用的时候只支持excel2003。很久没研究过这玩意儿了。

案例

 官网地址:http://npoi.codeplex.com/,可以从官网下载NPOI2.X版本的。

 首先引入

ICSharpCode.SharpZipLib.dll

NPOI.dll

NPOI.OOXML.dll

NPOI.OpenXml4Net.dll

NPOI.OpenXmlFormats.dll

然后引入命名空间:

using NPOI.XSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;

      辅助类

  NPOIExcelHelper

参考:http://www.cnblogs.com/Joetao/articles/3247909.html

测试结果

导入Excel,student.xlsx

导入DataTable,这里只将数据导入DataTable,导入数据库部分,就不再写了。

测试数据,向qq群里一朋友要的。大概有5w多条,lz机子是老爷机跑不起,只导出了其中的1k条。

方案二

利用office的com组件

首先添加com引用

引入命名空间

using Excel = Microsoft.Office.Interop.Excel;

 Com操作Excel辅助类

参考:http://www.cnblogs.com/waxdoll/archive/2005/10/28/264071.html

DataTable导入Excel

Excel读入DataTable

这里未对类型进行处理,datetime类型的数据会转换成数值类型的

方案三

将Excel数据表当作数据源,通过 OleDb来实现。

同样需要引入Microsoft Excel 14.0 Object Library

 分享一个操作类:

网上搜集的常用类,这里不再测试。

方案四

将Excel另存为xml文件,对xml文件进行操作。

复制代码
复制代码
 1 <Row>
 2     <Cell><Data ss:Type="String">998</Data></Cell>
 3     <Cell><Data ss:Type="String">柳雪巧</Data></Cell>
 4     <Cell><Data ss:Type="String">f</Data></Cell>
 5     <Cell><Data ss:Type="String">1971/4/30 0:00:00</Data></Cell>
 6     <Cell><Data ss:Type="String">2005/1/15 0:00:00</Data></Cell>
 7     <Cell><Data ss:Type="String">台湾省  屏东县</Data></Cell>
 8     <Cell><Data ss:Type="String">Dolores19710430@139.com</Data></Cell>
 9     <Cell><Data ss:Type="String">12616310511</Data></Cell>
10     <Cell><Data ss:Type="String">False</Data></Cell>
11     <Cell><Data ss:Type="String">2014/3/15 10:13:54</Data></Cell>
12     <Cell><Data ss:Type="String">5</Data></Cell>
13    </Row>
复制代码
复制代码

excel表格中每一行数据,其实是以上格式的xml,有规律,就可以很容易的去解析。

方案五

 js插件

官网地址:http://datatables.net/extras/tabletools/

 

方案六

导出为csv文件

分享一个辅助类

不再测试。

方案七

使用模版的方式,最简单的模版,就是将表头列出,然后再导入数据。第一行为表头,从第二行开始写入数据。导入过程可参考前面的解决方案。

方案八

使用Aspose.Cells组件,貌似收费。

可参考:http://www.cnblogs.com/lanyue52011/p/3372452.html

http://www.cnblogs.com/hongjiumu/archive/2013/03/15/2962277.html

http://www.cnblogs.com/wujy/archive/2012/07/19/2600162.html

方案九

OpenXML

 OpenXML库:DocumentFormat.OpenXml.dll;

 参考:http://www.cnblogs.com/zlgcool/archive/2008/12/31/1365993.html

http://blog.sina.com.cn/s/blog_46e9573c01011bvs.html

总结

列出常见的几种解决方案,在实际项目中,用哪一种,还是根据项目环境来决定吧。

最近项目中用到了Excel导出,导入的功能,就想着将常见的方式总结一下。也许还有遗漏,请留言,将你知道也分享给大家,谢谢。

如果该文章对你有所帮助,不妨推荐一下,让更多的人知道,毕竟分享是件快乐的事情。

代码下载:链接:http://pan.baidu.com/s/1dD3lleT 密码:axli

分类:  ASP.NET
本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/p/3618732.html ,如需转载请自行联系原作者
相关文章
|
29天前
|
SQL 数据库连接 数据库
你不知道ADo.Net中操作数据库的步骤【超详细整理】
你不知道ADo.Net中操作数据库的步骤【超详细整理】
16 0
|
1月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
61 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
2月前
|
开发框架 Oracle 关系型数据库
ASP.NET实验室LIS系统源码 Oracle数据库
LIS是HIS的一个组成部分,通过与HIS的无缝连接可以共享HIS中的信息资源,使检验科能与门诊部、住院部、财务科和临床科室等全院各部门之间协同工作。 
35 4
|
3月前
|
存储 NoSQL API
一个小巧、快速、轻量级的 .NET NoSQL 嵌入式数据库
一个小巧、快速、轻量级的 .NET NoSQL 嵌入式数据库
135 0
|
3月前
|
开发框架 前端开发 JavaScript
分享129个ASP.NET源码总有一个是你想要的
分享129个ASP.NET源码总有一个是你想要的
29 0
|
3月前
|
开发框架 前端开发 .NET
分享119个ASP.NET源码总有一个是你想要的
分享119个ASP.NET源码总有一个是你想要的
40 1
|
3月前
|
开发框架 前端开发 .NET
分享68个ASP.NET源码总有一个是你想要的
分享68个ASP.NET源码总有一个是你想要的
64 0
|
3月前
|
开发框架 前端开发 JavaScript
分享53个ASP.NET源码总有一个是你想要的
分享53个ASP.NET源码总有一个是你想要的
32 0
|
3月前
|
开发框架 前端开发 .NET
分享42个ASP.NET源码总有一个是你想要的
分享42个ASP.NET源码总有一个是你想要的
27 0
|
1月前
|
SQL 存储 关系型数据库
C# .NET面试系列十:数据库概念知识
#### 1. 为什么要一定要设置主键? 设置主键是数据库设计中的一个重要概念,有几个主要原因: 1、唯一性 ```c# 主键必须保证表中的每一行都有唯一的标识。这样可以避免数据冗余和不一致性。如果没有主键或者主键不唯一,就可能出现数据混乱或错误。 ``` 2、查询性能 ```c# 数据库系统通常会使用主键来加速数据检索。主键通常会被索引,这样可以更快速地找到特定行的数据,提高查询效率。 ``` 3、关联性 ```c# 主键常常用于建立表与表之间的关系。在关系数据库中,一个表的主键通常与其他表中的外键建立关联,这种关系对于数据的一致性和完整性非常重要。 ``` 4、数据完
131 1
C# .NET面试系列十:数据库概念知识