powershell - 使用 powershell 直接从 SQL 数据透视表
问题描述
我正在使用我在网上找到的 powershell 脚本的组合(如下所示)来创建一个带有数据透视表的 Excel 文档。但是,我只发现了数据透视表的数据源是已经通过 CSV 或其他类似方法导入到 excel 文档中的数据的示例。我可以让那些工作。但是,我的问题是我想绕过将 .csv 数据加载到 excel 中然后创建数据透视表的步骤......我的整个问题是我的数据集对于 excel 来说太大了......所以我想创建直接来自 SQL 连接的数据透视表。我无法弄清楚设置数据源的正确语法。下面是我最接近的尝试......应该使用“xlExternal”作为数据源吗?但是我该如何设置数据源呢?Micorsoft 的文档/API 非常有用,
我相信我坚持的唯一 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 连接设置数据透视表,那将非常有帮助!即使是一个非常简单的例子也会有很大帮助。
解决方案
推荐阅读
- python - 如何将两个熊猫列转换为字典,但将相同第一列(键)的所有值合并为一个键?
- java - 如何证明 ListHelper 类
不是线程安全的 - javascript - 如何在 Mongoose/MongoDB 中存储文档的历史记录?
- android - onDestroy 从商店更新或从工作室重新加载
- python - 张量流错误脚本
- react-native - React Native Navigation 初始设置错误
- .htaccess - .htaccess 301 在斜杠后重定向
- ios - Meteor Cordova iOS HCP 失败,日志显示 PNG 文件已存在但它不存在
- javascript - 将箭头函数与 addEventListener 一起使用会出现错误:未捕获的 TypeError: Cannot read property 'undefined' of undefined at onChangeHandler
- javascript - 如何使用 AngularJS 填充复选框值列表?