从excel导入到Sql Server

时间:2013-07-13 01:30:30

标签: asp.net sql-server ssis bulkinsert sqlbulkcopy

我有一项任务是将Excel数据导入Sql server。 excel数据来自excel模板。有不同的excel模板可用于不同的cleint,因此excel中的列在所有模板中都不相同。必须将数据导入到SQl的一个公共表中。

我用Google搜索了网上有很多样本,但我无法确定哪种方法最好。

我可以请你指导我如何实现上述考虑模板的动态列。

在excel模板中,开始行和结束行不是固定的。

4 个答案:

答案 0 :(得分:10)

SSIS

Data Flow Task是在SSIS包中移动数据的主要任务,它与源提供程序的元数据紧密绑定。如果一个源具有string,int,string,并且next具有字符串,字符串,字符串,字符串,则对于同一数据流中的该工作,元数据将变得太不同。当可以将整数数据强制转换为字符串时,无法克服列数的差异。

在您的情况下,除非您将非常复杂的业务逻辑应用于来自这些电子表格的数据到统一表中,否则我可能会设计N + 1个包。您将收到的每种可能的Excel格式的包。我假设有一些逻辑可以确定文件来自哪个模板(ClientAV1.xlsx,ClientBV2.xlsx等)。这些包将具有Excel源到OLE DB目标的数据流。最终的包将是父/控制器/主包。它将根据可用文件处理其他包的协调。

C#

由于您已经标记了asp.net,我假设您也可以使用.NET方法。在这个answer中,我介绍了如何在.NET中读取Excel文件,当我将其提供给SSIS数据流时,没有什么能阻止您发出批量命令将数据加载到SQL Server中。

答案 1 :(得分:1)

SSIS中的动态列映射非常棘手,您不必担心列映射的最简单方法是使用Openrowset选项将数据从Excel文件导入到sql文件。您可以将其用作命令并将其添加到“执行SQL任务:

”中
 SELECT * INTO <TableName> FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=C:\Filename.xls', 'SELECT * FROM [Sheet$]')

答案 2 :(得分:0)

如果您不介意使用订阅模式上许可的付费第三方SSIS组件,请仔细查看DataDefractor SSIS。一旦掌握了它,您就可以开发一个软件包,在一天内导入除最复杂和格式最复杂的Excel工作簿之外的所有内容,包括测试。

另一种方法是编写需要数天或数周才能开发和测试的代码。这一切都取决于你的雇主的时间价值。

此组件的问题是,当许可证到期时,它将停止工作,因此您需要使许可证保持最新状态。他们拥有永久许可证,他们没有做广告,但是IIRC,它的价格大约相当于20或30年的订阅。

答案 3 :(得分:0)