使用PowerShell将DataTable导出到Excel

我有一个从TableName和ColumnName-Array的简单input来创buildSystem.Data.Datatables的函数。 填充表格后,我想将它们添加到数据集,并将其导出到Excel文档中。

下面的代码是这样的,但是在输出到excel中有一点我觉得有点不雅观。 每个表都必须导出到csv,然后重新导入到excel。

有没有更好的更清洁的方式来直接在Excel中使用DataTable?

 Function MakeTable ($TableName, $ColumnArray) { $btab = New-Object System.Data.DataTable("$TableName") foreach($Col in $ColumnArray) { $MCol = New-Object System.Data.DataColumn $Col; $btab.Columns.Add($MCol) } return , $btab } function DataSetToExcel ($Ds, $workdirectory) { $excel = New-Object -ComObject excel.application $workbook = $excel.Workbooks.Add(1) $i = 0 for($DsIndex=0;$DsIndex -lt $ds.Tables.Count;$DsIndex++) { $Table = $ds.tables[$Dsindex] if($Dsindex -ne 0) { $workbook.worksheets.Add() | Out-Null #Erstellt neues Arbeitsblatt } $Table | Export-Csv "$workdirectory\input.csv" -Encoding UTF8 -NoTypeInformation -Force -Delimiter ";" $inputCSV = "C:\Temp\Test\input.csv" $worksheet = $workbook.worksheets.Item(1) $worksheet.Name = $Table.TableName $TxtConnector = ("TEXT;" + $inputCSV) $Connector = $worksheet.QueryTables.add($TxtConnector,$worksheet.Range("A1")) $query = $worksheet.QueryTables.item($Connector.name) $query.TextFileOtherDelimiter = $Excel.Application.International(5) $query.TextFileParseType = 1 $query.AdjustColumnWidth = 1 $query.Refresh() | Out-Null $query.Delete() } $outputXLSX = "$workdirectory\output.xlsx" $Workbook.SaveAs($outputXLSX,51) $excel.Quit() } function MakeTestTable ($TableName) { $TestTable = MakeTable $TableName @("A","B") for($i=0;$i -lt 10; $i++) { $aRow = $TestTable.NewRow() $aRow["A"] = (10-$i).ToString() $aRow["B"] = $i.ToString() $TestTable.Rows.Add($aRow) } return , $TestTable } $db = New-Object System.Data.DataSet for($cx=0;$cx -lt 10;$cx++) { $tab1 = MakeTestTable "$cx" $db.Tables.Add($tab1) } DataSetToExcel $db "C:\Temp\Test" 

在Github上查看我的PowerShell Excel模块。 您也可以从PowerShell库中抓取它。

它也直接使用CSV格式使用Import-CsvConvertFrom-Csv (基本上任何PowerShell对象数组)。

 function New-Person { param($First,$Last) $row=$dataTable.NewRow() $row["First"]=$First $row["Last"]=$Last $dataTable.Rows.Add($row) } $dataTable = New-Object System.Data.DataTable("Test") $dataTable.Columns.Add((New-Object System.Data.DataColumn "First")) $dataTable.Columns.Add((New-Object System.Data.DataColumn "Last")) New-Person John Doe New-Person Tom Doe New-Person Jane Doe New-Person Mary Doe $dataTable | Select First, Last | Export-Excel c:\temp\people.xlsx -AutoSize -Show 

在这里输入图像说明

既然你用C#标记了这个,如果你在计算机上运行excel,那么你可以使用interop库。 我用它做了一个项目,使用我在这个SO问题中find的代码。