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

Export contents of table to different EXCEL files and different worksheets

我有一套公寓 table,其中包含以下内容:

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.

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

Greetz Henrov

通过此查询,您将获得您的公寓 table 以及文件名和 sheet 的名称(填充为 3 位数字)。

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

DISTINCT等。应该很容易获得您需要的所有信息。

您需要进一步的帮助吗?

你让我把我的评论变成一个答案...

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

这个讨论给你some VBA

在 VBA 中,首先您为 DISTINCT sheet-名称调用 SELECT。将它们放在一个数组中。

比起你遍历这个数组并始终使用相同的 SELECTWHERE SheetName='YourSheetName' 来只检索一个特殊文件所需的数据。

比你用Set wb=Workbooks.Add()用实际文件名创建一个新的工作簿(首先声明变量!)来获得参考。

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

代码大概是这样的:

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