在数据流任务之前确定Excel电子表格格式

时间:2012-12-12 21:41:12

标签: ssis

我正在开发一个SSIS包,它使用for循环遍历目录中的excel文件和数据流任务来导入它们。

我遇到的问题是我正在与之合作的项目经理认为用户不会总是遵循这种结构。因此,如果文件位于文件夹中,并且程序包尝试导入该文件但电子表格缺少列,或者具有额外的列,则会生成并且当然会出错。即使我的任务设置不会使包失败;包确实失败了,然后导入其他文件。

所以,我想知道确定电子表格格式不正确的最简单方法是什么,或者阻止错误导致程序包执行失败?在执行完所述步骤之后,我将使用文件复制任务将文件移动到“Failure”文件夹。然后继续处理电子表格。

3 个答案:

答案 0 :(得分:2)

我有一个类似于你的SSIS包,除了它迭代Microsoft Project文件列表并将记录导入数据库。在Foreach循环容器中,它首先执行检查以查看文件是否存在。我正在向脚本传递FileName的字符串变量和boolean变量bolFileExists。我知道您正在寻求验证文件是否格式正确并且我猜您可以应用类似于以下脚本任务代码的内容:

    public void Main()
    {
        if (File.Exists(Dts.Variables["FileName"].Value.ToString()) )
        {
            Dts.Variables["bolFileExists"].Value = true;
        }
        else
        {
            Dts.Variables["bolFileExists"].Value = false;
        }
    }

这将导致两条路径。第一个将应用表达式“@ bolFileExists == True”,然后执行导入过程。另一个将应用表达式“@ bolFileExists == False”并跳过该文件并允许处理以下文件。在我的桌面驱动的SSIS包中,对于这两个选项,导入状态在列出正在导入的文件的表中定义。我有近40个导入的文件,这允许我运行查询以确定是否遗漏了任何文件,并将该查询应用于流程完成后发送的自动电子邮件中。

对于不正确的格式化,我的第一个建议是为用户提供一个模板,以跟随其中一个工作表中的说明。之后,您可以尝试应用临时表或SQL来收集感兴趣的工作表中包含的列表或列数。您在此处采用的方法取决于所提取信息的复杂程度。再次在我的SSIS包中,数据在导入后仍然可以关闭。在这种情况下,我首先导入一个临时的临时表,在该临时表中执行检查,然后只使用符合感兴趣标准的表,使用MERGE将其标准化为最终的排序表。

如果您有任何疑问,请与我们联系。希望这有助于解决部分问题。

答案 1 :(得分:0)

SO上有35篇文章,其中引用了底层数据库模式: https://stackoverflow.com/search?q=GetOleDbSchemaTable

尝试使用模式检测步骤来丰富Kosh的脚本,在该步骤中,您将使用与XLS文件的基础连接作为OleDB源。提取字段列表后,您可以验证是否所有必填字段都以正确的顺序出现。

答案 2 :(得分:0)

如果您正在讨论验证列等的准确性,您可以使用脚本任务打开excel文件并查看每列以验证内容是否正确。这可以使用OpenXML或InterOp.Office引用来完成。

如果你在谈论excel版本,你可以有一个脚本任务来查看文件的扩展名(虽然如果他们重命名文件,这确实无济于事。)