.xlsm使用Powershell转换为csv

时间:2018-06-25 19:54:38

标签: excel powershell export-to-csv

我想将文件夹中的几个文件从.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'”部分,我能够成功运行这些脚本,但是只能运行一次。所以基本上,这似乎可以从代码中删除此行。

1 个答案:

答案 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

这有一些假设,但编辑起来很容易。