【问题标题】:Export contents of table to different EXCEL files and different worksheets将表格内容导出到不同的EXCEL文件和不同的工作表
【发布时间】:2016-03-28 09:55:12
【问题描述】:

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

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 个产品。

格雷茨·亨罗夫

【问题讨论】:

  • 您有哪些编码经验?您想在哪里解决这个问题(在 Excel 中,使用 VBA)?
  • 我相当精通 SSIS、TSQL。我更喜欢在 SSIS 中执行此操作,TSQL 中的解决方案会更好。我可以阅读大多数编程语言,所以在 SSIS 中进行一些编程就可以了。

标签: sql tsql ssis sql-server-2012


【解决方案1】:

你让我把我的 cmets 放到一个答案中......

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

这个讨论给你some VBA

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

然后您遍历此数组并始终使用相同的SELECTWHERE 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

【讨论】:

    【解决方案2】:

    通过此查询,您将获得平面表格以及文件名和工作表名称(填充为 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。
    • @Henrov 好的,我不清楚你卡在哪里了。我会在 Excel 中使用 VBA。如果这对你来说是可能的,我可以稍后为你准备一些代码。
    • 那太好了,但是,在执行这项工作的机器上(尚未)安装 Excel。只是 AccessDatapack。但我会尝试在那台机器上取得优异成绩。我花了数年时间在 Access('97 - 2000)中构建东西,所以再次使用 VBA 会很有趣!你可以给我发一些代码吗?那太好了。
    • @Henrov,嗨,抱歉回复晚了...圣诞节,家人... :-) 这仍然是一个悬而未决的问题吗?只是一个简短的提示:如果您安装 Excel 并告诉 Excel 从外部源导入数据,助手将引导您创建 ODC 连接。这真的很容易。结果,您将找到用于打开连接的连接字符串。这个讨论给你一些 VBA:mrexcel.com/forum/excel-questions/…
    • @Henrov 首先,您为 DISTINCT 工作表名称调用 SELECT。将它们放在一个数组中。比您遍历此数组并始终使用带有 WHERE SheetName='YourSheetName' 的相同 SELECT 来仅检索一个特殊文件所需的数据。比您使用Workbooks.Add() 创建一个具有实际文件名的新工作簿并使用Set wb=Workbooks.Add(...)(首先声明变量!)获取参考。使用 Set ws=wb.Worksheets.Add() 根据 DISTINCT 工作表名称列表创建工作表。然后填写表格并保存。如果您需要更多帮助,请致电...
    猜你喜欢
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多