簡體   English   中英

.xlsm使用Powershell轉換為csv

[英].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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM