【问题标题】:Importing large csv file into Excel using PowerShell使用 PowerShell 将大型 csv 文件导入 Excel
【发布时间】:2014-08-29 06:34:51
【问题描述】:

我正在编写一个脚本,它在 Excel 文档中导入一个大的 csv 文件。 我尝试使用更快的方式输入数据并将数组直接传递给Excel而不循环它。

$p = Import-Csv -Path "C:\Report.csv" -Delimiter "`t"
$Excel01 = New-Object -ComObject Excel.Application 
$Excel01.Visible = $True 
$Workbook01 = $Excel01.Workbooks.Add() 
$Worksheet01 = $Workbook01.Sheets.Item(1) 
$Worksheet01.Activate() 

$Worksheet01.Range("A1:D1").EntireColumn.Value() = $p | select field1,field2...

但是当我运行它时它会挂起......我该怎么做?

【问题讨论】:

  • 直接在Excel中打开CSV文件有什么问题?
  • 或者使用从文本向导导入。
  • David Brabant,我需要查询 SQL 服务器以获取数据并将其保存为 xlsx 文件并通过电子邮件发送(并重复多次),这就是我尝试自动化这些操作的原因。因此,我使用 bcp 命令行工具将数据从 mssql 导出到 csv 文件,然后我需要以某种方式将其转换为 Excel 格式。

标签: excel powershell csv import


【解决方案1】:

OpenText() 已存在于 Excel 中。但是请注意,您必须将文本文件的扩展名更改为 .csv 以外的其他名称,因为 Excel 对如何处理具有该特定扩展名的文件有自己的想法。

New-Variable -Option Constant -Name xlDelimited -Value 1
New-Variable -Option Constant -Name xlTextQualifierNone -Value -4142
New-Variable -Option Constant -Name xlWorkbookDefault -Value 51

$csv = 'C:\path\to\your.csv'
$txt = $csv -replace '\.csv$','.txt'
$xls = $csv -replace '\.csv$','.xlsx'

Rename-Item $csv $txt

$xl = New-Object -COM 'Excel.Application'
$xl.Workbooks.OpenText($txt, [Type]::Missing, [Type]::Missing, $xlDelimited, $xlTextQualifierNone, $false, $true)
$wb = $xl.Workbooks | ? { $_.FullName -eq $txt }

$wb.SaveAs($xls, $xlWorkbookDefault)
$wb.Close()

$xl.Quit()

应保留其默认值的参数需要[Type]::Missing 值。

【讨论】:

    【解决方案2】:

    又快又脏。也许你可以优化它:-)

    $p = Import-Csv -Path "C:\Report.csv" -Delimiter "`t"
    $Excel01 = New-Object -ComObject Excel.Application 
    $Excel01.Visible = $True 
    $Workbook01 = $Excel01.Workbooks.Add() 
    $Worksheet01 = $Workbook01.Sheets.Item(1) 
    $Worksheet01.Activate() 
    
    #Add csv header to excel
    For ($i = 0; $i -lt ($p | Get-Member | Where-Object -FilterScript {$_.MemberType -eq "NoteProperty"}).Count; $i ++) {
        $Worksheet01.Cells.Item(1,(1+$i)) = "$(($p | Get-Member | Where-Object -FilterScript {$_.MemberType -eq "NoteProperty"})[$i].Name)"
    }
    
    #Add csv data to ecxel
    $startRow = 2
    For ($i = 0; $i -lt ($p | Measure-Object).Count; $i ++) {
        For ($i2 = 0; $i2 -lt ($p[$i] | Get-Member | Where-Object -FilterScript {$_.MemberType -eq "NoteProperty"}).Count; $i2 ++) {
            $PropertyName = ($p[$i2] | Get-Member | Where-Object -FilterScript {$_.MemberType -eq "NoteProperty"})[$i2].Name
            $Worksheet01.Cells.Item($startRow,(1+$i2)) = "$($p[$i].$PropertyName)"
        }
        $startRow ++
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-15
      • 2023-03-23
      • 2015-02-23
      • 1970-01-01
      • 1970-01-01
      • 2019-09-17
      • 2020-12-20
      • 2012-09-19
      相关资源
      最近更新 更多