繁体   English   中英

PowerShell - 将多个 CSV 文件导入多个工作表中的 Excel 文件

[英]PowerShell - Import multiple CSV files to Excel file in multiple worksheets

我有以下代码(来自 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()

试试这个 - 它会在一个新的Workbook打开 CSV 文件,然后将Workbook表内容复制到 Excel XLSX 文件中的一个新Workbook表,奖金 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()
    }
}

感谢@kshkarin 和@Theo 现在没有显示错误,所有数据都被复制到 XLSX 中。 完成的代码以防万一:

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

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

Get-ChildItem $inputfolder\*.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()
    }
}

$wb.Sheets.Item('sheet1').Delete()
$wb.Sheets.Item('sheet2').Delete()

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

$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($sheet); 
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb); 
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl); 
[System.GC]::Collect(); [System.GC]::WaitForPendingFinalizers()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM