使用Powershell直接从SQL透视表

时间:2019-03-29 15:26:21

标签: powershell pivot-table

我使用在网上找到的Powershell脚本(如下所示)的组合来创建具有数据透视表的Excel文档。但是,我仅找到一些示例,其中数据透视表的数据源是已经通过CSV或其他类似方法导入到excel文档中的数据。我可以让他们工作。但是,我的问题是我想绕过将.csv数据加载到excel然后创建数据透视表的步骤...我的整个问题是我的数据集对于excel太大了...所以我想创建数据透视表直接来自SQL连接。我无法找出正确的语法来设置数据源。以下是我最接近的尝试...应该对数据源使用“ xlExternal”吗?但是我该如何设置数据源呢? Micorsoft的文档/ API很有帮助,但是它们的示例都是用VB编写的,它们还使用了VB甚至不熟悉的其他方法,因此我很难翻译QueryTables.Add方法和其他一些方法。

我相信我只能坚持的1或2行是

$qt = $ws.QueryTables.Add("ODBC;DSN=$connectionString", $ws.Range("A1"), 
$SQL) 

和/或这个:

$PivotTable = 
$wb.PivotCaches().Create($xlExternal,$selection,$xlPivotTableVersion10)

但是我的代码在这一行给出了例外:

$PivotTable.CreatePivotTable("R1C1","Tables1") | Out-Null 

错误提示:

Exception from HRESULT: 0x800A03EC
At C:\Users\me\Desktop\NEWpsCode.ps1:107 char:1
+ $PivotTable.CreatePivotTable("R1C1","Tables1") | Out-Null
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : OperationStopped: (:) [], COMException
+ FullyQualifiedErrorId : System.Runtime.InteropServices.COMException

所以,这是我的代码:

$DirectoryToSaveTo='C:\Users\me\Desktop\'
$Filename='myfile' 

$ServerName = "BLAH1"
$DatabaseName = "BLAH2"
$userName = "BLAH3"
$password = "BLAH4"

$connectionString = "Server = $ServerName; Database = $DatabaseName; User ID 
= $userName; Password = $password;"
$sqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$connectionString
$sqlConnection.Open()

$xlCenter=-4108 
$xlTop=-4160 
$xlOpenXMLWorkbook=[int]51 

$SQL=@" 
SELECT Account1,Account2,Account3 from myTable
"@ 

$excel = New-Object -Com Excel.Application #open a new instance of Excel 
$excel.Visible = $True
$wb = $Excel.Workbooks.Add() 
$currentWorksheet=1 
  if ($currentWorksheet-lt 4)  
  { 
    $ws = $wb.Worksheets.Item($currentWorksheet) 
  } 
  else   
  { 
    $ws = $wb.Worksheets.Add() 
  }
 $currentWorksheet += 1 

$qt = $ws.QueryTables.Add("ODBC;DSN=$connectionString", $ws.Range("A1"), 
$SQL) 

$xlPivotTableVersion12     = 3
$xlPivotTableVersion10     = 1
$xlCount                 = -4112
$xlDescending             = 2
$xlDatabase                = 1
$xlExternal     = 2
$xlHidden                  = 0
$xlRowField                = 1
$xlColumnField             = 2
$xlPageField               = 3
$xlDataField               = 4    
$xlDirection        = [Microsoft.Office.Interop.Excel.XLDirection]


$range1=$ws.range("A1")
$range1=$ws.range($range1,$range1.End($xlDirection::xlDown))
$range2=$ws.range("B1")
$range2=$ws.range($range2,$range2.End($xlDirection::xlDown))

$selection = $ws.range($range1, $range2)
$PivotTable = 
$wb.PivotCaches().Create($xlExternal,$selection,$xlPivotTableVersion10)
$PivotTable.CreatePivotTable("R1C1","Tables1") | Out-Null 


$filename = "$DirectoryToSaveTo$filename.xlsx"
if (test-path $filename ) { rm $filename } 
$wb.SaveAs($filename,  $xlOpenXMLWorkbook)
$wb.Saved = $True 
$wb.Close() 
$Excel.Quit() 
$wb = $Null 
$ws = $Null 
$Excel=$Null 

因此,如果有人可以指导我直接使用SQL连接设置数据透视表,那将非常有帮助!即使是一个非常简单的示例也将极大地帮助您。

0 个答案:

没有答案