系统的测试资料数据录入是系统数据流的入口,因此十分重要。在某油气田测试平台中录入油气井测试资料数据时,面临两个问题:第一由于每个测试项目的子作业工序很多,;第二是由于测试项目中某些作业工序的测试数据非常多,如果在作业工序中采用逐条数据记录添加的方式,这样既容易出错效率又低。
从现有的油气井测试资料来看,测试作业中业务流程的测试数据大多数都是采用二维表格的形式储存的,下边介绍两种数据导入方法的设计思路和实现,分别是实现预处理的批量数据导入方法和多表的Excel文件数据批量导入方法。
1 传统的数据批量导入方法
传统的数据批量导入方法主要有SQL的DTS工具导入、第三方数据软件导入、SQL语句数据导入和编写数据导入代码等方法。通过几种方法的对比得出编写数据批量导入代码方法相对而言更加适合用户,程序员将导入代码直接封装在程序中,用户直接在系统中操作界面即可完成,但是这种方法也暴露出了很多缺点:第一,数据导入中的寻找和匹配字段问题;第二,对导入的数据全角半角和数据类型判断的问题;第三,数据导入失败之后无法给用户提供出错信息。针对该方法中出现的问题,系统设计了一种实现预处理的批量数据导入方法,该方法解决了在以上的方法中暴露的缺点,真正地解决了批量数据导入的问题。
2 实现预处理的数据批量导入方法
实现预处理的数据批量导入方法的设计思路是:将Excel数据上传到服务器的临时目录中,连接Excel,以Excel文件作为数据源,将Excel中的数据读取到数据集DataSet中之后,对数据集中的数据进行检查,如果Excel数据文件的结构与数据库对应表的结构不一致提示用户出错,否则检查数据的数据类型和全角半角是否符合要求,判断的方法是采用正则表达式对每个单元格的数据进行判断,如果数据是全角输入或者数据类型不符合,将此条数据写入到日志文件中,然后继续判断下边的数据,当所有的数据检查完成之后将日志文件返回给用户进行修改并自动删除上传到服务器临时目录里边的Excel文件。当用户修改完数据之后再导入一次,如果没有返回给用户日志文件则说明导入的数据完全符合要求,此时就可以将数据导入到数据库中,具体的设计流程如图1所示。
1)系统中设计了上传Excel文件样例。设计的目的是方便用户根据样例设置需要导入数据的格式,避免后边因为格式出现重复修改。
2)导入数据的格式设置好之后,将Excel文件上传到服务器规定的目录下,并将Excel数据读取到数据集DataSet中。如果DataSet中数据结构与数据库对应表的结构不一致,提示用户出错退出系统。
3)对数据集中的数据进行预处理,具体步骤如下。
① 定义一个布尔型的标志位,便于判断数据是否合格。上传的Excel数据全部检查通过此标志位不改变值,导入数据中出现不合格的情况就改变该标志位的值。
② 利用正则表达式判断DataSet中数据的数据类型和全角半角,所检查的当前行中有数据类型不符合或者数据出现全角的情况,将此条数据记录写入到日志文件中,提示用户修改。然后继续下边数据的检查,利用这种方式将所有的数据检查完毕。
③ 判断标志位的值是否发生改变,如果值没有发生改变,将说明全部数据检查通过,则可以把数据导入到数据库中;如果值发生改变,则说明有些数据不合格,则需要把日志文件返回给用户以便用户进行修改,并且将服务器规定目录中的Excel文件删除。
④ 用户将数据修改好之后将数据继续上传,然后进行预处理检查,直到所有的数据检查合格为止,预处理详细的流程如图2所示。
4)所有的数据检查通过之后,将数据导入到数据库中,并输出一个 Excel 数据导入报告,报告中统计空行和成功导入的行数如果数据集中数据整行为空的话,则不插入到数据库中,并将此行数写入到报告中,提示此行跳过;如导入的数据某一行的某个单元格为空,则数据表中相应的表格输入“null”,至此测试数据导入成功。
采用这种方法的好处是用户在真正将数据导入到数据库之前就可以对导入数据的合法性进行检查,只有数据全部检查通过之后才会将数据导入到数据库中,通过这种预处理的方法就可以避免数据导入的重复性,通过返回日志文件的方式用户就可以知道出错的具体原因从而进行修改。
3 多表的Excel文件数据批量导入方法
多表的Excel文件数据批量导入方法的设计思路是:构造一个从Excel文件到数据库对应表的映射关系,映射关系包括两个,一个是Excel文件中每个工作表映射数据库中对应的表,另一个是工作表的每一列映射数据表中相应的字段。然后将需要导入的工作表表名和表中的内容与数据库中的表名和表中字段的对应关系写入到一个映射关系实例化的对象中,通过构造一个数据上传的类,在类中将之前的实例化对象存放到定义的变量中,然后通过客户端发出的多次Ajax请求将一个Excel中所有工作表的测试数据全部导入到数据库中,具体的程序流程图如图3所示。
1)首先定义一个映射关系类,此类的对象用于存放Excel文件中各个工作表sheet的表名、表中的数据项名、数据库对应的数据表名以及表中对应的字段名。
2)定义一个全局的静态Excel数据数组类,用来存放Excel文件中每个sheet工作表的信息,这个数组类将上一步创建的映射关系类作为类的成员。
3)将需要上传的Excel文件中各工作表的详细的工作表信息存入到映射关系的实例化对象中。
4)定义一个数据上传的类,根据客户端发送的Ajax请求获取控制器名称,然后将控制器名称传到数据上传类中的构造函数中,构造函数将静态Excel数据数组类的对象分别存放到对应的变量中,每次请求对应一个Sheet工作表,在此类中定义一个真正处理Excel表格数据上传的方法,此方法和之前的单表数据批量导入的方法一样。
5)同单个数据上传一样,先把待导入的Excel表格文件上传到服务器的目录中,将此Excel表格文件作为数据源,将对应sheet中的所有数据读取到DataSet中,通过遍历DataSet的方式确定对应sheet表格中的表头和数据部分。由于各sheet表中的表头格式不太一样,但表头的行数不会超过3行,所以,在前3行来确定表头具体所在的行号,兼容了Excel表格中sheet工作表表头不一致的情况。
6)根据用户的选择,可以将导入的数据追加到数据库中,另外也可以将原来的数据覆盖。追加的情况比较简单,直接将数据读取出来,然后依次插入到数据库。覆盖之前,需要将对应数据库表中的对应数据删除,再进行插入操作。
7)找到对应数据部分的开始行,进行向下遍历,数据有数据,就执行一次数据库插入操作,如果此行为空,则打印提示该行为空,直到DataSet中所有数据遍历完成;如果导入中途出错,则打印提示到某一行异常,继续操作,并最后总结导入了多少行数据。
8)通过客户端多次发送的Ajax请求将Excel中的所有工作表数据全部导入到数据库中。
4 总结
基于Excel的数据库数据导入,适合于大数据量的批量导入情况,特别是信息已经是基于Excel管理的情况。采用本文的批量导入方式,能极大地改善数据的导入效率。通过这两种方法可以节省用户录入数据的时间,也不会因为测试数据过多造成遗忘或者混乱。
参考文献:
[1] 沈浩,邓晓军.基于ASP.NET的批量Excel数据导入通用模块的设计与实现[J].电脑知识与技术,2012(34).