【问题标题】:Convert multiple xls to csv using powershell使用powershell将多个xls转换为csv
【发布时间】:2015-02-02 07:12:41
【问题描述】:

我正在尝试使用 powershell 将多个 excel 文件 (xls) 转换为位于文件夹中的 csv。

我可以转换单个文件,但需要帮助转换文件夹中的多个文件。 但是需要关于如何转换多个文件的建议。

$ExcelWB = new-object -comobject excel.application
$Workbook = $ExcelWB.Workbooks.Open(c:\temp\temp.xls) 
$Workbook.SaveAs("c:\temp\temp.csv",6)
$Workbook.Close($false)
$ExcelWB.quit()

【问题讨论】:

  • 你应该分享你的代码,你如何转换1个文件?

标签: excel powershell csv


【解决方案1】:

使用 Doug Finke 开发的 ImportExcel 模块可以更快地完成从 xlsx 文件到 csv 的转换,并且无需 COM 对象(因此无需安装 Excel):

Install-Module -Name ImportExcel -RequiredVersion 5.4.2 
gci *.xlsx | %{Import-Excel $_ | Export-Csv ($_.basename + ".csv")}

或者反过来:

gci *.csv | %{Import-Csv $_ | Export-Excel ($_.basename + ".xlsx")}

Import-Excel cmdlet 可用的参数:

工作表名称

指定 Excel 工作簿中要导入的工作表的名称。默认情况下,如果没有提供名称,将导入第一个工作表。

仅数据

只导入包含数据的行和列,不导入空行和空列。

标题名称

指定要使用的自定义属性名称,而不是在 TopRow 的列标题中定义的值。

无标题

自动生成属性名称(P1、P2、P3、..),而不是在 TopRow 的列标题中定义的名称。

开始行

我们开始导入数据的那一行,StartRow 上面的所有行都被忽略。默认情况下这是第一行。

EndRow

默认情况下,将导入工作表中最后一个单元格之前的所有行。如果指定,导入将在该行停止。

开始列

要从中读取数据的第一列的编号(默认为 1)。

结束列

默认情况下,导入会读取到最后填充的列,-EndColumn 告诉导入在更早的数字处停止。

密码

接受将用于打开受密码保护的 Excel 文件的字符串。

【讨论】:

  • 这个模块确实很棒,但依赖于源电子表格以干净的表格格式。我正在处理的文件不是,但接受的答案会让我将它们强制转换为 CSV 文件,然后我可以自动清理这些文件,然后导入和处理数据。另外,当然,OP 是在谈论转换为 CSV 文件,而不是 FROM。
  • 感谢您提出我的错误,希望现在更准确。您可以使用开始/结束行/列参数,但我想这对您来说还不够。另一个限制:它只接受 xlsx 文件,而不接受最初要求的 xls。
  • 天哪...我不知道有开始/结束行/列参数。这将完全解决我的特定问题。
  • 干得好@BenoîtMayer 分享了这个模块。话虽如此,我必须说NoHeader 选项在您考虑其名称时非常违反直觉,而不是对其功能的描述!为此,我浪费了宝贵的几分钟!
  • 仅供参考:Import-Excel 不支持读取此扩展类型 .xls
【解决方案2】:

此未经测试的代码有一些注意事项,但它应该有助于解决您的问题

$ExcelWB = new-object -comobject excel.application

Get-ChildItem -Path c:\folder -Filter "*.xls" | ForEach-Object{
    $Workbook = $ExcelWB.Workbooks.Open($_.Fullname) 
    $newName = ($_.Fullname).Replace($_.Extension,".csv")
    $Workbook.SaveAs($newName,6)
    $Workbook.Close($false)
}
$ExcelWB.quit()

在第一个和最后一个之间画一条线并构建一个循环。使用Get-ChildItem 获取您的xls 文件,然后通过替换文件的FullName 的扩展名来构建一个新名称

【讨论】:

    【解决方案3】:

    您可以将其包装在一个循环中,遍历所有文件并将xls 扩展名更改为csv

    foreach($file in (Get-ChildItem "C:\temp")) {
    
      $newname = $file.FullName -replace '\.xls$', '.csv'
      $ExcelWB = new-object -comobject excel.application
      $Workbook = $ExcelWB.Workbooks.Open($file.FullName) 
      $Workbook.SaveAs($newname,6)
      $Workbook.Close($false)
      $ExcelWB.quit()
    
    }
    

    【讨论】:

    • 专业提示:只将XLS文件放在这个文件夹中,因为它也会转换其他文件,并且在运行上面的脚本时不要打开它们!
    猜你喜欢
    • 2011-08-28
    • 2020-12-30
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    相关资源
    最近更新 更多