【问题标题】:Why is my code not saving the correct worksheet?为什么我的代码没有保存正确的工作表?
【发布时间】:2019-06-03 23:21:44
【问题描述】:

我有以下 Powershell 脚本将 XLSB 文件的第二张工作表转换为 CSV。

Function XLSBtoCSV ($Path)

{
    foreach($File in (Get-childItem $Path -Filter "*.xlsb"))
        {

        $pwd = $Path

        $excelFile = "$pwd\" + $File

        $Excel = New-Object -ComObject Excel.Application

        $Excel.Visible = $false

        $Excel.DisplayAlerts = $false

        $wb = $Excel.Workbooks.Open($excelFile)
        $ws = $wb.Worksheets.item(2)
        $ws.SaveAs("$pwd\" + $File.BaseName + "-" + $ws.name + ".csv", 6)

        $Excel.Quit()
    }

}


$FilePath = Get-Location

XLSBtoCSV -Path $FilePath

这个脚本曾经可以工作,但不知何故现在它只保存了最后一个工作表(表 3)。我尝试更改为不同的工作表编号,但每次都会保存最后一个工作表。

【问题讨论】:

  • 您能在$wb = $Excel.Workbooks.Open($excelFile) 之后添加$wb.Worksheets | select name 并显示输出吗?我无法重现该问题。
  • 我添加了 $ws.name 以跟踪选择的工作表。该名称实际上是正确的,但该文件仍保存有上一个工作表中的数据。
  • 我的意思是-您可以将该命令的输出添加到您的问题中吗?如前所述,该代码对我有用。
  • 它适用于我较小的文件。只有这种特殊类型的文件不起作用。输出显示名称 ----- 摘要、数据、数据字典。这些是所有 3 个工作表的名称。我只希望得到一个名字吗?
  • 如果这适用于较小的文件,那么代码是正确的。也许您的文件有问题,但我无法重现,因此很难指出问题所在。我询问了$wb.Worksheets | select name,因为我预计工作表的顺序不正确,而您选择了错误的。

标签: excel powershell


【解决方案1】:

非常接近。您需要遍历工作表项,而不是像另一个 answer 中所涵盖的那样仅调用 items(2):

Function XLSBtoCSV ($Path)
{
    foreach($File in (Get-childItem $Path -Filter "*.xlsb"))
        {

        $pwd = $Path

        $excelFile = "$pwd\" + $File

        try{
            $Excel = New-Object -ComObject Excel.Application

            $Excel.Visible = $false

            $Excel.DisplayAlerts = $false

            $wb = $Excel.Workbooks.Open($excelFile)

            # source https://stackoverflow.com/questions/16156951/how-to-iterate-through-excel-worksheets-only-extracting-data-from-specific-colum
            foreach($ws in $wb.Worksheets)
            {
                $ws.SaveAs("$pwd\" + $File.BaseName + "-" + $ws.name + ".csv", 6)
            }
        } 
        finally 
        {
            # close/dispose all the open parts of Excel
            if($Excel) 
            { 
                $Excel.Quit()
            }
        }
    }

}


$FilePath = Get-Location

XLSBtoCSV -Path $FilePath

【讨论】:

  • 您好,非常感谢。我试了一下,但它会保存工作簿上可用的每个工作表,而我只需要保存第二个工作表。
  • 可能是Zero-based_numbering 系统所以第二张表 = $wb.Worksheets.item(1)
  • @lloyd 在$wb.Worksheets.item()中不是从零开始的
猜你喜欢
  • 1970-01-01
  • 2019-11-01
  • 2020-11-27
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 2020-11-10
相关资源
最近更新 更多