想使用 ssis 将 excel 文件数据插入表中 - 格式问题
Posted
技术标签:
【中文标题】想使用 ssis 将 excel 文件数据插入表中 - 格式问题【英文标题】:Want to insert excel file data into table using ssis - format problem 【发布时间】:2011-09-16 15:13:22 【问题描述】:我创建了一个 SSIS 包,我使用“excel 源”获取 excel 文件,但我的问题是我需要从 excel 文件中获取 B7 值并将其插入数据库表中,请帮助,因为
B7 值由表达式生成:=MAX($B$32:C284)
嗨,我想取 date
的值,即 '8/26/2011'
和 NAV
的值,即 '93737452.52'
并想插入到表中,我正在使用'excel source '
来连接 excel 文件,现在选择 'Data access mode'
in 'Excel source editor'
as 'SQL command'
现在我需要编写什么命令来获取'date'
和'NAV'
value,因为我已经粘贴了 excel 文件的图片,请让我知道进一步的步骤。
【问题讨论】:
您应该将 B7 设为命名范围,然后它将作为数据源上的另一个表提供 我试过 select B7 from FROM [Sheet1$] 但它不工作请详细说明示例或任何线程:( 【参考方案1】:由于您只需要电子表格中的 2 个非常具体的单元格值,因此我建议使用 脚本组件 仅从这些单元格中获取值,而不是使用 Excel 源。 Excel Source 真的是用来获取一堆布局一致的行和列,而不是用来挑选单个单元格。
为此,首先从工具箱的数据流转换部分拖动一个脚本组件。出现选择脚本组件类型对话框时,选中第一个选项“Source”。
接下来,编辑此脚本组件并从最左侧的列中选择 Inputs & Outputs,然后添加您需要的 2 个输出列,并为每个列设置正确的数据类型。
然后单击“脚本”选项,选择您的语言(在本例中我选择了 Visual Basic 2008),然后单击编辑脚本按钮。
当 IDE 启动时,添加对 Microsoft.Office.Interop.Excel
的引用,并在脚本顶部为此添加 Imports 语句。然后在CreateNewOutputRows
例程中,获取对您的工作簿和工作表的引用,并使用AddRow()
方法从您想要的特定单元格中输出值。从下面的代码中可以看出,我直接从单元格 b7 和 c7 中获取值并将它们转换为正确的类型。
保存您的脚本并退出 IDE,您现在可以将此脚本组件用作数据库插入的源代码:
脚本将只从您指定的单元格中读取您想要的 2 个值,并将它们提供给数据流目标。
虽然这看起来比在数据流中放置 Excel 源要多得多,但它为您提供了更多的灵活性和控制力。
【讨论】:
【参考方案2】:如果您拥有的文件可以修改,您可以为单元格命名B7
和D7
(例如,您可以选择名称“日期”和“导航”)。为此,您需要右键单击单元格,然后单击“命名范围”。
完成此操作后,您可以选择这些名称(“日期”和“NAV”),就像它们是 Excel 文件的表格一样。因此,您可以使用select * from FROM [Date$]
,或者如果您将数据访问模式选择为“表格或视图”,则可以作为另一张工作表使用。
【讨论】:
+1 比我提出的解决方案简单得多。但是你需要“日期”之后的 $ 吗?查询不应该是SELECT * FROM [Date]
吗?
@PaulStock - 我认为你是对的,应该只是select * from [Date]
;但我不在安装了 SSIS 的计算机上,所以我真的不记得查询该范围的正确方法。无论如何,op 应该意识到这一点并尝试您的方式,谢谢!【参考方案3】:
如果文件的格式不固定(即前导空白行/列),那么我建议您将列名合并到一个字段中并删除空白元素以简化 SSIS。
如果文件必须保持现有格式,请将 Excel 源对象中的数据访问模式更改为 SQL 命令,然后使用类似于以下内容的内容排除空行;
SELECT F2, F3
FROM [Sheet1$]
WHERE (F2 IS NOT NULL) AND (F2 <> 'USD P&L' and F2 <> 'Date')
您必须使用数据转换控件来理解生成的数据类型。
【讨论】:
谢谢!我已经搜索并获得了excel source
的OpenRowset()
属性,用于跳过行:)【参考方案4】:
能否强制 Excel 保存为 SaveAs() 并选择 .csv 格式?
我相信这只会保存价值。
【讨论】:
以上是关于想使用 ssis 将 excel 文件数据插入表中 - 格式问题的主要内容,如果未能解决你的问题,请参考以下文章