导入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-Csv
devise用于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