这个问题很啰嗦,因为我很长时间以来一直在更新这个问题,试图让 SSIS 正确导出 Excel 数据。 我设法解决了这个问题,虽然不正确。除了有人提供正确答案之外,这个问题中列出的解决方案并不可怕。
我找到的唯一答案是为我的列创建一个足够宽的名为 range 的单行。在命名范围内放置样本数据并将其隐藏。 SSIS 附加数据并从单行读取元数据(足够接近它可以将内容放入其中)。 数据采用隐藏单行的格式。 这允许标题等。
哇,屁股好痛。需要 450 多天的出口才能弥补损失的时间。但是,我仍然喜欢 SSIS 并将继续使用它,因为它仍然比 Filemaker LOL 好得多。我的下一次尝试将在报表服务器中做同样的事情。
原始问题说明:
如果您在 Sql Server Integrations Services 设计器中,并且想要将数据导出到 Excel 文件,而不是从第一行开始,比如说第四行,您如何指定?
我尝试进入数据流的 Excel 目标,将 AccessMode 从变量更改为 OpenRowSet,然后将变量设置为“YPlatters$A4:I20000”这失败了,说它找不到工作表。该表称为 YPlatters。
我以为你可以指定 (Sheet$)(Starting Cell):(Ending Cell)?
更新
显然,在 Excel 中,您可以选择一组单元格并使用名称框命名它们。这允许您选择名称而不是不带 $ 美元符号的工作表。奇怪的是,无论您指定什么范围,它都会将数据附加到范围之后的下一行。奇怪的是,当您添加数据时,它会增加命名选择的行数。
另一个奇怪的事情是数据采用指定范围的最后一行的格式。我的标题行是粗体的。如果我指定以标题行结尾的范围,则数据将附加到下面的行,并使所有条目变为粗体。如果您指定低一行,它会在标题行和数据之间放置一个空白行,但数据不是粗体。
另一个更新
无论我尝试什么,SSIS 都会对文件的“第一行”进行采样,并根据找到的内容设置元数据。但是,如果您的样本数据的值为零但被格式化为第一行,它会将该列视为文本并插入前面带有单引号的数值 ('123.34)。我还尝试了不反映列数据类型的标题。我尝试更改 Excel 目标的元数据,但它总是在我运行项目时将其更改回来,然后失败说它会截断数据。如果我告诉它忽略错误,它会导入除该列之外的所有内容。
几天几小时后...
另一个更新
我尝试了每一种组合。一个最有效的示例是创建从列标题开始的命名范围。格式化列标题,因为您希望数据看起来像数据采用这种格式。在我的示例中,这些存在于 A4 到 E4 之间,这是我定义的范围。SSIS 追加到定义范围之后的行,因此定义 A4 到 E68 追加从 A69 开始的行。您将 Connection 定义为第一行包含字段名称。它采用标题行的元数据,奇怪的是,不是第二行,它猜测数据类型,而不是列的格式化数据类型,即标题是文本,所以我所有的元数据都是文本。如果您的标题是粗体的,那么您的所有数据也是如此。
我什至尝试制作示例数据行但没有成功......我认为没有人真正使用 Excel 和默认的 MS SSIS 导出。
如果您可以定义没有标题行的“插入范围”(A5 到 E5)并格式化这些列(货币、非粗体等)而不在 Excel 中跳过一行,这将非常有帮助。据我所知,没有人在没有第三方连接管理器的情况下使用 SSIS 导出 Excel。
关于如何正确设置以便正确格式化数据的任何想法,即从 Excel 读取的元数据适用于真实数据,并且格式继承自第一行数据,而不是 Excel 中的标题?
最后一次更新(2009 年 7 月 17 日)
我让它工作得很好。我添加到 Excel 中的一件事是 Excel 连接字符串中的 IMEX=1:“Excel 8.0;HDR=Yes;IMEX=1”。这迫使 Excel(我认为)查看所有行以查看其中的数据类型。通常,这不会删除信息,例如,如果您有一个邮政编码,那么您有一个 zip+4 的大约 9 行,没有这个的 Excel 会完全空白该字段而不会出错。当 IMEX=1 时,它识别 Zip 实际上是一个字符字段而不是数字。
当然,还有一次更新(2009 年 8 月 27 日)
IMEX=1 将成功导入前 8 行中缺少内容的数据,但将无法导出不存在数据的数据。所以,把它放在你的导入连接字符串上,而不是你的导出 Excel 连接字符串上。
我不得不说,经过这么多的摆弄,它工作得很好。
PS 如果您使用的是 x64 位版本,请确保从 C:\Program Files\Microsoft SQL Server\90\DTS.x86\Binn 调用 DTExec。它将加载 32 位 Excel 驱动程序并正常工作。