首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Powershell实现.xlsm到csv

使用Powershell实现.xlsm到csv
EN

Stack Overflow用户
提问于 2018-06-25 19:54:37
回答 1查看 1.7K关注 0票数 0

我想将一个文件夹中的几个文件从.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开始):

代码语言:javascript
运行
复制
$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\"
}

脚本二

代码语言:javascript
运行
复制
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'“部分,我成功地运行了这些脚本,但只运行了一次。因此,基本上,我似乎可以从代码中丢弃这一行。

EN

Stack Overflow用户

回答已采纳

发布于 2018-06-25 22:06:18

如果您的唯一目标是将文件从.xlsm转换为.csv,则可以这样完成(使用示例代码段):

代码语言:javascript
运行
复制
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)
    }
}

在使用中:

代码语言:javascript
运行
复制
Get-ChildItem -Path C:\Docs -Filter *.xlsm |
    Convert-XlsmToCsv

这做了一些假设,但很容易编辑。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51030973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档