0

我创建了一个 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.

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

4

1 回答 1

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 直接读入 DataSet,创建 OleDbDataAdapter,设置适配器的 InsertCommand 属性,最后调用适配器的 Update 方法。我没有时间编写和测试所有这些。

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

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

于 2018-11-23T11:02:27.523 回答