使用PowerShell ImportExcel模块添加工作表时数据填充失败问题
问题原因及修复方案
核心问题
后续循环调用Export-Excel时,未指定要复用的ExcelPackage对象,且错误地将工作表对象传给了-WorksheetName参数(该参数仅接受工作表名称字符串)。这导致Export-Excel默认创建新的临时Excel文件,而非在已打开的$excel包中写入数据,最终出现工作表已创建但为空的情况。
修复后的关键代码(else分支)
else { $ws = Add-Worksheet -ExcelPackage $excel -WorksheetName $worksheetName # 核心修正:指定-ExcelPackage复用现有工作簿,-WorksheetName传字符串名称 $null = $mappings | Export-Excel -ExcelPackage $excel -WorksheetName $worksheetName ` -FreezeTopRow -AutoSize -BoldTopRow -TableStyle None -PassThru }
详细说明
- 必须指定
-ExcelPackage参数:这是复用已有工作簿的核心,告诉Export-Excel要在已打开的$excel对象中操作,而非新建文件。 -WorksheetName传字符串:该参数仅接受工作表名称(如file2),不能直接传入$ws工作表对象。- 可选移除
-MoveToStart:原代码中的-MoveToStart会将新工作表移到工作簿最前面,若不需要此顺序可删除该参数,保持工作表按创建顺序排列。
完整修复代码
$outputFile = 'output.xlsx' $excel = $null $InputFiles = 'file1.txt','file2.txt','file3.txt' # 获取文件信息对象列表 $files = $InputFiles | ForEach-Object { Get-Item $_ } foreach ($file in $files) { $content = Get-Content -Encoding UTF8 -Path $file $mappings = New-Object System.Collections.Generic.List[Mapping] foreach ($line in $content) { // 这里将每行内容转换为Mapping类实例并添加到列表中 } $worksheetName = $file.BaseName if ($excel -eq $null) { # 确保输出文件不存在 if (Test-Path -Path $OutputFile) { Remove-Item -Path $OutputFile -ErrorAction Stop} $excel = $mappings | Export-Excel -WorksheetName $worksheetName -AutoSize -FreezeTopRow -BoldTopRow -TableStyle None -Path $OutputFile -PassThru $ws = $excel.Workbook.Worksheets[$worksheetName] } else { $ws = Add-Worksheet -ExcelPackage $excel -WorksheetName $worksheetName $null = $mappings | Export-Excel -ExcelPackage $excel -WorksheetName $worksheetName ` -FreezeTopRow -AutoSize -BoldTopRow -TableStyle None -PassThru } Set-Format -Worksheet $ws -Range "B2:B$($mappings.Count)" -WrapText Set-Format -Worksheet $ws -Range 'A:C' -VerticalAlignment Top } if ($excel -ne $null) { Close-ExcelPackage -ExcelPackage $excel -Show }
内容的提问来源于stack exchange,提问作者endurium
相关产品推荐
相关产品推荐

