【问题标题】:Powershell script for Excel error codeExcel 错误代码的 Powershell 脚本
【发布时间】:2015-08-27 20:37:51
【问题描述】:

我正在尝试使用 Powershell 4.0 将包含多个工作表的 Excel .xls 文件转换为 .csv。我知道 for each 循环中的 SaveAs 措辞不正确,并且错误指向第 17 行和第 9 个字符,我只是不知道如何修复它或如何解释错误代码 0x800A03EC。

这是脚本:

Function ExportWSToCSV ($inputWorkbookPath, $outputFilePrefix, $outputDirectory)
{

    #Start Excel invisibly without pop-up alerts.
    $inputWorkbookPath = "R:\Unclaimed Property\NC State\Jun 2015\" + `
                         "NC_RAW_JUL1986thruMAR2013" + ".xls"

    $excel = New-Object -ComObject Excel.Application
    $excel.Visible = $false
    $excel.DisplayAlerts = $false

    #Open Excel file.
    $workBook = $excel.Workbooks.Open($inputWorkbookPath) 

    foreach ($workSheet in $workBook.Worksheets)
    {
        $n = $inputWorkbookPath + "_" + $workSheet.Name
        $workSheet.SaveAs($outputDirectory + $n + ".csv", 6)
    }
    $excel.Quit()
}

ExportWSToCSV -inputWorkbookPath "R:\Unclaimed Property\NC State\Jun 2015\NC_RAW_JUL1986thruMAR2013.xls" `
              -outputFilePrefix "output_" `
              -outputDirectory "R:\Unclaimed Property\NC State\Jun 2015\"

这是错误:

Exception calling "SaveAs" with "2" argument(s): "Exception from    HRESULT: 0x800A03EC"
At \\ncdfs1\documents$\ANDREWN\My Documents\PSscript_for_NC.ps1:17   char:9
+         $workSheet.SaveAs($outputDirectory + $n + ".csv", 6)
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [],  MethodInvocationException
+ FullyQualifiedErrorId : ComMethodTargetInvocation

【问题讨论】:

  • 您的路径看起来格式不正确。看起来您正在使用$n 构建它,但随后您再次使用$outputDirectory 添加路径。我建议您加入循环只是为了查看$outputDirectory + $n + ".csv" 输出的样子。你应该看到一条看起来很糟糕的路径。你能从$n 中删除$inputWorkbookPath + "_" + 吗?
  • 我支持@Matt。我刚刚在 PS ISE 中使用测试文件对此进行了测试,并保持简单。 .SaveAs() 方法工作正常。这是您生成的路径可能有点不靠谱。

标签: excel powershell csv export-to-csv powershell-4.0


【解决方案1】:

我强烈认为您的问题来自您的路径连接逻辑。让我们看看循环中的以下代码。

$n = $inputWorkbookPath + "_" + $workSheet.Name
$workSheet.SaveAs($outputDirectory + $n + ".csv", 6)

在您的示例中,我认为您的变量映射如下:

$inputWorkbookPath equals "R:\Unclaimed Property\NC State\Jun 2015\NC_RAW_JUL1986thruMAR2013.xls"
$workSheet.Name equals "Bagel" # I made that up.
$outputDirectory equals "R:\Unclaimed Property\NC State\Jun 2015\"

所以您将尝试将新文件名设置为:

R:\Unclaimed Property\NC State\Jun 2015\R:\Unclaimed Property\NC State\Jun 2015\NC_RAW_JUL1986thruMAR2013.xls_Bagel.csv

这看起来根本不对。如果你的循环中只有这条线

$outputDirectory + $n + ".csv"

我想你会看到这个问题。只是一些简单的调试。

让我们解决这个问题

第一个猜测是你只需要把它改成 something like this

$path = $outputDirectory + $workSheet.Name + ".csv"
$workSheet.SaveAs($path, 6)

在这个问题的范围之外,最好在保存之前check if that path exists。这样可以省去一些潜在的麻烦。

【讨论】:

  • 我强烈建议在调用SaveAs 方法之前将输出字符串创建为变量。我在尝试在方法中构造任何东西的 MSOffice COM 对象方法方面有过不好的经历。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 2011-10-25
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多