将表的内容导出到不同的EXCEL文件和不同的工作表

时间:2015-12-22 07:37:14

标签: sql tsql ssis sql-server-2012

我有一张包含以下内容的平面表:

Categorie  | Series | Productdetails
    A         A.001    1
    A         A.001    2
    A         A.001    3
    A         A.002    1
    A         A.002    2
    B         A.002    1    
    C         A.003    1
    C         A.006    2
    C         A.008    3

所以我们的类别有多个系列,有多个产品。 Productdetails由277列组成......真的:(

我想将此数据导出到Excel,但我要求每个类别提供一个excel文件,每个系列包含工作表,其中包含该系列的所有产品。

在上面的示例中,将导致3个excel文件:A.xlsx,B.xlsx和C.xlsx。

  • 文件A.xlsx将包含2个工作表(001和002)。
  • 001将包含3条记录,002将包含2条记录。
  • 文件B.xlsx将包含1个工作表(002)。
  • 002将包含1条记录。
  • 文件C.xlsx将包含3个工作表(003,006和008)。
  • 每个包含1条记录。

解决这个问题的最佳方法是什么?大约有12个类别,总共约200个系列,包含最小1和最多14.000个产品。

Greetz Henrov

2 个答案:

答案 0 :(得分:1)

通过此查询,您可以获得平面表格以及文件的名称和工作表的名称(填充为3位数字)。

0

这样的查询可以为您提供所需的计数:

SELECT tbl.Categorie + '.xlsx' AS ExcelFile
      ,REPLACE(STR(DENSE_RANK() OVER(PARTITION BY tbl.Categorie ORDER BY tbl.Categorie,tbl.Series),3),' ','0') AS ExcelSheetPadded 
      ,tbl.*
FROM @tbl AS tbl

使用SELECT tbl.Categorie + '.xlsx' AS ExcelFile ,COUNT(*) AS CountPerSheet FROM @tbl AS tbl GROUP BY tbl.Categorie,tbl.Series 等。它应该很容易获得你需要的所有信息。

您还需要任何进一步的帮助吗?

答案 1 :(得分:1)

你让我把我的评论写成答案......

安装Excel并告诉Excel从外部源导入数据。助理将引导您创建ODC连接。这真的很容易。结果,您将找到用于打开连接的连接字符串。

此讨论为您提供some VBA

在VBA首先,您为SELECT工作表名称调用DISTINCT。把它们放在一个数组中。

比遍历此数组并使用SELECT始终使用WHERE SheetName='YourSheetName'来检索一个特殊文件所需的数据。

比使用Set wb=Workbooks.Add()创建一个带有实际文件名的新工作簿(首先声明变量!)来获取引用。

使用Set ws=wb.Worksheets.Add()根据DISTINCT工作表名称列表创建工作表。然后填写表格并保存。如果您需要更多帮助,请致电..

代码大致应该是这样的:

Dim wb As Workbook
Dim ws As Worksheet

'Open connection and fill a Recordset with the distinct filenames

'Do this in a loop for all distinct file names
Set wb = Workbooks.Add()
wb.Name = "YourNameFromDistinctList"

    'Fill another Recordset with the distinct sheet names for each workbook

    'Do this in a loop for all distinct file names for each workbook
    Set ws = wb.Worksheets.Add()
    ws.Name = "YourSheetName"

    'Fill Sheet with data
    'either use ws.ListObjects
    'or traverse through ws.Cells

    Set ws = Nothing

wb.SaveAs "YourNameFromDistinctList"
Set wb = Nothing