首页 > 解决方案 > 将多个 CSV 转换为单个 Xlsx

问题描述

我有一个创建 x 数量的 csv 的脚本我想将文件夹中的所有 csv 转换为一个 Xlsx 文件。

我有循环遍历每个 csv 的基础知识,但是它会在每个循环结束后覆盖。

我想将每个 csv 添加到工作簿中的工作表并保存。

但它只显示它读取的最后一个 csv,不显示任何其他工作表。

我从以下示例代码;

如何使用 Powershell 将 CSV 导出到 Excel

如前所述,我已经尝试过上述方法;没运气。

Function Excel-Write{
$RD = "C:\temp\Servers\*.csv"
$CsvDir = $RD

$csvs = dir -path $CsvDir
$outputxls = ""C:\temp\Servers\Complete.Xlsx"

foreach($iCsv in $csvs){
  $WB = $csvs.Length
    $Excel = New-Object -ComObject excel.application
    #$Excel.displayAlerts = $false
    $workbook = $excel.Workbooks.add(1)
    $Worksheet = $workbook.worksheets.Item(1)
    $Worksheet.name = $Group

    $TxtConnector = ("TEXT;" + $iCsv)
    $Connector = $worksheet.Querytables.add($txtconnector,$worksheet.Range("A1"))
    $query = $Worksheet.QueryTables.item($Connector.name)

    $query.TextfileOtherDelimiter = $Excel.Application.International(5)

    $Query.TextfileParseType =1
    $Query.TextFileColumnDataTypes = ,2 * $worksheet.cells.column.count
    $query.AdjustColumnWidth =1

    $Query.Refresh()
    $Query.Delete()

        $workbook.Save()

}
$Workbook.SaveAs($outputxls,51)
$Excel.quit()
} 

仅显示一个工作表,这是已读取的最后一个 CSV,它会覆盖其他工作表。

标签: excelpowershell

解决方案


我认为您需要将前两行移出循环。您还需要调用 add 而不是 $workbook.worksheets.Item(1) -> $workbook.worksheets.add(1)

Function Excel-Write{
$RD = "C:\temp\Servers\*.csv"
$CsvDir = $RD

$csvs = dir -path $CsvDir
$outputxls = ""C:\temp\Servers\Complete.Xlsx"
$Excel = New-Object -ComObject excel.application
$workbook = $excel.Workbooks.add(1)

foreach($iCsv in $csvs){
  $WB = $csvs.Length
    #$Excel.displayAlerts = $false
    $Worksheet = $workbook.worksheets.add(1)
    $Worksheet.name = $Group

    $TxtConnector = ("TEXT;" + $iCsv)
    $Connector = $worksheet.Querytables.add($txtconnector,$worksheet.Range("A1"))
    $query = $Worksheet.QueryTables.item($Connector.name)

    $query.TextfileOtherDelimiter = $Excel.Application.International(5)

    $Query.TextfileParseType =1
    $Query.TextFileColumnDataTypes = ,2 * $worksheet.cells.column.count
    $query.AdjustColumnWidth =1

    $Query.Refresh()
    $Query.Delete()

        $workbook.Save()

}
$Workbook.SaveAs($outputxls,51)
$Excel.quit()
} 

当您再次创建 excel 对象时,它会覆盖现有工作表。


推荐阅读