使用 Powershell SQL 将数据提取到 Excel

标签 sql sql-server excel powershell

我想使用 powershell 将数据从 SQL Server 提取到新的 Excel 文件。对于小型数据集,我的代码可以工作,但某些表的行数超过 100.000 行,这将需要很长时间。我不在 SQl 服务器中使用该实用程序的原因是因为我想提取多个表。 有没有办法优化我的脚本以将大表导出到 Excel?或者还有其他方法可以做到这一点吗?

我正在使用以下脚本

## ---------- Working with SQL Server ---------- ##

## - Get SQL Server Table data:
$SQLServer = 'server';
$Database = 'database';
$SqlQuery = @'   Select top 10 *   from database.dbo.table   '@;

## - Connect to SQL Server using non-SMO class 'System.Data':
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection;
$SqlConnection.ConnectionString = `
"Server = $SQLServer; Database = $Database; Integrated Security = True";

$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.CommandText = $SqlQuery;
$SqlCmd.Connection = $SqlConnection;

## - Extract and build the SQL data object '$DataSetTable':
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter;
$SqlAdapter.SelectCommand = $SqlCmd;
$DataSet = New-Object System.Data.DataSet;
$SqlAdapter.Fill($DataSet);
$DataSetTable = $DataSet.Tables["Table"];


## ---------- Working with Excel ---------- ##

## - Create an Excel Application instance:
$xlsObj = New-Object -ComObject Excel.Application;

## - Create new Workbook and Sheet (Visible = 1 / 0 not visible)
$xlsObj.Visible = 0;
$xlsWb = $xlsobj.Workbooks.Add();
$xlsSh = $xlsWb.Worksheets.item(1);

## - Build the Excel column heading:
[Array] $getColumnNames = $DataSetTable.Columns | Select ColumnName;

## - Build column header:
[Int] $RowHeader = 1;
foreach ($ColH in $getColumnNames)
{
$xlsSh.Cells.item(1, $RowHeader).font.bold = $true;
$xlsSh.Cells.item(1, $RowHeader) = $ColH.ColumnName;
$RowHeader++;
};

## - Adding the data start in row 2 column 1:
[Int] $rowData = 2;
[Int] $colData = 1;

foreach ($rec in $DataSetTable.Rows)
{
foreach ($Coln in $getColumnNames)
{
## - Next line convert cell to be text only:
$xlsSh.Cells.NumberFormat = "@";

## - Populating columns:
$xlsSh.Cells.Item($rowData, $colData) = `
$rec.$($Coln.ColumnName).ToString();
$ColData++;
};
$rowData++; $ColData = 1;
};

## - Adjusting columns in the Excel sheet:
$xlsRng = $xlsSH.usedRange;
$xlsRng.EntireColumn.AutoFit();

## ---------- Saving file and Terminating Excel Application ---------- ##

## - Saving Excel file - if the file exist do delete then save
$xlsFile = `
"C:\path\file.xls";

if (Test-Path $xlsFile)
{
Remove-Item $xlsFile
$xlsObj.ActiveWorkbook.SaveAs($xlsFile);
}
else
{
$xlsObj.ActiveWorkbook.SaveAs($xlsFile);
};

## Quit Excel and Terminate Excel Application process:
$xlsObj.Quit(); (Get-Process Excel*) | foreach ($_) { $_.kill() };

## - End of Script - ##

最佳答案

有一些简单的魔法可以使这变得更加容易,那就是复制/粘贴。您可以做的是将数据表转换为制表符分隔的 CSV,将其复制到剪贴板,然后粘贴到 Excel 中。我会忽略你的 SQL 部分,因为你似乎已经掌握了这一点。

## ---------- Working with Excel ---------- ##

## - Create an Excel Application instance:
$xlsObj = New-Object -ComObject Excel.Application;

## - Create new Workbook and Sheet (Visible = 1 / 0 not visible)
$xlsObj.Visible = 0;
$xlsWb = $xlsobj.Workbooks.Add();
$xlsSh = $xlsWb.Worksheets.item(1);

## - Copy entire table to the clipboard as tab delimited CSV
$DataSetTable | ConvertTo-Csv -NoType -Del "`t" | Clip

## - Paste table to Excel
$xlsObj.ActiveCell.PasteSpecial() | Out-Null

## - Set columns to auto-fit width
$xlsObj.ActiveSheet.UsedRange.Columns|%{$_.AutoFit()|Out-Null}

关于使用 Powershell SQL 将数据提取到 Excel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45758859/

相关文章:

mysql - MySqlCommand 上的查询语法错误

sql - 如何在T-SQL中翻转位域?

php - 将数据从 Android 发布并解析到 php

sql-server - 缓存到 Web 服务器上的本地 SQL 实例

sql - MS Excel 和 SQL Server 中的日期时间转换之间的差异

sql - 如何在 SQL Server 中将数据库名称作为参数传递

sql - 将数据从一个移动到另一个但具有唯一映射

sql - 当两个表具有相互引用的外键时如何删除记录?

excel - 仅打开指定的工作簿

vba - 继续执行不起作用