import xlsx转换为csv到powershell

时间:2017-11-01 15:46:05

标签: excel powershell csv

我需要将csv文件导入到我的PS脚本中。在同一个脚本中,我有一个函数将xlsx文件转换为csv,我需要导入它。但我找不到办法做到这一点。我尝试了三种方法:

$CSVLicence = Import-Csv (ConvertXLSX -File $Licence) -Delimiter "," -Encoding UTF8

其中ConvertXLSX是将xlsx转换为csv的函数,$ License是在脚本开头定义的变量。第二种方法是:

$CSVfile = ConvertXLSX -File $Licence
$CSVLicence = ImportCsv $CSVfile -Delimiter "," -Encoding UTF8

在这两种情况下,我在" Import-Csv"之后的列上收到错误消息,该参数Path为null或为空。

第三种方法是从字面上定义路径,这不是一个很好的解决方案,但如果文件的执行者在正确的文件夹中运行并使用正确的文件名,则应该有效。在这种情况下,我收到一个错误"会员" Proemail Exchg Business"已经存在"在" Import-Csv"前面小命令

创建csv文件并且它看起来应该是正确的,因此转换函数中显然不会出现错误。

ConvertXLSX函数的定义如下:

$Licence = "licence"
Function ConvertXLSX ($File)
{
 $PWD = "r:\Licence\"
 $ExcelFile = $PWD + $File + ".xlsx"
 $Excel = New-Object -ComObject Excel.Application
 $Excel.Visible = $false
 $Excel.DisplayAlerts = $false
 $wb = $Excel.Workbooks.Open($ExcelFile)
 foreach ($ws in $wb.Worksheets | where {$_.name -eq "Pridani"})
 {
  $ws.SaveAs($PWD + $File + ".csv",6)
 }
 $Excel.Quit()
}
ConvertXLSX -File $Licence

该函数成功创建了csv文件,没有任何问题

2 个答案:

答案 0 :(得分:3)

您目前正在使用错误的cmdlet。 Import-Csv旨在与file.csv一起使用,而不是字符串对象或其他。为此目的存在一个cmdlet,ConvertFrom-Csv,它接受​​-InputObject参数(表示它需要管道输入)。

PS C:\> Get-Help -Name 'ConvertFrom-Csv'

SYNTAX
    ConvertFrom-Csv [-InputObject] <PSObject[]> [[-Delimiter] <Char>] [-Header <String[]>]

在您的示例中使用:

## Declaration of the delimiter is unnecessary when it's a comma
$CSVLicense = ConvertXLSX -File $Licence | ConvertFrom-Csv

答案 1 :(得分:0)

TheIncorrigible1很好地解释了这个问题。既然您已经编辑了要添加ConvertXLSX函数的问题,我们可以在此基础上构建一个适合的解决方案。

$ws.SaveAs($PWD + $File + ".csv",6)

此部分是保存到文件名$PWD + $File + ".csv"。数字6代表CSV XlFileFormat Enumeration

该函数不返回任何内容,只对外部文件执行操作。这就是你得到null或空错误的原因。我们可以让它返回文件路径,或者返回对象中的数据并使用ConvertFrom-Csv

鉴于您的代码,该对象需要更多的工作,因为您已经有了文件路径 要返回文件路径,请更改:

}
 $Excel.Quit()
}

要:

}
 $Excel.Quit()
 return $($PWD + $File + ".csv")
}

然后你的代码就可以了。

你可以更好地提高它的可读性和简洁性:

  • 将CSV文件名分配给变量。

  • 避免分配给$PWD,因为它是Get-Location的别名

  • 摆脱foreach。您目前只获得一张表并保存该表。如果您要处理多个工作表,则必须考虑如何将多个路径/对象传递给Import-Csv / ConvertFrom-Csv

全部放在一起:

$Licence = "licence"

Function ConvertXLSX ($File)
{
    $rootDir   = "r:\Licence\"
    $ExcelFile = $rootDir + $File + ".xlsx"
    $CSVFile   = $ExcelFile.Replace(".xlsx",".csv")

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

    $wb = $Excel.Workbooks.Open($ExcelFile)
    $ws = $wb.Worksheets | where {$_.name -eq "Pridani"})
    $ws.SaveAs($CSVFile,6)

    $Excel.Quit()
    return CSVFile
}

ConvertXLSX -File $Licence
  

我收到错误&#34;会员&#34; Proemail Exchg Business&#34;已经存在&#34;在&#34; Import-Csv&#34;前面小命令

此问题由this StackOverflow post处理。简短版本是第一行中有&#34; Proemail Exchg Business&#34; 的两列。

PowerShell从CSV创建对象:列标题必须是唯一的。可以在Excel工作表中进行修复,也可以使用链接帖子中的-Header手动指定唯一标头。