不使用Excel.Application将多个CSV合并为一个CSV



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

它在我的电脑上运行良好:

$path = "C:UsersFrancescoDesktopCSVResults*"
$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:UsersFrancescoDesktopCSVResultsResults.xlsx"
$xlsx.SaveAs($output)
$excelapp.Quit()

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

有没有一种方法可以将多个CSV合并为一个CSV或XLSX,而不使用Excel.Application并将每个CSV保存到不同的工作表中?

@AnsgarWiechers是对的,ImportExcel功能强大,使用起来并不困难。然而,对于您的特定情况,您可以使用更有限的方法,使用OleDb(或ODBC或ADO(写入类似数据库的Excel文件。下面是一些示例代码,展示了如何使用OleDb写入Excel文件。

$provider = 'Microsoft.ACE.OLEDB.12.0'
$dataSource = 'C:usersuserOleDb.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直接读取到DataSet中,创建OleDbDataAdapter,设置适配器的InsertCommand属性,最后调用adapters Update方法。我没有时间写和测试所有这些。

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

注意:我在没有安装Office或Excel的服务器上测试了这个。那台机器上预装的Office数据提供程序是32位的,但我使用的是64位PowerShell。为了获得64位驱动程序,我安装了Microsoft Access Database Engine 2016 Redistributable,这就是我用来测试的。

时间已经过去,我找到了一个新的解决方案:Install-Module -Name ImportExcel

通过这种方式,模块可以像这个脚本中那样处理作业。

相关内容

最新更新