码迷,mamicode.com
首页 > 数据库 > 详细

导入Excel数据至数据库——思路整理

时间:2015-01-29 12:40:14      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:

说明

背景:

导入Excel数据到数据库成为目前项目中很常用的技术,整理以前的实现发现:在原来系统中的导入,没有实现方法复用,如果要实现某一处数据的导入,需要将原来的代码复制过去、修修改改,实现过程较为复杂,实现类似的功能需要对原来的代码重新梳理,结合业务修改代码。

为了让每次相同的功能都不需要重复的开发,我们需要实现一种能够得到复用的程序功能。

 

目的:

如图所示

技术分享

技术分享


我们需要将Excel中的数据记录插入到DB的表中,如何实现?

  1. 转换
    1. Excel转换为List
    2. Excel转换为DataTable
  2. 验证、解析
    1. 换列名——中文—属性名称(字段名称)
    2. 必要性——必要列、行数据
    3. 去重复——Excel数据的重复、ExcelDataTable数据的重复
    4. 默认列——Excel中没有,需要程序另外添加列、并赋予值的(导入题库:试卷Id—外键-参数传递)
    5. 换数据——汉字换为数字(男/女—1/0、是/否—1/0
    6. 换外键——将外键列的数据更换为外键所在表的主键
    7. 关联表——第三张表:目标表的主键、关联表的主键、……

      ……

实现

        示意图1:

技术分享

             示意图2:实现方式

技术分享

    Excel与数据库之间加入了XML的映射,对应Excel数据与数据库表设计之间关系,XML配置文件书写示例如下:

    1.总体结构

   

<Excel>
	<Sheet name="学生" table="Student" primaryKey="StudentId" pkType="guid">
		 < Column>
 		 < /Column>

		 < Column>
		 < /Column>

                 < Column>
		 < /Column>
		 ……
	 </Sheet>
</Excel>

    2.详细说明


<Excel name="学生">
	<!- name:Excel中Sheet的名称,不配置此属性,默认为“Sheet1”,table:对应DB中的数据表名称(使用EF生成表的话则为对应实体名),primaryKey:主键字段名,pkType:逐渐类型 ->
	<Sheet name="学生" table="TB_Student" primaryKey="StudentId" pkType="guid">
		<!-- Column节点:name:Excel中对应列名(第一行),field:对应数据库中字段名,isNeccessary:是否必要(true/false) isVerifyRepeat=是否验证重复(true/false) -->
		<Column name="学号" field="SCode" isNecessary="true" isVerifyRepeat="true">
		  <DataType>string</DataType>
		  <AvailableField isExistAvailableField="false" enableValue="true">Enable</AvailableField>
		</Column>
		<Column name="姓名" field="SName" isNecessary="true">
		  <DataType>string</DataType>
		  <ForeignKey isExist="false"></ForeignKey>
		</Column>
		<Column name="性别" field="Sex" conversionValue="男-0;女-1">
		  <DataType>string</DataType>
		  <ForeignKey isExist="false"></ForeignKey>
		</Column>
		<Column name="年龄" field="Age" isVerifyRepeat="false">
		  <DataType>int32</DataType>
		  <ForeignKey isExist="false"></ForeignKey>
		</Column>
		<Column name="生日" field="BirthDate" isVerifyRepeat="false">
		  <DataType>datetime</DataType>
		  <ForeignKey isExist="false"></ForeignKey>
		</Column>
		<!-- isForeignKey:是否外键(true/false) -->
		<Column name="年级" field="GradeGID" isVerifyRepeat="false" isForeignKey="true" isNecessary="false">
		  <DataType>GUID</DataType>
		  <!-- 外键信息配置 -->
		  <ForeignKey>
			<!-- 外键表 -->
			<TableName>TB_Grade</TableName>
			<!-- Excel中所显示的外键表信息字段 -->
			<FieldName>GradeName</FieldName>
			<!-- 外键表所对应的主键字段名 -->
			<PrimaryKey>GradeID</PrimaryKey>
			<!-- 外键表“是否有效”字段说明:isExistAvailableField-是否存在“是否有效”字段(true/false),Enable-是否可用字段名,enableValue-可用状态下的具体存储值 -->
			<AvailableField isExistAvailableField="false" enableValue="true">Enable</AvailableField>
		  </ForeignKey>
		</Column>
		<!-- isM2N-是否对应存在与其他表的多对多关系,separator-Excel中具体数据之间所使用的分隔符 -->
		<Column name="职务" field="职务" isM2N="true" separator="," isNecessary="false" isActive="true" >
			<!--第三张表表名-->
			<ThirdTable>TBR_StudentJob</ThirdTable>
			<!--第三张表表名-->
			<ThirdTablePrimaryKey dataType="string">Id</ThirdTablePrimaryKey>
			<ThirdTableFirstPK dataType="string">StudentId</ThirdTableFirstPK>
			<ThirdTableSecondPK dataType="string">JobId</ThirdTableSecondPK>
			<!-- 第三张表其他列需要传递默认值 -->
			<ThirdColumns>
				<Column field="DefaultTest" isDefault="true" dataType="string" />
			</ThirdColumns>
			<!-- 与目标表对应的关联表的配置 TB_Job-表名,isDefault-是否为默认值(”true”,调用方需传递Dictionary类型参数中包括对应ThirdTableSecondPK的默认值) -->
			<RelatedTable isDefault="true">TB_Job</RelatedTable>
			<!-- 第三张表中存有的目标表的主键 -->
			<RelatedKey>JobId</RelatedKey>
			<!-- 第三张表中存有的目标关联表的主键 -->
			<RelatedName>JobName</RelatedName>
			<!-- 与目标表对应的关联表是否存在“是否有效”字段的配置 -->
			<AvailableField isExistAvailableField="false" enableValue="true">Enable</AvailableField>
		</Column>
		<Column field="Default" isDefault="true"></Column>
	</Sheet>
</Excel>

有了配置文件,剩下的工作便是通过程序将Excel与相应的XML配置结合起来,做一些中间解析、验证、转换等工作。中间的程序实现也就可以自由发挥了,当然,如果想做到比较完善,还是比较复杂的,但技术上也就没有什么大的问题了。我自己的一种实现方式,将在下一篇博客中介绍。


总结

    配置文件应该是在项目中经常用到的,而一般我们的使用都是在别人已经封装好,已经制定下规定格式要求的前提下,例如web项目下的web.xml的配置,以及一些较为常用的框架,更是需要我们在其规定下进行使用。反过来想,为何我们不能在一些通用的需求功能应用上使用XML作为配置,规范出我们的规则,让程序更加灵活和通用,这便是框架的逐渐形成的方式吧。

 

导入Excel数据至数据库——思路整理

标签:

原文地址:http://blog.csdn.net/lfsfxytgb9_lyg/article/details/43267397

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!