如何从Excel中将复杂的关系数据导入到SQL Server中

我们有商业用户谁正在input产品信息到Excel电子表格。 我的任务是提供一种将这些信息input到SQL Server数据库的方法。 问题是Excel电子表格不仅仅是一张平坦的表格,它们是分层的。 他们是这样的

-[Product 1] [Other fields]... -[Maintenance item 1] [Other fields]... -[Maintenance task 1] [other fields]... -[Maintenance item 2] [Other fields]... -[Maintenance task 2] [other fields]... -[Maintenance task 3] [other fields]... -[Product 2] [Product Description] [Other fields]... ETC....... 

因此,产品可以有多种维护项目,对于维护项目可以有多种维护任务。 这就是数据库的结构。 我需要提出一个标准的Excel模板,我可以发送给我们的业务用户,以便他们可以input这些信息,然后找出如何将其导出到SQL Server中。 数量会很高,所以我需要有一些自动化的import。 我应该怎么做?

欢迎使用最糟糕的方式来存储数据并尝试将其导入到数据库中。 如果可能的话,不要让他们创build这样的垃圾Excel电子表格。 这种方法必然会在数据导入中造成很多错误,如果你必须支持这个混乱,你将永远恨你的生活。

我不能相信我甚至提出这个build议,但你可以让他们使用一个简单的Access数据库? 它甚至可以直接链接到SQL Server数据库并正确存储数据。 通过使用Access表单,用户会发现添加和维护信息相对容易,而且您将遇到的问题远远less于以您所描述的forms导入Excel数据的问题。 这将是一个更便宜,更不容易出错的解决scheme,以解决您的问题。

你坚持使用格式,我发现做这样的事情的最好方法就是把它导入临时表中,把ID添加到每一个下级行(你最终可以循环这样做),然后拖动信息到关系登台表,然后导入生产数据库。

你可以使用SSIS创build所有这些,但是这并不容易,也不会很快,如果用户没有严格遵守数据input的规则,那么就很容易出错(而且他们从来都没有一套表单填写)。 确保完全拒绝Excel电子表格,并将其发回给用户,如果它违反规定的结构。 相信我。

我估计Access解决scheme需要大约一个月的时间,Excel解决scheme需要至less六个月的开发时间。 真的,这将是多么糟糕。

我不相信你会find一个导入工具,将为你做这个。 相反,你将不得不写一个脚本到ETL的电子表格文件。 我在Python中做了很多这样的事情(事实上,我今天正在这样做)。

确保您处理每个单元级别的exception,向用户报告哪个单元有意外的信息。 使用手工创build的电子表格可以保证您必须定期处理。

也就是说,如果这是以XLSX的forms出现的话,可能会开发一个XML转换,将其转换为更易处理的XML文档。

将其分解成多个Excel表单可能更有意义…一个用于产品,另一个用于维护项目,另一个用于维护任务。 对于每一个,他们将不得不input某种ID将它们连接在一起(例如:maintenance_task_id = 1链接到maintenance_item_id = 4)。 这对商业用户来说可能是一个痛苦的记忆,但唯一的select是为每一行input大量的冗余数据。

接下来,创build一个规范化的数据库模型(以避免存储冗余数据),并通过编写应用程序或脚本来parsingExcel表格来填充它。 模糊和高层次,但这就是我要做的。

我同意以前的职位一般…

我的build议 – 完全避免电子表格。 花时间做一个简单的前端表单 – 最好是一个基于Web的表单。 尽可能干净地收集数据(这里的任何东西都会比电子表格的清洁程度更好 – 包括只有命名字段)

你会花最less的时间。

我会将VBA代码添加到模板中,以便尽可能多地为用户数据input和validation添加结构和智能。

在这种极端的情况下,您可以让用户通过表单input所有数据,将所有validation数据放在工作表上,然后在“保存”或“closures”事件中创build一个全面的validation例程。
不太极端的是要添加3个驱动代码的命令button
– 添加产品
– 添加保养项目
– 添加维护任务
和一些整体validation码保存/closures
这样,您可以尽可能多地添加数据input任务。

使用命名单元格或由VBA代码创build的其他隐藏元数据作为标记,以便您的数据库更新例程可以更好地理解数据。

最后一个我喜欢这个,花了3-4个包括数据库更新例程在内,但是我认为这可能比你的例子更复杂。
但是如果你对VBA和Excel对象模型和事件没有经验,那么显然需要更长的时间。