【问题标题】:import xlsx converted to csv to powershell导入 xlsx 转换为 csv 到 powershell
【发布时间】:2017-11-01 15:46:04
【问题描述】:

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

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

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

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

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

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

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文件,没有任何问题

【问题讨论】:

  • Import-Csv 仅适用于文件。您需要将ConvertXLSX 的输出写入文件,然后将其导入。或者,使用ConvertFrom-Csv

标签: excel powershell csv


【解决方案1】:

您当前使用了错误的 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

【讨论】:

  • 它不起作用,它不加载任何数据。奇怪的是,这适用于我正在导入的另一个 csv 文件,因为我需要将它与另一个文件进行比较: $Report = Read-Host "Název souboru" $Activity = Import-Csv ("r:\Licence \" + $Report + ".csv") -分隔符 ";" -编码 UTF8
  • @PetrSynek ConvertXLSX 是如何定义的?这不是内置的 cmdlet。它会输出到目录吗?到一个变量?它输出什么?
  • 你可以在这里找到函数:social.msdn.microsoft.com/Forums/sqlserver/en-US/…
【解决方案2】:

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


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

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

该函数不返回任何内容,只是对外部文件执行操作。这就是您收到 null 或 empty 错误的原因。我们可以让它返回文件路径,或者返回对象中的数据并使用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

我在“Import-Csv”cmdlet 前面收到错误消息“成员“Proemail Exchg Business”已存在”

这个在this StackOverflow post处理。简短的版本是您有两列 “Proemail Exchg Business” 在第一行。

PowerShell 从 CSV 创建一个对象:列标题必须是唯一的。要么在 Excel 表中修复,要么使用 -Header 手动指定唯一标题,如链接帖子中所示。

【讨论】:

  • 谢谢。虽然我不能使用 CSVFile 变量来实际替换 xlsx 文件,但我让它按照我的需要工作。我需要将 xlsx 文件与 csv 文件进行比较,因此我首先必须将 xlsx 转换为 csv,然后将两者进行比较。脚本完成后,我将再次删除转换后的文件。由于 xlsx 文件是手动管理的,它不能永久保存在 csv 中。至于两个相同的列,隐藏了一个列,我在原始xlsx文件中没有注意到它,所以我很困惑为什么会出现这个错误
  • 现在我正在努力解决另一个问题。文件中的一列是“添加日期”。它的格式为 M/d/yyyy。我只想导入行,其中此日期在较早指定的日期之后。我在管道之后有where {$_.'Date Added' -gt $DateStart},但这不起作用,所有行都被添加了。当我尝试where {$_.'Date Added'.Date -gt $DateStart} 时,没有添加任何行。我可以在条件内指定日期格式吗?我想这很可能是问题所在。
  • @PetrSynek Check out this post。如果您仍有问题,我建议您提出一个新问题,因为这是一个单独的问题。
猜你喜欢
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 2013-07-15
  • 2018-08-27
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 2012-08-12
相关资源
最近更新 更多