将 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)
我正在尝试将 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)