Сводная таблица напрямую из SQL с использованием powershell - PullRequest
0 голосов
/ 29 марта 2019

Я использую комбинацию сценариев PowerShell, которые я нашел в Интернете (показано ниже), для создания документа Excel с помощью сводных таблиц.Но я нашел только примеры, когда источником данных для сводных таблиц были данные, уже импортированные в документ Excel с помощью CSV или другими подобными методами.Я могу заставить их работать.Но моя проблема в том, что я хотел бы обойти этап загрузки данных .csv в Excel и создания сводных таблиц ... Вся моя проблема в том, что мой набор данных слишком велик для Excel ... поэтому я хочу создатьсводная таблица непосредственно из соединения SQL.Я не могу понять правильный синтаксис для установки источника данных.Ниже моя самая близкая попытка ... должен использовать "xlExternal" для источника данных?Но как мне установить источник данных тогда?Документация / API-интерфейсы Micorsoft немного полезны, но все их примеры написаны на VB, и они также используют другие методы, с которыми я даже не знаком в VB, поэтому мне трудно переводить метод QueryTables.Add и некоторые другие.

Я считаю, что только одна или две строки, на которых я застрял, это:

$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-соединения напрямую, это было бы чрезвычайно полезноДаже очень простой пример очень поможет.

...