繁体   English   中英

PowerShell 数据集到 Excel 的性能提升

[英]Performance increase for PowerShell dataset to Excel

我有一个 PowerShell 脚本,它从数据库中提取数据并将其推送到 Excel 工作表。 由于记录数超过 200K,我在将数据集中的记录复制到 Excel 表时遇到了缓慢(大约 45 分钟)的问题。 我正在尝试使用以下代码段将它们一一循环,这需要更多时间。 有什么方法可以更有效地将数据从数据集传输到 excel 吗?

   $cells=$Worksheet.Cells
   $row=1
   foreach ($rec in $dataset.Tables[0].Rows)
        {
            $row++
            $col=1
            $cells.item($Row,$col)=$USR.ID
            $col++
            $cells.item($Row,$col)=$USR.Name
            $col++
            $cells.item($Row,$col)=$USR.Age
            $col++
        }

您应该尝试PSExcel模块。 无需创建COM对象,甚至无需安装Excel。 您的示例如下所示,并且闪电般快速:

$dataset.Tables[0] | 
Select-Object ID,Name,Age | 
Export-XLSX -Path $FullName -AutoFit -WorksheetName 'MyData'

我前段时间看到的一个不错的小解决方法是将行格式化为 CSV 字符串,然后简单地将它们粘贴进去。对于我使用的环境,事实证明这比使用 Export-CSV 创建文件,然后将其加载到 Excel 中更有效.

#Row data joined with tabs
$data = @("[A1]", "[A2]", "[A3]", "[A4]", "[A5]", "[A6]") -join "`t"

#Multiple rows joined with new lines
$dataToPaste = "{0}`n{1}`n{2}" -f $data, $data.replace("A", "B"), $data.replace("A", "C")

$excel = New-Object -ComObject Excel.Application
$book = $excel.Workbooks.Add()
$sheet = $book.Worksheets.Add()

#Activate where to put data
$sheet.Range("B2").Activate() | Out-Null

#Copy data to clipboard and paste into sheet.
$dataToPaste | Clip
$sheet.Paste() 

$excel.Visible = $true

#Cleanup
[Runtime.InteropServices.Marshal]::ReleaseComObject($excel) | Out-Null
$excel = $null

我确实发现,在极少数情况下, Paste 方法会引发错误,如果失败,则通过第二次重试来修复该错误:

try{
    $sheet.Paste() 
}catch{
    $sheet.Paste() 
}

如果您在某人使用的 PC 上运行某些内容,这可能不是首选选项,因为用户可以在脚本执行后(但在$sheet.Paste()之前$sheet.Paste()将某些内容复制到剪贴板并使您的数据无效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM