【问题标题】:Performance increase for PowerShell dataset to ExcelPowerShell 数据集到 Excel 的性能提升
【发布时间】:2017-12-09 05:54:15
【问题描述】:

我有一个 PowerShell 脚本,它从数据库中提取数据并将其推送到 Excel 工作表。由于记录数超过 200K,我在将数据集中的记录复制到 Excel 工作表时面临速度缓慢(大约 45 分钟)。我正在尝试使用下面的 sn-p 将它们一一循环,这需要更多时间。有没有一种方法可以更有效地将数据从数据集中传输到 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++
        }

【问题讨论】:

标签: excel powershell ado powershell-4.0 vba


【解决方案1】:

你应该试试PSExcel 模块。无需创建 COM 对象,甚至无需安装 Excel。你的例子看起来像这样,而且速度很快:

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

【讨论】:

    【解决方案2】:

    我前段时间看到的一个不错的小解决方法是将行格式化为 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() 之前)将某些内容复制到剪贴板并使您的数据无效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多