Powershell在Excel单元格中使用多行文本

我有一个相当简单的要求(对我来说这是非常艰难的任务tbh)。

我有两个CSV文件,我想要将其转换为Excel,因此这两个CSV文件中的每一个都将占用一张纸。 到目前为止,我已经做到了,但是我想要纠正这个小问题。

CSV中的一个单元格包含多个文本行,如下所示:

这是条目1

这是条目2

我想这两个条目被导入到Excel单元格中,就像它在CSV中一样,但是当我检查我的Excel文件时,第二个条目被导入到下一行:

行1 Cell1 – 这是条目1

第2行单元格1 – 这是条目2

我不知道是否应该使用.NET类worksheet.UsedRange.EntireRow或worksheet.UsedRange.EntireColumn或其他。 我正在查看MSDN,但由于我仍是一个noob,我找不到任何东西。

这是我的代码示例:

Function Merge-CSVFiles { Param( $CSVPath = ".\Reports", $XLOutput=".\final_final_report.xlsx" ) $csvFiles = Get-ChildItem ("$CSVPath\*") -Include *.csv $Excel = New-Object -ComObject excel.application $Excel.visible = $false $Excel.sheetsInNewWorkbook = $csvFiles.Count $workbooks = $excel.Workbooks.Add() $CSVSheet = 1 Foreach ($CSV in $Csvfiles) { $worksheets = $workbooks.worksheets $CSVFullPath = $CSV.FullName $SheetName = ($CSV.name -split "\.")[0] $worksheet = $worksheets.Item($CSVSheet) $worksheet.Name = $SheetName $TxtConnector = ("TEXT;" + $CSVFullPath) $CellRef = $worksheet.Range("A1") $Connector = $worksheet.QueryTables.add($TxtConnector,$CellRef) $worksheet.QueryTables.item($Connector.name).TextFileCommaDelimiter = $True $worksheet.QueryTables.item($Connector.name).TextFileParseType = 1 $worksheet.QueryTables.item($Connector.name).Refresh() $worksheet.QueryTables.item($Connector.name).delete() $worksheet.UsedRange.EntireColumn.AutoFit() $CSVSheet++ } $workbooks.SaveAs($XLOutput,51) $workbooks.Saved = $true $workbooks.Close() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbooks) | Out-Null $excel.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null [System.GC]::Collect() [System.GC]::WaitForPendingFinalizers() } 

我不知道为什么你使用的方法,但我也能够在我的系统上重现。 我在我的一个脚本中做了一些类似的操作,构build了一个大的Excel工作簿,并且成功地使用了下面的方法:

  1. 使用Import-CSV导入CSV
  2. 将其转换为multidimensional array
  3. 将数组写入范围对象的Value2

例如,replace看起来像这样的代码:

 $TxtConnector = ("TEXT;" + $CSVFullPath) $CellRef = $worksheet.Range("A1") $Connector = $worksheet.QueryTables.add($TxtConnector,$CellRef) $worksheet.QueryTables.item($Connector.name).TextFileCommaDelimiter = $True $worksheet.QueryTables.item($Connector.name).TextFileParseType = 1 $worksheet.QueryTables.item($Connector.name).Refresh() $worksheet.QueryTables.item($Connector.name).delete() 

用这个代替:

 $CsvContents = Import-Csv $CSVFullPath $MultiArray = (ConvertTo-MultiArray $CsvContents -Headers).Value $StartRowNum = 1 $StartColumnNum = 1 $EndRowNum = $CsvContents.Count + 1 $EndColumnNum = ($CsvContents | Get-Member | Where-Object { $_.MemberType -eq 'NoteProperty' }).Count $Range = $worksheet.Range($worksheet.Cells($StartRowNum, $StartColumnNum), $worksheet.Cells($EndRowNum, $EndColumnNum)) $Range.Value2 = $MultiArray 

为了这个工作,你还需要我用来将一个对象转换成一个multidimensional array的function(基于这里发布的,但稍作修改):

 function ConvertTo-MultiArray { param ( $InputObject, [switch]$Headers = $false ) begin { $Objects = @() [ref]$Array = [ref]$null } process { $Objects += $InputObject } end { $Properties = $Objects[0].PSObject.Properties | ForEach-Object{ $_.Name } $Array.Value = New-Object 'object[,]' ($Objects.Count + 1), $Properties.Count $ColumnNumber = 0 if ($Headers) { $Properties | ForEach-Object{ $Array.Value[0, $ColumnNumber] = $_.ToString() $ColumnNumber++ } $RowNumber = 1 } else { $RowNumber = 0 } $Objects | ForEach-Object{ $Item = $_ $ColumnNumber = 0 $Properties | ForEach-Object{ if ($Item.($_) -eq $null) { $Array.Value[$RowNumber, $ColumnNumber] = "" } else { $Array.Value[$RowNumber, $ColumnNumber] = $Item.($_).ToString() } $ColumnNumber++ } $RowNumber++ } $Array } }