导入xlsx转换为csv到powershell

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

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

其中ConvertXLSX是将xlsx转换为csv的函数,$ License是在脚本开始处定义的variables。 第二种方法是这样的:

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

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

第三种方法是从字面上定义path,这不是一个好的解决scheme,但应该工作,如果文件的执行者在正确的文件夹中运行它并使用正确的文件名。 在这种情况下,在“Import-Csv”cmdlet前面出现“成员”Proemail Exchg Business“已经存在”错误

csv文件被创build,看起来应该是这样,所以在转换函数中显然没有错误。

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 

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

这个不可靠的1解释了这个问题。 现在你已经编辑了这个问题来添加ConvertXLSX函数,我们可以build立这个问题来得到一个合适的解决scheme。


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

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

该函数不返回任何东西,只是对外部文件执行一个操作。 这就是为什么你得到空或空的错误。 我们可以让它返回文件path,或者返回一个对象中的数据并使用ConvertFrom-Csv

鉴于你的代码,对象将需要更多的工作,因为你已经有了文件path。
要返回文件path,请更改:

 } $Excel.Quit() } 

至:

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

你的代码应该工作。


你可以改进它的可读性和简洁性:

  • 将CSV文件名分配给一个variables。

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

  • 摆脱foreach 。 您目前只能获取一张表格并保存该表格。 如果你正在做多个工作表,你将不得不如何将多个path/对象传递给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 

我在“Import-Csv”cmdlet前面看到一个错误“成员”Proemail Exchg Business“已经存在”

这个在这个StackOverflow后处理。 简短的版本是你有两列“Proemail Exchg业务”在第一行。

PowerShell从CSV创build一个对象:列标题必须是唯一的。 要么在Excel表格中修复,要么在链接的文章中使用-Header手动指定唯一标题。

您目前使用的是错误的cmdlet。 Import-Csvdevise用于file.csv ,而不是string对象或其他。 有一个为此目的而存在的cmdlet, ConvertFrom-Csv ,它带有一个-InputObject参数(表示需要pipe道input)。

 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