将 CSV 导入新工作表

Importing CSV Into New Worksheet

我正在尝试将 CSV 文件导入新创建的 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)

上面最后一行是失败点,它产生:

Exception calling "Copy" with "1" argument(s): "Copy method of Worksheet class
failed"
At line:1 char:23
+     $tmpWorksheet.Copy <<<< ($tmpSheetTOFile)
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ComMethodTargetInvocation

我真的需要创建一个 separate/temporary 工作簿吗?为什么我不能简单地在已经 Saved/existing 的工作簿上使用 OpenText

编辑:我使用 this 之前的问题得到了我现在的位置,所以这就是为什么我不确定失败点在哪里。由于答案已被接受并签署。

您正在创建两个不同的 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 时自动创建一个带有新 sheet 的工作簿(这也是 OpenText 不导入的原因CSV 到现有工作簿),那么为什么首先需要将其复制到另一个新工作簿?通常只需将导入的 CSV 保存为 Excel 工作簿就足够了。如果您需要额外的 sheet,您可以添加它们。

$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)