2015-01-16 3 views
2

Есть ли способ конвертировать .xls в .csv без установки Excel с помощью Powershell?Как конвертировать .xls в .csv, используя Powershell без установленного Excel

У меня нет доступа к 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)).

+0

Я не достаточно хорошо разбираюсь в PowerShell, чтобы предоставить полный ответ, но я думаю, что вы можете подключиться к файлу Excel в качестве источника данных Odbc, даже без установки Excel, и сбрасывать результаты запроса выбора из этого источника данных до csv. Фокус в том, что он знает имя листа (ов). Кроме того, что вы хотите сделать, если есть больше, чем рабочий лист? –

+0

там будет только каждый лист. –

+0

Нашел пример того, что Джоэл говорил здесь: http://www.codeproject.com/Articles/670082/Use-Excel-in-PowerShell-without-a-full-version-of и еще один http: // blogs .technet.com/b/heyscriptingguy/archive/2008/09/11/how-can-i-read-from-excel-without-use-excel.aspx – Matt

ответ

1

Форвард

В зависимости от того, что вы уже установили на вашей системе вам может понадобиться 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 

Создать подключение ODBC к Ехчел $strFileName. Вам нужно знать имя вашего листа и заполнить $strSheetName, который поможет построить $strQuery. Затем используйте несколько объектов для создания соединения и извлеките данные с листа как System.Data.DataTable. В моем тестовом файле с одним заполненным листом у меня было два столбца данных. После запуска кода на выходе $dt является:

letter number 
------ ------ 
a   2 
d   34 
b   0 
e   4 

Затем можно взять эту таблицу, а затем ExportTo-CSV

$dt | Export-Csv c:\temp\data.csv -NoTypeInformation 

Это была построена на основе информации, собранной из:

  1. Scripting Guy
  2. PowerShell Code Repository
Смежные вопросы