我想将一个文件夹中的几个文件从.xlsm转换为csv。Excel文件包含多个工作表。因为目前我对Powershell的了解非常有限,所以我在网上搜索了一个脚本,并在使用PowerShell提取所有Excel工作表并将其转换为CSV文件找到了一个脚本。
问题是,在一些情况下,我设法使这些脚本工作(一个脚本调用另一个脚本),但我没有弄清楚它何时或如何发生。我从Powershell ISE运行脚本并获得以下错误消息:
使用"1“参数调用"Open”的异常:“对不起,我们找不到C:\Docs。它是否可能被移动、重命名或删除?”At C:\Docs\xlstocsv.ps1:9 char:5 + $wb = $E.Workbooks.Open($excelFile) +~~+ CategoryInfo : NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId : ComMethodTargetInvocation
因为我已经成功地运行了这些脚本几次,那么假设脚本是正确的,并且我的Powershell(?)有什么问题是正确的。圈套?我的想法已经用完了。
PS我希望它可以在这里粘贴到其他网页的链接。
编辑代码添加。
脚本one (我从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'“部分,我成功地运行了这些脚本,但只运行了一次。因此,基本上,我似乎可以从代码中丢弃这一行。
发布于 2018-06-25 22:06:18
如果您的唯一目标是将文件从.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这做了一些假设,但很容易编辑。
https://stackoverflow.com/questions/51030973
复制相似问题