powershell - 将excel转成CSV并保存
问题描述
我正在尝试将 xls 文件转换为 csv 文件并尝试使用 powershell 命令保存它,但出现错误:
"'$excelApp' 未被识别为内部或外部命令, 可运行的程序或批处理文件。 '$excelApp.DisplayAlerts' 未被识别为内部或外部命令, 可运行的程序或批处理文件。 '$workbook' 未被识别为内部或外部命令, 可运行的程序或批处理文件。 '$csvFilePath' 未被识别为内部或外部命令, 可运行的程序或批处理文件。 '$workbook.SaveAs' 未被识别为内部或外部命令, 可运行的程序或批处理文件。 '$workbook.Close' 未被识别为内部或外部命令, 可运行的程序或批处理文件。”
解决方案
试试这个代码 -
###################################################################################
### The following is a function to convert XLSX format to CSV Format
### To execute the script --> Get-ExcelData -path "Path of the XLSX sheet"
###################################################################################
function Get-ExcelData {
[CmdletBinding(DefaultParameterSetName='Worksheet')]
Param(
[Parameter(Mandatory=$true, Position=0)]
[String] $Path,
[Parameter(Position=1, ParameterSetName='Worksheet')]
[String] $WorksheetName = 'Sheet1',
[Parameter(Position=1, ParameterSetName='Query')]
[String] $Query = 'SELECT * FROM [Sheet1$]'
)
switch ($pscmdlet.ParameterSetName) {
'Worksheet' {
$Query = 'SELECT * FROM [{0}$]' -f $WorksheetName
break
}
'Query' {
# Make sure the query is in the correct syntax (e.g. 'SELECT * FROM [SheetName$]')
$Pattern = '.*from\b\s*(?<Table>\w+).*'
if($Query -match $Pattern) {
$Query = $Query -replace $Matches.Table, ('[{0}$]' -f $Matches.Table)
}
}
}
# Create the scriptblock to run in a job
$JobCode = {
Param($Path, $Query)
# Check if the file is XLS or XLSX
if ((Get-Item -Path $Path).Extension -eq 'xls') {
$Provider = 'Microsoft.Jet.OLEDB.4.0'
$ExtendedProperties = 'Excel 8.0;HDR=YES;IMEX=1'
} else {
$Provider = 'Microsoft.ACE.OLEDB.12.0'
$ExtendedProperties = 'Excel 12.0;HDR=YES'
}
# Build the connection string and connection object
$ConnectionString = 'Provider={0};Data Source={1};Extended Properties="{2}"' -f $Provider, $Path, $ExtendedProperties
$Connection = New-Object System.Data.OleDb.OleDbConnection $ConnectionString
try {
# Open the connection to the file, and fill the datatable
$Connection.Open()
$Adapter = New-Object -TypeName System.Data.OleDb.OleDbDataAdapter $Query, $Connection
$DataTable = New-Object System.Data.DataTable
$Adapter.Fill($DataTable) | Out-Null
}
catch {
# something went wrong ??
Write-Error $_.Exception.Message
}
finally {
# Close the connection
if ($Connection.State -eq 'Open') {
$Connection.Close()
}
}
# Return the results as an array
return ,$DataTable
}
# Run the code in a 32bit job, since the provider is 32bit only
$job = Start-Job $JobCode -RunAs32 -ArgumentList $Path, $Query
$job | Wait-Job | Receive-Job
Remove-Job $job
}
要执行脚本 -
Get-ExcelData -path \\PathToYourExcelSheet\ExcelSheet.xlsx
上面的代码一次将 xlsx 转换为 csv。
推荐阅读
- android - 如何捕获 RuntimeException
- php - php artisan migrate 说“没有什么要迁移”
- c# - 如何在 C# 中有效地调整图像大小?
- postgresql - 无法对 jdbc 驱动程序使用复制功能
- sql - Rails:查询子孙,对子运行方法,对孙子的SQL SUM - 导致数组?
- python - 错误,因为对象属性不存在,但它确实存在
- express - Bcrypt + Sequelize 密码未在数据库中保存为哈希
- php - 简单 PHP 登录表单中的未定义索引
- authentication - 使用 Keycloak 颁发“API 密钥”
- html - SQL Server HTML 正文电子邮件格式不正确(添加了 XML)