将CSV导入新的工作表

我试图将一个CSV文件导入到一个新创build的Excel工作表中,但是还没有能够在这里(和其他地方)利用现有的问答来解决这个问题。

另外,我确信我正在使这种方式比应该更困难,所以请随时纠正这个臃肿的代码,如果你觉得合适:

$varOneSheet = "OneSheet" $xlsNewFile = New-Object -ComObject Excel.Application $xlsNewFile.SheetsInNewWorkbook = 3 $xlsNewFile.displayAlerts = $false $xlsNewFile.Visible = $false $xlsWorkbook = $xlsNewFile.Workbooks.Add() $sheetToRename = $xlsNewFile.Sheets.Item("Sheet1") $sheetToRename.Name = $OneSheet #this all works below, we need to push the data over to #xlsWorkbook now $xlsCSVFile = New-Object -ComObject Excel.Application $xlsCSVFile.displayAlerts = $false $csvFilename = (".\DATA.CSV") $xlsCSVFile.Workbooks.OpenText($csvFilename, 2, 1, 1, 1, $false, $false, $false, $true) $xlsCSVFile.Visible = $true $tmpSheetTOFile = $xlsWorkbook.Sheets.Item(1) $tmpWorksheet = $xlsCSVFile.Sheets.Item(1) #########################above is fine #########################below should copy into $xlsWorkbook Sheet 1 $tmpWorksheet.Copy($tmpSheetTOFile) 

上面的最后一行是失败点,这产生了:

 使用“1”参数调用“Copy”的exception:“Worksheet类的复制方法
失败”
在线:1 char:23
 + $ tmpWorksheet.Copy <<<<($ tmpSheetTOFile)
     + CategoryInfo:NotSpecified:(:) [],MethodInvocationException
     + FullyQualifiedErrorId:ComMethodTargetInvocation 

我真的需要创build一个单独的临时工作簿吗? 为什么我不能在已保存的/现有的工作簿上简单地使用OpenText

编辑:我用这个前面的问题来到我现在的位置,所以这就是为什么我不确定失败点在哪里。 答案被接受并签署。

您正在创build两个不同的Excel应用程序实例:

 $xlsNewFile = New-Object -ComObject Excel.Application ... $xlsCSVFile = New-Object -ComObject Excel.Application 

复制只能在同一个实例中使用,并且不需要使用两个实例。 只需删除

 $xlsCSVFile = New-Object -ComObject Excel.Application $xlsCSVFile.displayAlerts = $false ... $xlsCSVFile.Visible = $true 

并改变

 $xlsCSVFile.Workbooks.OpenText($csvFilename, 2, 1, 1, 1, $false, $false, $false, $true) ... $tmpWorksheet = $xlsCSVFile.Sheets.Item(1) ... $tmpWorksheet.Copy($tmpSheetTOFile) 

 $xlsNewFile.Workbooks.OpenText($csvFilename, 2, 1, 1, 1, $false, $false, $false, $true) ... $xlsNewFile.Workbooks.Item(2).Sheets.Item(1).Copy($tmpSheetTOFile) 

话虽如此,当Excel导入一个CSV文件时,Excel自动创build一个工作簿(这也是OpenText不会将CSV导入到现有工作簿中的原因),那么为什么您需要将其复制到另一个工作簿新的工作簿在第一位? 通常,将导入的CSV保存为Excel工作簿就足够了。 如果你需要额外的纸张,你可以添加它们。

 $wsName = 'OneSheet' $csvFilename = '.\data.csv' $xlsFilename = '.\data.xlsx' $xl = New-Object -ComObject 'Excel.Application' $xl.DisplayAlerts = $false $xl.Visible = $false $xl.Workbooks.OpenText($csvFilename, 2, 1, 1, 1, $false, $false, $false, $true) $wb = $xl.Workbooks.Item(1) $ws = $wb.Sheets.Item(1) $ws2 = $wb.Sheets.Add([Type]::Missing, $ws) $ws3 = $wb.Sheets.Add([Type]::Missing, $ws2) $ws.Name = $wsName $wb.SaveAs($xlsFilename, 51)