设置主页 | 收藏本站 Excel学习网-公益型的EXCEL在线学习网站,助您轻松办公!

Excel教程_通用Excel导入设计

2019年11月27日 13:27 发布来源:Excel学习网

Excel教程_通用Excel导入设计:

摘要:有时分我们的数据寄存在Excel中(特别是关于用户来说更喜欢运用Excel搜集一些常用数据),而系统又需求这些数据来处置其他业务,那么此时我们就需求将这些数据导入到数据库中。但是鉴于Excel的款式多种多样,因而每次导入时都必需书写很多反复的代码。很明显关于一个软件开发者做这些反复劳动是一件很无趣的事情。那么怎样来寻中一种通用的办法呢?今天我们就一块看一下如何来处理这个问题。

主要内容

  1. Excel操作组件的选择
  2. 总体设计思绪
  3. 配置文件设计
  4. 类设计
  5. 编码完成
  6. 一点补充
  7. 简单的测试
  8. 总结

一、Excel操作组件的选择

在开端今天的主题之前我们先简单的看一个根底的问题,那就是如何停止Excel的读写。关于Excel的读写操作目前主要分为:1.Oledb数据库衔接方式2.运用Excel.exe Com组件3.运用第三方控件。详细哪种方式好我们要根据详细状况而定,关于第一种方式则请求excel表格必需是想数据库中的表一样标准,例如假如excel牵扯到兼并单元格的状况就很难处置了。关于第二种方式则请求用户必需依照Excel,而且其效率比拟低。思索到我们的需求,所以这里选择第三种方式来操作Excel。操作Excel的第三方控件比拟多,常见的如NPOI、myxls、Aspose.Cells等。前两者都是开源的,并且NPOI除了写Excel功用比拟强之外关于Excel读取也是非常优秀(myxls读取excel不如NPOI)。Aspose.Cells是一款商业控件,其操作便当性当然也是非常强大的,而且Aspose是一个系列组件,不只有操作Excel的组件还有关于word、ppt、pdf、flash等操作组件。这里由于项目开发中运用的是Aspose.Cells,因而下面的例子中我们就拿Aspose.Cells来停止Excel操作(大家能够去找破解版或者运用NPOI,当然也能够用myxls等)。

二、总体设计思绪

我们去设计通用Excel的目的就是为了防止反复工作,也就是说不用由于Excel的款式、数据等变化而重新从零做起、反复劳动。因而我们就必需抽取一个通用的东西出来,运用时只需求关注相关的业务而不用过度关注相关excel操作和存储。再简单一点就是封装共同点,暴漏个性点。思索到这种状况,我们能够运用配置文件的方式来处理这个问题。在配置文件中我们配置Excle要导入的表、字段等信息,在停止导入时再根据配置文件将数据导入到数据库中。这样一来,在需求停止Excel导入时只需求为某个或多个excel配置一个xml文件,然后调用相关的类就能够完成整个excel导入工作了。

补充:通用的局限性

在这里阐明一下,固然我们设计的是一个通用的Excel导入程序,但是这里的"通用"只是相对来说的,并不是思索了一切Excel的状况,由于Excel的设计状况非常的复杂多样,要将一切的状况都思索进去是一个漫长的过程。我们这里的程序只思索关于单sheet导入一个或多个表中的状况,并且不思索包含统计行的状况(能够包含兼并行、代码表字段等)。

三、配置文件设计

既然思索运用xml配置的方式来设计通用Excel导入,因而如何设计好xml也就成了设计的重点。关于单表导入(一个Excel主要导入到一个数据库表中,当然这并不扫除牵扯其他代码表的状况)我们的配置文件无论以数据库为根底设计(主要是根据数据库表构造)还是以Excel(主要是根据Excel格式设计)为根底设计都能够,但是假如是多表导入(也就是一个Excel能够导入到几张表中的状况)的话思索其复杂性还是以数据库为根底更为适宜。因而思索到这种状况,我们整个配置设计会以数据库表构造为根底来设计。最终我们的设计样例如下:

