如何在未安装 Excel 的情况下使用 Powershell 将 .xls 转换为 .csv
How to convert .xls to .csv using Powershell without Excel installed
有没有办法在不使用 Powershell 安装 Excel 的情况下将 .xls 转换为 .csv?
我无法在特定机器上访问 Excel,因此我在尝试时遇到错误:
New-Object -ComObject excel.application
New-Object : Retrieving the COM class factory for component with CLSID
{00000000-0000-0000-0000-000000000000} failed due to the following
error: 80040154 Class not registered (Exception from HRESULT:
0x80040154 (REGDB_E_CLASSNOTREG)).
前进
根据您已经在系统上安装的内容,您可能需要 Microsoft Access Database Engine 2010 Redistributable 才能使此解决方案生效。这将使您可以访问提供程序:"Microsoft.ACE.OLEDB.12.0"
免责声明:对结果印象不深,有更多背景知识的人可以使这个答案更好,但就这样吧。
代码
$strFileName = "C:\temp\Book1.xls"
$strSheetName = 'Sheet1$'
$strProvider = "Provider=Microsoft.ACE.OLEDB.12.0"
$strDataSource = "Data Source = $strFileName"
$strExtend = "Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';"
$strQuery = "Select * from [$strSheetName]"
$objConn = New-Object System.Data.OleDb.OleDbConnection("$strProvider;$strDataSource;$strExtend")
$sqlCommand = New-Object System.Data.OleDb.OleDbCommand($strQuery)
$sqlCommand.Connection = $objConn
$objConn.open()
$da = New-Object system.Data.OleDb.OleDbDataAdapter($sqlCommand)
$dt = New-Object system.Data.datatable
[void]$da.fill($dt)
$dataReader.close()
$objConn.close()
$dt
创建到 excel 文件 $strFileName
的 ODBC 连接。您需要知道您的 sheet 名称并填充 $strSheetName
,这有助于构建 $strQuery
。然后使用多个对象创建连接并从 sheet 中提取数据作为 System.Data.DataTable
。在我的测试文件中,填充了一个 sheet,我有两列数据。在 运行 代码之后 $dt
的输出是:
letter number
------ ------
a 2
d 34
b 0
e 4
然后你可以拿 table 然后 ExportTo-CSV
$dt | Export-Csv c:\temp\data.csv -NoTypeInformation
这是根据从以下位置收集的信息构建的:
有没有办法在不使用 Powershell 安装 Excel 的情况下将 .xls 转换为 .csv?
我无法在特定机器上访问 Excel,因此我在尝试时遇到错误:
New-Object -ComObject excel.application
New-Object : Retrieving the COM class factory for component with CLSID {00000000-0000-0000-0000-000000000000} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
前进
根据您已经在系统上安装的内容,您可能需要 Microsoft Access Database Engine 2010 Redistributable 才能使此解决方案生效。这将使您可以访问提供程序:"Microsoft.ACE.OLEDB.12.0"
免责声明:对结果印象不深,有更多背景知识的人可以使这个答案更好,但就这样吧。
代码
$strFileName = "C:\temp\Book1.xls"
$strSheetName = 'Sheet1$'
$strProvider = "Provider=Microsoft.ACE.OLEDB.12.0"
$strDataSource = "Data Source = $strFileName"
$strExtend = "Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';"
$strQuery = "Select * from [$strSheetName]"
$objConn = New-Object System.Data.OleDb.OleDbConnection("$strProvider;$strDataSource;$strExtend")
$sqlCommand = New-Object System.Data.OleDb.OleDbCommand($strQuery)
$sqlCommand.Connection = $objConn
$objConn.open()
$da = New-Object system.Data.OleDb.OleDbDataAdapter($sqlCommand)
$dt = New-Object system.Data.datatable
[void]$da.fill($dt)
$dataReader.close()
$objConn.close()
$dt
创建到 excel 文件 $strFileName
的 ODBC 连接。您需要知道您的 sheet 名称并填充 $strSheetName
,这有助于构建 $strQuery
。然后使用多个对象创建连接并从 sheet 中提取数据作为 System.Data.DataTable
。在我的测试文件中,填充了一个 sheet,我有两列数据。在 运行 代码之后 $dt
的输出是:
letter number
------ ------
a 2
d 34
b 0
e 4
然后你可以拿 table 然后 ExportTo-CSV
$dt | Export-Csv c:\temp\data.csv -NoTypeInformation
这是根据从以下位置收集的信息构建的: