不使用Excel.Application

时间:2018-11-06 10:34:02

标签: excel powershell csv export-to-csv excel.application

我创建了一个PowerShell脚本,该脚本允许我将多个.CSV合并到一个.XLSX文件中。

在我的计算机上运行良好:

$path = "C:\Users\Francesco\Desktop\CSV\Results\*"
$csvs = Get-ChildItem $path -Include *.csv
$y = $csvs.Count
Write-Host "Detected the following CSV files: ($y)"
Write-Host " "$csvs.Name"`n"
$outputfilename = "Final Registry Results"
Write-Host Creating: $outputfilename
$excelapp = New-Object -ComObject Excel.Application
$excelapp.SheetsInNewWorkbook = $csvs.Count
$xlsx = $excelapp.Workbooks.Add()
for ($i=1;$i -le $y;$i++) {
    $worksheet = $xlsx.Worksheets.Item($i)
    $worksheet.Name = $csvs[$i-1].Name
    $file = (Import-Csv $csvs[$i-1].FullName)
    $file | ConvertTo-Csv -Delimiter "`t" -NoTypeInformation | clip
    $worksheet.Cells.Item(1).PasteSpecial() | Out-Null
}

$output = "C:\Users\Francesco\Desktop\CSV\Results\Results.xlsx"
$xlsx.SaveAs($output)
$excelapp.Quit()

问题是我需要在多台服务器上运行此服务器,而未安装Office的服务器众所周知,因此我无法使用Excel.Application

是否有一种方法可以在不使用Excel.Application的情况下将多个CSV合并为一个CSV或XLSX并将每个CSV保存到另一张工作表中?

1 个答案:

答案 0 :(得分:0)

@AnsgarWiechers是正确的,ImportExcel功能强大且不难使用。但是,对于您的特定情况,您可以使用更有限的方法,即使用OleDb(或ODBC或ADO)来写入Excel文件(例如数据库)。这是一些示例代码,显示了如何使用OleDb写入Excel文件。

$provider = 'Microsoft.ACE.OLEDB.12.0'
$dataSource = 'C:\users\user\OleDb.xlsb'
$connStr = "Provider=$provider;Data Source=$dataSource;Extended Properties='Excel 12.0;HDR=YES'"
$objConn = [Data.OleDb.OleDbConnection]::new($connStr)
$objConn.Open()

$cmd = $objConn.CreateCommand()

$sheetName = 'Demo'
$cmd.CommandText = 'CREATE TABLE $sheetName (Name TEXT,Age NUMBER)'
$cmd.ExecuteNonQuery()

$cmd.CommandText = "INSERT INTO demo (Name,Age) VALUES ('Adam', 20)"
$cmd.ExecuteNonQuery()

$cmd.CommandText = "INSERT INTO demo (Name,Age) VALUES ('Bob',30)"
$cmd.ExecuteNonQuery()

$cmd.Dispose()
$objConn.Close()
$objConn.Dispose()

您没有对要处理的CSV文件说太多。如果列数据有所不同,则要创建表,您必须从CSV标头中获取属性(列)名称(通过读取CSV文件的第一行,或者枚举Import-返回的第一项的属性CSV)。

如果您的CSV文件包含很多行,则一次写入一行可能会很慢。在那种情况下,使用DataSet和OleDbDataAdapter可能会提高性能(但我尚未测试)。但是到那时,您还可以使用OleDb将.csv直接读入数据集,创建OleDbDataAdapter,设置适配器的InsertCommand属性,最后调用适配器的Update方法。我没有时间编写和测试所有这些内容。

这并不是一个完整的解决方案,只是一个有关如何使用OleDb写入Excel文件的演示。

注意:我在未安装Office或Excel的服务器上对此进行了测试。该计算机上预安装的Office数据提供程序是32位的,但我使用的是64位PowerShell。为了获得64位驱动程序,我安装了Microsoft Access Database Engine 2016 Redistributable,这就是我用于测试的内容。