【问题标题】:Excel cells with date values not importing properly via SSIS日期值无法通过 SSIS 正确导入的 Excel 单元格
【发布时间】:2011-10-14 18:40:40
【问题描述】:

我有一个由外部自动化过程生成的 Excel '97 电子表格,我想通过 SSIS 将其导入 SQL [2008 R2] 表中。我正在导入的列包含某些单元格中的文本值和其他单元格中的日期值。为了连接到 Excel 数据,我有一个“Excel Source”数据流源,其中 OpenRowset 属性已设置为特定的列范围:Sheet1$A1:A100。我在 Excel 源代码之后直接添加了一个网格数据查看器,以便我可以查看“原始”结果。

执行包时,我查看数据查看器结果,所有包含日期​​的单元格都显示为 NULL。奇怪的是,文本字段和数字字段可以正常显示并在数据查看器中正确显示。如果我在日期值前面放一个单引号(撇号),以便将日期视为文本,则它会正确导入。如果我右键单击 Excel 中的某个日期字段并转到“设置单元格格式...”,它们都会显示为“日期”。

这些 Excel 文件是由我无法控制的进程自动生成的,我无法手动编辑每个文件以使它们正确导入。在 Excel 源的外部列部分中,该列显示为“Unicode 字符串 [DT_WSTR]”的数据类型,所以我认为它只会将其作为文本导入。

对于如何正确导入这些日期值的任何建议,我将不胜感激。提前谢谢!

【问题讨论】:

  • 您说您的列包含文本和日期值的混合,并且该列正在作为“字符串”导入。由于日期以数值形式存储在 Excel 中(并且仅显示为文本),因此可能这就是您的日期为空的原因。一个好的开始是至少让您的列数据类型保持一致。
  • 听起来问题出在创建 excel 文档的任何进程上。这些值是什么格式的?复制并粘贴该过程为您启动的值的示例,以便我们可以看到它是如何将它们写入 excel 文件的。

标签: sql-server-2008 excel ssis


【解决方案1】:

我不知道在 SSIS 中是否有处理这种情况的“好”方法,但我能想到一些或多或少丑陋的想法。为了增加hackiness:

  1. 请向您提供这些文件的人使用对数据库更友好的格式(而不是列的数据类型逐行更改的格式)。
  2. 如果您提前知道哪些行将包含文本,哪些行将包含日期,您可以尝试多次打开电子表格,每次更改范围以使数据类型保持一致。
  3. 您可以在 Excel 中手动打开电子表格并将其保存为文本文件;然后将文本文件提供给您的 SSIS 包。所有日期都将转换为文本(基于您的语言环境)。
  4. 您可以编写一个 Windows 脚本以在 Excel 中打开电子表格并将其保存为文本文件,然后将该文本文件提供给您的 SSIS 包。
  5. 您可以编写一个 SSIS 脚本任务,该任务使用 Excel 自动化模型打开电子表格并以任何适当的方式处理每个单元格。
  6. 您可以使用自己的 Excel 连接管理器,该管理器可以配置为将特定范围内的所有单元格视为文本。 (嗯。这可能已经超越了黑客攻击并进入了牦牛剃须。)

我认为 #1 是最好的长期解决方案,但听起来不会很快发生。也就是说,将电子表格保存为文本至少会使 SSIS 可以轻松处理它,这可能足以克服眼前的障碍。

【讨论】:

  • 首先,感谢所有伟大的 cmets 和建议。最后,我找到了一篇文章,详细介绍了它如何查看前 8 个字符来确定数据类型 stackoverflow.com/questions/4737656/sql-ssis-convert-question>。为了解决这个问题,我在连接字符串的末尾添加了“IMEX=1”文本 - 请参阅 support.microsoft.com/kb/194124 。一旦我这样做了,它就正确地导入了日期字段。同样,我不能从我的客户那里更改这个 Excel 文档的格式,所以我不得不以这种方式处理它。再次感谢!
  • 不客气 - 感谢提供指向 IMEX=1 提示的指针!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多