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

时间:2011-11-18 20:31:52

标签: sql sql-server excel

我们有业务用户将产品信息输入excel电子表格。我的任务是想出一种将这些信息输入我们的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.......

因此,产品可以有0多个维护项目,维护项目可以有0个维护任务。这就是数据库的结构。我需要提出一个标准的Excel模板,我可以发送给我们的业务用户,这样他们就可以输入这些信息,然后弄清楚如何将它导出到sql server中。音量会很高,所以我需要让导入有点自动化。我该怎么做?

5 个答案:

答案 0 :(得分:7)

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

我无法相信我甚至建议这样做,但是你可以让他们使用简单的Access数据库吗?它甚至可以直接链接到SQL Server数据库并正确存储数据。通过使用Access表单,用户将发现添加和维护信息相对容易,与尝试以您描述的形式导入Excel数据相比,您遇到的问题要少得多。对于您的问题,这将是一个便宜得多且容易出错的解决方案。

你坚持使用这种格式,我发现这样做的最好方法就是将它导入到临时表中,将ID添加到每个下级行(最后可能会循环执行此操作)然后将信息拖出到关系登台表,然后导入到生产数据库中。

你可以使用SSIS创建所有这些,但它不会很容易,它不会很快,如果用户没有完全按照他们输入数据的方式受到纪律处分,那么它很容易出错(并且他们永远不会没有一套表格来填写)。确保完全拒绝Excel电子表格,如果它完全偏离规定的结构,则将其发送给用户。相信我。

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

答案 1 :(得分:2)

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

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

也就是说,如果这是作为XLSX发布的,那么可以开发XML转换以将其转换为更易处理的XML文档。

答案 2 :(得分:1)

将它分解为多个Excel工作表可能更有意义...一个用于产品,另一个用于维护项目,另一个用于维护任务。对于每一个,他们必须输入某种ID来将它们链接在一起(例如:maintenance_task_id = 1指向maintenance_item_id = 4的链接)。这可能是业务用户难以记住的痛苦,但唯一的选择是为每一行输入大量冗余数据。

接下来,创建一个规范化的数据库模型(以避免存储冗余数据)并通过编写应用程序或脚本来解析它来解析Excel工作表。模糊和高级,但这就是我的方式。

答案 3 :(得分:1)

我同意以前的帖子......

我的建议 - 完全避开电子表格。花时间制作一个简单的前端表单 - 最好是基于Web的表单。尽可能干净地捕获数据(这里的任何东西都比电子表格清洁度更好。 - 包括只有命名字段)

你最终会花更少的时间。

答案 4 :(得分:1)

我会在模板中添加VBA代码,以便为用户数据输入和验证添加尽可能多的结构和智能。

在极端情况下,您可以让用户通过表格输入所有数据,将所有经过验证的数据放在工作表上,然后在保存或关闭事件中内置整体验证程序。
不太极端的是增加3个命令按钮驱动代码 - 添加产品
- 添加保养项目
- 添加维护任务
保存/关闭时的一些整体验证代码
这样,您可以为数据输入任务添加尽可能多的智能。

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

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