我想将文件夹中的几个文件从.xlsm转换为csv。 Excel文件包含多个工作表。 由于我目前在网上搜索脚本并在Extract and convert all Excel worksheets into CSV files using PowerShell
中找到一个脚本,因此我对Powershell的了解非常有限。问题是,在某些情况下,我设法使这些脚本起作用(一个脚本调用另一个脚本),但是我不知道它何时或如何发生。 我正在从Powershell ISE运行脚本,并收到以下错误消息:
使用“ 1”作为参数调用“ Open”的异常:“对不起,我们找不到C:\ Docs。是否有可能将其移动,重命名或删除?” 在C:\ Docs \ xlstocsv.ps1:9 char:5 + $ wb = $ E.Workbooks.Open($ excelFile) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo:未指定:(:) [],MethodInvocationException + FullyQualifiedErrorId:ComMethodTargetInvocation
由于我已经成功运行了几次这些脚本,因此可以正确地假设这些脚本正确并且Powershell(?)设置有问题吗? 我的想法用光了。
PS,我希望这里允许粘贴指向其他网页的链接。
编辑 添加了代码。
脚本一(我从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'”部分,我能够成功运行这些脚本,但是只能运行一次。所以基本上,这似乎可以从代码中删除此行。
答案 0 :(得分:0)
如果您唯一的目标是将文件从.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
这有一些假设,但编辑起来很容易。