【问题标题】:Export DataTable to Excel using PowerShell使用 PowerShell 将 DataTable 导出到 Excel
【发布时间】:2016-01-15 06:13:25
【问题描述】:

我有一个函数可以从 TableName 和 ColumnName-Array 的简单输入中创建 System.Data.Datatables。填写表格后,我想将它们添加到数据集并将其导出到 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"

【问题讨论】:

  • Powershell 不使用 DataTable。数据从何而来?至于导出到excel,可以试试Export-XLSX

标签: c# excel powershell datatable


【解决方案1】:

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

它还可以使用Import-CsvConvertFrom-Csv(基本上是任何PowerShell 对象数组)直接处理CSV 格式。

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

【讨论】:

    【解决方案2】:

    由于您使用 C# 标记了它,如果您在将运行它的计算机上有 excel,则可以使用互操作库。我将它用于我做的一个项目,使用在this SO question 中找到的代码。

    【讨论】:

      猜你喜欢
      • 2012-11-20
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2013-07-15
      • 2015-02-15
      • 2022-10-25
      • 2016-04-16
      相关资源
      最近更新 更多