代码

在最外层为Config节点,代表整个配置。其属性EndTag(数据读取的完毕标志,例如"RowBlank"代表空行完毕,在读取Excel时遇到某行没有任何数据的状况则视为完毕;也能够为某个列地址,在导入时到了此列就会完毕导入操作);属性HeaderIndex代表excel表头对应的行值(从1开端);DataIndex表示数据列起始行索引(从1开端)。

接着是Table节点,对应数据库中的表,能够有多个。其Name属性对应要导入的表称号;DeleteRepeat属性表示能否删除反复行(假如为true则会依据主键先删除反复行再执行插入操作);ExcludedColumns表示扫除列,多个列名运用","分割(这些字段不会导入)。

Table节点内当然就是Column节点,也就是对应的列,通常有多个(留意关于excel中没有的列,而数据库表需求导入的,也需求配置Column节点,此时HeaderText为空或不配置HeaderText属性)。IsPrimarykey属性表示能否为主键(当Table节点配置DeleteRepeat为ture时必需指定一个Column节点的IsPrimaryKey为true,由于此属性是为了delete条件做准备的[有可能它不是真正的主键]);ColumnName表示对应的列名;HeaderText表示对应的Excel列头(在根据Excel别名导入时依据此值肯定导入的列);Required指定此列能否为必需导入的列(假如配置为true,excel中此列为空并且没有配置默许值的话则会抛出异常);DataType为数据类型(例如string、number,用于数据校验);DefaultValue为默许值(留意其值不一定是指定的字符值,能够是"Max"、"NewID".假如为Max,那么此列必需为数值类型,此时在导入的时分假如需求运用默许值,就会在原来数据库表中此列最大值的根底上加上1导入到数据库中,假如为NewID在导入的时分假如需求运用默许值系统就会自动创立id);Comment是此列的阐明。

在Column节点中还能够配置CodeTable节点,表示代码表。Name属性值主表的表称号;PrimaryKey指主表的主键,也就是字表的外键;ReferenceColumn表示对应代码字段关联称号列,也就是我们导入时所根据的excel对应值(例如CategoryID对应CategoryName,那么ReferenceColumn就是CategoryName,由于常常Excel中可能寄存的是相似于CategoryName的东西而不是CategoryID,而导入操作时需求CategoryID)。

四、类设计

我们有了思绪之后,接下来就来看一下类的设计吧。

在这些类中Excel类是整个导入的中心,其最初要的办法就是Import(),当然除此之外一切关于Excel的读取和对数数据库的操作以及对配置对象的解析都是由此类担任;Config类是对整个配置的笼统,其对应的办法图中也曾经标出,每个Config类对应多个实体类;Entity是关于表的笼统,就是表对应的实体类;Property类是关于列的笼统,每个Entity中包含多个Property;另外DictionaryEntity是数据字典,是对代码表的笼统,每个Property能够对应一个代码表;除此之外ConfigHelper是关于应用程序配置的封装;AsposeCell是对Aspose.Cells的封装,包含常用的Excel读写办法。

五、编码完成

接下来我们就开端完成整个设计吧,置信有了上面的阐明和代码中的注释,了解起来应该很简单的,我就不再过多赘余了。

AsposeCell类

代码

ConfigHelper类

代码

DictionaryEntity类

代码

Property类

代码

Entity类

代码

Config类

代码

Excel类

代码

留意:程序中用到了Cmj.dll(自定义的一个类库)中的几个类,详细阐明如下

SqlHelper:数据库操作类,运用时在配置文件的ConnectionStrings中配置name为"DBCon"的衔接串,指明ProviderName即可,假如不运用配置能够直接在结构函数中传送这两个参数。

MyXML:关于XML文件操作的封装了,用于XML文件操作。

MyFileBase:对文件操作的封装。

FileSearch:对文件查找的封装,能够依照关键字查找文件。

六、一点补充

