2015-10-16 109 views
0

我有一个从TableName和ColumnName-Array的简单输入创建System.Data.Datatables的函数。填写表格后,我想将它们添加到数据集中,并将其导出到Excel文档中。使用PowerShell将DataTable导出到Excel

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

在Excel中直接使用DataTables有更好的方法吗?

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" 
+0

PowerShell不使用数据表。数据来自哪里?至于导出为ex​​cel,您可以尝试[Export-XLSX](https://gallery.technet.microsoft.com/office/Export-XLSX-PowerShell-f2f0c035) –

回答

3

查看我的PowerShell Excel模块on Github。您也可以使用grab it from the PowerShell Gallery.

它也可以直接使用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 

enter image description here

1

既然你标记这个用C#,如果您有Excel,这将在该计算机上运行,​​你可以使用互操作库。我用它做了一个项目,使用的代码是this SO question