首页 > 解决方案 > PowerShell - 将多个 CSV 文件导入多个工作表中的 Excel 文件

问题描述

我有以下代码(来自 SO 中的其他地方),它将 20 个奇怪的 CSV 文件导入到一个 Excel 文件中的不同选项卡中。我需要将 XLSX 选项卡称为 CSV 文件名。

代码会运行,但每次运行时都不会导入至少一个 CSV 文件。所有选项卡都存在,但数据未通过。它也是每次运行都会丢失的不同 CSV 文件。

有没有办法确保将所有 CSV 文件和数据导入 XLSX?我想如果我在每次运行时暂停脚本,它会给代码一个重置的机会,但“Start-Sleep -s 1”没有帮助。

错误包括:

“Microsoft Excel 一次只能转换一列。范围可以是多行高,但不超过一列宽。通过仅选择一列中的单元格再试一次。”

“无法获取 Range 类的 PasteSpecial 属性”

如果其中一个 CSV 文件中没有数据,此脚本是否还有一种方法可以忽略 CSV 导入?

# import multiple CSV files into separate Excel worksheets
$inputfolder='C:\somefolder’
$mergedwb='C:\somefolder\importtemplate.xlsx'

$xl = New-Object -ComObject Excel.Application
$xl.Visible=$true

$wb = $xl.WorkBooks.add()

Get-ChildItem $inputfolder\*.csv |
    ForEach-Object{
        Try{
            Write-Host "Moving $_" -ForegroundColor green
            $sheet = $wb.Sheets.Add()
            $sheet.Name = $_.BaseName
            $data = Get-Content $_ -Raw
            Set-Clipboard $data
            $sheet.UsedRange.PasteSpecial(
                [Microsoft.Office.Interop.Excel.XlPasteType]::xlPasteAll,
                [Microsoft.Office.Interop.Excel.XlPasteSpecialOperation]::xlPasteSpecialOperationAdd
            )
            $sheet.UsedRange.TextToColumns(
                $sheet.UsedRange,
                [Microsoft.Office.Interop.Excel.XlTextParsingType]::xlDelimited,
                [Microsoft.Office.Interop.Excel.XlTextQualifier]::xlTextQualifierDoubleQuote,
                $false, $false, $false, $true
            )
        }
        Catch{
            Write-Host $_ -ForegroundColor Red
        } Start-Sleep -s 1
    }
$wb.Sheets.Item('sheet1').Delete()
$wb.Sheets.Item('sheet2').Delete()

$wb.SaveAs($mergedwb)
$wb.Close()
$xl.Quit()

标签: excelpowershellcsv

解决方案


试试这个 - 它会以新的方式打开 CSV 文件,Workbook然后将工作表内容复制到 Excel XLSX 文件中的新工作表中,额外的 PS 将检查 CSV 是否为空。

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$wb = $excel.Workbooks.Add()

Get-ChildItem $CSVPath\*.csv | ForEach-Object {
    if ((Import-Csv $_.FullName).Length -gt 0) {
        $csvBook = $excel.Workbooks.Open($_.FullName)
        $csvBook.ActiveSheet.Copy($wb.Worksheets($wb.Worksheets.Count))
        $csvBook.Close()
    }
}

推荐阅读