【发布时间】:2021-11-22 04:50:21
【问题描述】:
实际上,这是问题的一个版本: How to use powershell to select and copy columns and rows in which data is present in new workbook.
目标是从多个 Excel 工作簿中获取某些列并将所有内容转储到一个 csv 文件中。列始终相同。
我是手动做的:
$xl = New-Object -ComObject Excel.Application
$xl.Visible = $false
$xl.DisplayAlerts = $false
$counter = 0
$input_folder = "C:\Users\user\Documents\excelfiles"
$output_folder = "C:\Users\user\Documents\csvdump"
Get-ChildItem $input_folder -File |
Foreach-Object {
$counter++
$wb = $xl.Workbooks.Open($_.FullName, 0, 1, 5, "")
try {
$ws = $wb.Worksheets.item('Calls') # => This specific worksheet
$rowMax = ($ws.UsedRange.Rows).count
for ($i=1; $i -le $rowMax-1; $i++) {
$newRow = New-Object -Type PSObject -Property @{
'Type' = $ws.Cells.Item(1+$i,1).text
'Direction' = $ws.Cells.Item(1+$i,2).text
'From' = $ws.Cells.Item(1+$i,3).text
'To' = $ws.Cells.Item(1+$i,4).text
}
$newRow | Export-Csv -Path $("$output_folder\$ESO_Output") -Append -noType -Force
}
}
} catch {
Write-host "No such workbook" -ForegroundColor Red
# Return
}
}
问题:
这可行,但是非常慢,因为 Excel 必须选择每个单元格,复制它,然后 Powershell 必须创建数组并在输出 csv 文件中逐行保存。
有没有一种方法可以在 Excel 中选择一个范围(列数乘以($ws.UsedRange.Rows).count),剪切标题行并将这个范围(数组?)附加到 csv 文件以使一切更快?
【问题讨论】:
-
你的意思是从 Powershell 运行 VBA 脚本?有没有安全的方法来做到这一点?
-
不,你必须把它翻译成 PowerShell
-
你是不是忘记打开文件了??
-
是的,你是对的,更新了
标签: excel powershell