为了愈加容易了解,我对程序中的一些商定和处置做少许补充。

Excel类中有参结构函数两个参数分别是excel途径(也能够是目录)以及能否启用事务的bool型变量。假如用户运用无参结构函数的话,就必需在应用程序配置文件的appSettings配置节点配置中配置"ExcelPath"和"UseTransaction"两个节点。由于对数据库的操作需求访问应用程序的配置文件,因而需求配置connectionStrings节点。

普通的导入依照上面的配置就能够完成了。为了便当运用此类还提供了其他导入方式。假设觉得列配置较费事的,觉得没有必要配置那么多列的话,能够思索下面几种方式。

 配置文件中假如没有Column配置,能够经过配置单元格的别名,来指示每一个列对应的表字段。

 假如配置文件中没有Column配置,而又不希望指定单元格别名,但是Excel中的列和表中的列又不是逐个对应的(很可能有些列数据库表中有,而Excel中没有),此时假如Excel中列的次第和表中次第分歧,你就能够经过在配置文件中设置Table的ExcludedColumns来将这些列扫除(多个需求扫除的列中间用","分割)。

 假如我的Excel中的列和数据库表中完整分歧且次第一样,那么你出来配置文件中配置Table属性外就不需求任何额外的配置了。

另外,假如需求在导入时检查能否有默写列独一的状况的状况(例如ProductName我不希望有反复),关于反复的先删除再倒入,此时能够再此列上设置IsPrimaryKey为true,然后在Table的属性中配置DeleteRepeat为true就能够了;假如一切的导入过程中你需求运用事务机制,能够在应用程序配置appSettings 配置节点中指定useTransaction为true(留意先要保证事务效劳是启动的);程序支持兼并行的导入。

关于配置文件和Excel文件的关系,是这样商定的,多数状况下ExcelPath的配置为目录(当然能够是一个Excel文件途径,此时就只导入该Excel文件),关于此种情形可能呈现下列状况。

 目录中只要一个配置文件,而有一个或多个Excel。这种状况下程序以为此配置文件对应一切Excel文件,将会运用此配置将一切Excel导入。

 目录中有多个配置文件,并且有多个Excel文件。此时程序户依据配置文件的称号自动匹配Excel文件,匹配的规则就是它对应的Excle文件的称号中要呈现配置文件的称号。

七、简单的测试

下面我们简单的测试一下我们的类库,应该说运用起来非常简单。

 在运用之前当然要有一个需求导入的Excel

 依据Excel编写xml文件

 

代码

 将excel文件和对应xml文件放到F:\Cmj.DataExchange\wfTest\excel

 树立一个项目,添加Cmj.DataExchange.dll援用

 在配置文件中配置数据库衔接以及Excel目录等

 

代码

 接着确保Distributed Transaction Coordinator效劳是启动的(由于程序中用的是.Net2.0的事务,当然你也能够运用.Net1.0事务,此时就无需启动此效劳了)。

 最后添加下面两句代码就能够完成整个导入了。

 

Excel ex =new Excel();
ex.Import();

下面是导入前后数据库Northwind中Products表中的数据(曾经胜利导入)

导入之前

导入之后

八、总结

关于普通的Excel导入状况程序根本上都可以处理,但是开发过程中难免遇到更复杂的状况,此时就需求更多的思索和更复杂多样的设计,这种状况有时机我们再一看讨论。由于代码相比照较长阅读几有些不便,这里提供源代码和示例下载 ,需求的朋友能够看一下。

Excel教程_通用Excel导入设计

原创文章如转载请注明:转载自Excel学习网 [ http://www.excelxx.com/]
需要保留本文链接地址:http://www.excelxx.com/xuexixinde/11221.html
分享到:
网站地图 | XML地图 | 免责声明 | 关于我们 | Excel学习网:优秀的EXCEL在线学习和资源分享网站。
版权所有: CopyRight © 2013-2018 www.excelcn.com All Rights Reserved.
豫ICP备12002644号