自动通过SSIS生成的Excel中创建图表?

时间:2014-07-31 08:28:12

标签: sql-server excel excel-vba reporting-services ssis vba

我有以下要求,

早上9点运行的SQL Server 2008预定作业。此作业应发送包含工作簿(工作簿1)中的数据的电子表格和下一个工作簿(工作簿2)中附带的图表。数据必须具有SQL表中的值。图表必须反映工作簿中的值1。此表应邮寄给n个用户。 n个用户甚至不知道sql server,也不知道服务器的用户名和密码。他们必须只有两个工作簿的电子表格。

我决定做以下

1)创建一个将数据格式化为表格的存储过程2)调用SSIS,将数据复制到excel的workbook1中3)在同一个excel的工作簿2中创建图形

第1点和第2点,我已经完成了。

在活动1和2之后,我将在excel中有类似下面的内容

Workbook1:

Date | Column A | Column B | Column C |

10-7-14 | 0983883 | 09433344 | 4443333 |

11-7-14 | 0986444 | 06875544 | 4689073 |

我无法进行活动3.活动3必须接受上表中的值并在workbook2中创建图表

我知道可以使用SSRS完成,但我想了解其他方法,因为我们只有SSIS和SSRS完全超出范围。由于某些原因,SSRS仅限于在我们的系统中使用。

我尝试了各种方法来做到这一点。 (在SSIS的Excel模板的工作簿2中创建了一个动态图形,让传递给工作簿1的值渲染图形,但它不能令人遗憾地工作。)。我无法使用我提供给SSIS的空Excel模板创建动态图表。

Excel是这里的问题,它不允许任何预定义的图形。它总是期望一个值来创建图形。

我也可以选择VBA宏选项,(比如创建一个按钮,让用户点击按钮生成图形),但我不确定它是否可行?

Excel专家请帮忙!

我可能听起来像一个业余爱好者,但请原谅我,因为我是SSIS的新手,没有一个同事知道如何做到这一点,我无法得到任何与我所做的研究,这有点但令人沮丧。

2 个答案:

答案 0 :(得分:0)

我做了类似的工作但是使用excel作为SSAS的前端但是sql server的概念类似。

听起来你会发现excel中的数据透视表很有用。这是因为excels根据数据透视表的结果动态呈现图表 请注意,数据透视表允许过滤,这意味着用户可以过滤掉他们不需要的部分数据。或者,如果用户想要改变图表的外观,例如按月销售而非按季度销售,这对他们来说非常容易。所以基本上结果的演示文稿是在excel中动态完成的。

要根据外部数据创建一个,请执行以下操作:  数据 - >来自其他来源 虽然您可能希望将结果集限制为用于报告的小型只读表,但excel可以查询sql server。 请注意,数据源信息保存在文件中,excel可以使用硬编码的用户名和密码或窗口的域登录。理想情况下,您希望使用域登录而不是通用用户名和密码

因此解决方案变得更像以下内容:

  1. SP或SSIS填充表以供excel查询。这意味着excel只是编写简单的选择和分组编组
  2. 使用数据 - >来自其他来源 - >来自SQL Server
  3. 创建库存数据透视表,用于处理数据的显示
  4. 将文件提供给用户。该文件将包含已定义的数据源
  5. 然后他们只是点击刷新,它会重新查询服务器的结果。
  6. 用户可以拖放字段,更新数据透视表并重新绘制Excel图表
  7. 唯一的缺点是用户只能看到当前数据集的副本。

答案 1 :(得分:0)

由于我不了解您的工作簿结构的细节,您可能需要调整以下vba代码(因为子名称建议将其放在工作簿的Open事件中):

Private Sub Workbook_Open()

Dim wb As Workbook
Dim ws As Worksheet
Dim ws2 As Worksheet
Dim LastRow As Long
Dim LastColumn As Long
Dim LastColumnLetter As String

Set wb = ThisWorkbook
Set ws = wb.Worksheets("Sheet1")
Set ws2 = wb.Worksheets("Sheet2")

Application.ScreenUpdating = False

LastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row
LastColumn = ws.Cells(2, Columns.Count).End(xlToLeft).Column
LastColumnLetter = Chr(LastColumn + 64)

ws2.Activate

ws2.ChartObjects("Chart 1").Activate
ActiveChart.SetSourceData Source:=ws.Range("A1:" & LastColumnLetter & LastRow)

ws2.Range("A1").Select

Application.ScreenUpdating = True

End Sub

此代码在打开工作簿并首先尝试查找数据表占用的范围时执行,然后更新图表的数据源。我假设你的数据在Sheet1中并从单元格A1开始,而你的图表(图1)在Sheet2中。