[英]Saving a .xlsm file type in Excel using Windows Powershell
[英].xlsm to csv using Powershell
我想將.xlsm文件夾中的幾個文件轉換為csv。 Excel文件包含多個工作表。 因為目前我對Powershell的了解非常有限,所以我在網上搜索了一個腳本,並在Extract中找到了一個腳本,然后使用PowerShell將所有Excel工作表轉換為CSV文件。
問題是,在某些情況下,我設法使這些腳本起作用(一個腳本調用另一個腳本),但我仍未弄清楚何時或如何發生。 我正在從Powershell ISE運行腳本,並收到以下錯誤消息:
帶有“ 1”自變量的異常調用“ Open”:“對不起,我們找不到C:\\ Docs。是否有可能將其移動,重命名或刪除?” 在C:\\ Docs \\ xlstocsv.ps1:9 char:5 + $ wb = $ E.Workbooks.Open($ excelFile)+ ~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~ + + CategoryInfo:未指定:(:) [],MethodInvocationException + FullyQualifiedErrorId:ComMethodTargetInvocation
因為我已經成功運行了幾次這些腳本,所以可以正確地假設這些腳本正確並且Powershell(?)設置有問題嗎? 我的想法已經用完了。
附言:我希望這里允許粘貼指向其他網頁的鏈接。
已添加EDIT代碼。
腳本一 (我從Powershell ISE開始的腳本 ):
$ens = Get-ChildItem "C:\Docs\" -filter *.xlsm
foreach($e in $ens)
{ [threading.thread]::CurrentThread.CurrentCulture = 'en-US'
ExportWSToCSV -excelFileName $e.BaseName -csvLoc "C:\Docs\Final\"
}
腳本二 :
Function ExportWSToCSV ($excelFileName, $csvLoc)
{ [threading.thread]::CurrentThread.CurrentCulture = 'en-US'
$excelFile = "C:\Docs\"
$E = New-Object -ComObject Excel.Application
$E.Visible = $false
$E.DisplayAlerts = $false
$wb = $E.Workbooks.Open($excelFile)
foreach ($ws in $wb.Worksheets)
{
$n = $excelFileName + "_" + $ws.Name
$ws.SaveAs($csvLoc + $n + '.csv', 6)
}
$E.Quit()
}
ExportWSToCSV -excelFileName "file" -csvLoc "C:\Docs\Final\"
我添加了“ [threading.thread] :: CurrentThread.CurrentCulture ='en-US'”部分,我能夠成功運行這些腳本,但只能運行一次。 所以基本上,這似乎可以從代碼中刪除此行。
如果您唯一的目標是將文件從.xlsm
轉換為.csv
,則可以這樣完成(使用示例片段):
function Convert-XlsmToCsv {
param(
[Parameter(Mandatory, ValueFromPipelineByPropertyName)]
[ValidateNotNullOrEmpty()]
[Alias('FullName')]
[string] $Path
)
begin {
$excel = New-Object -ComObject Excel.Application -Property @{
Visible = $false
DisplayAlerts = $false
}
}
process {
$root = Split-Path -Path $Path
$filename = [System.IO.Path]::GetFileNameWithoutExtension($Path)
$workbook = $excel.Workbooks.Open($Path)
foreach ($worksheet in $workbook.Worksheets) {
$name = Join-Path -Path $root -ChildPath "${filename}_$($worksheet.Name).csv"
try {
$worksheet.SaveAs($name, 6)
} catch {
Write-Error -Message "Failed to save csv! Path: '$name'. $PSItem"
}
}
}
end {
$excel.Quit()
$null = [System.Runtime.InteropServices.Marshal]::ReleaseComObject($excel)
}
}
正在使用:
Get-ChildItem -Path C:\Docs -Filter *.xlsm |
Convert-XlsmToCsv
做出了一些假設,但是編輯起來很容易。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.