5

这个问题很啰嗦,因为我很长时间以来一直在更新这个问题,试图让 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 驱动程序并正常工作。

4

8 回答 8

3

在脚本任务中创建 Excel 工作簿,然后稍后在流程中选择它会更容易吗?

SSIS 的引擎部分很好,但与 Excel 的集成很糟糕

“将 SSIS 与 Excel 结合使用就像将热焦油倒入路锥中的 iHole”

于 2009-04-17T07:42:52.783 回答
2

Zim 博士,我相信您是最初提出这个问题的人。我完全感受到你的痛苦。我总体上喜欢 SSIS,但我绝对讨厌 Excel 标准的有限工具。我想要做的只是在 Excel 中加粗标题或第 1 行记录,而不是加粗以下记录。我还没有找到一个很好的方法来做到这一点;授予我在没有脚本任务或自定义扩展的情况下处理此问题,但是您会认为这种简单的事情将是标准选项。看起来我可能被迫研究和编写一些花哨的东西来完成一项应该如此基础的任务。我自己已经为此花费了大量时间。有谁知道您是否可以将 Excel XML 与 Excel 版本一起使用:2000/XP/2003?谢谢。

于 2009-05-11T14:38:29.913 回答
2

这是一个旧线程,但是如何使用平面文件连接并将数据作为格式化的 html 文档写入。将页眉中的 mime 类型设置为“application/excel”。当您将文档作为附件发送并且收件人打开附件时,它将打开一个浏览器会话,但应在其顶部弹出 Excel,其中包含根据页面中指定的样式 (CSS) 格式化的数据。

于 2011-04-14T13:53:36.940 回答
1

您是否可以让 SSIS 将数据从 A1 开始写入 Excel 工作表,然后创建另一个工作表,按您喜欢的格式设置,引用 A1 处的另一个工作表,但将其显示为 A4?也就是说,在“漂亮”表上,A4 将引用 SSIS 表上的 A1。

这将允许 SSIS 做它有益的事情(操作基于表格的数据),但允许您根据需要对 Excel 进行格式化或操作。

于 2009-04-20T16:06:08.913 回答
1

当 excel 是 SSIS 中的目标或 SSRS 中的目标导出类型时,您对格式和指定最终文件的格式没有太多控制权。我曾经为 SSRS 编写过一个自定义的 excel 渲染引擎,因为我的客户对生成的最终 Excel 报告的格式非常严格。我使用“Excel xml”在我的自定义渲染器中完成工作。也许您可以使用 XML 输出并使用 XSLT 将其转换为 Excel XML。

于 2009-04-23T16:15:12.380 回答
1

我了解您不希望使用脚本组件,因此也许您可以使用脚本包含的代码创建自己的自定义任务,以便其他人将来可以使用它。在这里查看一个例子。

如果这看起来可行,我使用的解决方案是CarlosAg Excel Xml Writer Library。有了这个,您可以创建类似于使用 Interop 库但生成 xml 格式的 excel 的代码。这避免了使用有时会导致 excel 进程挂起的 Interop 对象。

于 2009-04-24T06:53:03.877 回答
1

与其使用迂回的方式来尝试将数据写入特定单元格、格式化单元格、设置样式,考虑到 SSIS 对 EXCEL 的支持,这确实是一项非常乏味的工作,我们可以去“模板”的方式来做到这一点。

假设我们需要在 so & so 单元格中写入数据,并在其上完成所有自定义格式。将所有格式设置在工作表中,例如“SheetActual”,而保存数据的单元格实际上将具有查找/引用/公式来引用 SSIS 在隐藏工作表中导出的原始数据,例如相同 Excel 的“SheetMasterHidden”联系。这个“SheetMasterHidden”本质上将以 SSIS 将数据写入 excel 的默认格式保存主数据。这样您就不必担心格式化数据运行时。

格式化 Excel 是一次性工作“如果”格式不经常更改。如果格式发生变化并且格式在运行时被确定,那么这个解决方案可能不会很顺利。

于 2010-06-23T10:39:31.730 回答
0

答案就在问题中。随着时间的推移,它变成了一种进步状态。但是,如果您创建 TABLE 演示文稿,SSRS 将创建 Excel 文件。它也很好用。

于 2009-09-23T03:24:57.033 回答