1

Я получаю следующее сообщение об ошибке:Преобразование XLSX в CSV без использования Excel

Cannot index into a null array. 
At C:\tmp\Folder\excel\output\net45\test.ps1:14 char:1 
+ $Data = $Reader.AsDataSet().Tables[0].Rows 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo : InvalidOperation: (:) [], RuntimeException 
    + FullyQualifiedErrorId : NullArray
# Zero based index. The second row has index 1. 
$StartRow = 2 
# Input File 
$InputFileName = "C:\tmp\Folder\excel\output\net20\test.xlsx" 
# Output File 
$OutputFileName = "C:\tmp\Folder\excel\output\net20\SomeFile.csv" 
# Path to Excel.dll is saved (downloaded from http://exceldatareader.codeplex.com/) 
$DllPath = "C:\tmp\Folder\excel\output\net45\Excel.4.5.dll" 

[void]([Reflection.Assembly]::LoadFrom($DllPath)) 

$Stream = New-Object IO.FileStream($InputFileName, "Open", "Read") 
$Reader = [Excel.ExcelReaderFactory]::CreateBinaryReader($Stream) 
$Data = $Reader.AsDataSet().Tables[0].Rows 

# Read the column names. Order should be preserved 
$Columns = $Data[$StartRow].ItemArray 

# Sort the remaining data into an object using the specified columns 
$Data[$($StartRow + 1)..$($Data.Count - 1)] | % { 
    # Create an object 
    $Output = New-Object Object 
    # Read each column 
    for ($i = 0; $i -lt $Columns.Count; $i++) { 
    $Output | Add-Member NoteProperty $Columns[$i] $_.ItemArray[$i] 
    } 
    # Leave it in the output pipeline 
    $Output 
} | Export-CSV $OutputFileName -NoType 
+0

Что вы пробовали? Обычно ожидается, что вопросы в StackOverflow показывают некоторые усилия с точки зрения фактического кода. Итак, возможно, попробуйте некоторые программы самостоятельно, а затем задайте конкретные вопросы, касающиеся деталей, с которыми вы столкнулись. Подумайте о том, чтобы отложить несколько минут, чтобы взглянуть на [некоторые рекомендации по заданию вопросов] (http://stackoverflow.com/help/how-to-ask). –

+1

Я думал, что загрузка DLL-файла отличается от использования в вашем коде: $ E = New-Object -ComObject Excel.Application. Потому что Excel.Application открывает Excel. –

+0

Почему «без использования excel» важно? –

ответ

-2

Я прочитал эту "Convert XLS to CSV on command line" и это "convert-xlsx-file-to-csv-using-batch" прежде, чем в аналогичном сомнения у меня есть. Попробуйте также посмотреть, поможет ли это.

+0

В этом смысл. Я не могу использовать программное обеспечение на нашем сервере. Я не имею на это права. –

2

Вы вызываете двоичный метод (.xls) и используете файл формата Open XML (.xlsx). Вместо этого попробуйте использовать [Excel.ExcelReaderFactory]::CreateOpenXmlReader($Stream).

Это работает для меня:

$DllPath = 'C:\Excel.DataReader.45\Excel.4.5.dll'; 
$FilePath = 'C:\Students.xlsx'; 

$FileMode = [System.IO.FileMode]::Open; 
$FileAccess = [System.IO.FileAccess]::Read; 

Add-Type -Path $DllPath; 

$FileStream = New-Object -TypeName System.IO.FileStream $FilePath, $FileMode, $FileAccess; 

$ExcelDataReader = [Excel.ExcelReaderFactory]::CreateOpenXmlReader($FileStream); 

$ExcelDataReader.IsFirstRowAsColumnNames = $true; 

$ExcelDataSet = $ExcelDataReader.AsDataSet(); 

$ExcelDataReader.Dispose(); 
$FileStream.Close(); 
$FileStream.Dispose(); 

$ExcelDataSet.Tables | Format-Table -AutoSize 

Если вы все еще возникают проблемы, вы можете рассмотреть вопрос об использовании Microsoft.ACE.OLEDB.12.0 поставщика, который вы устанавливаете отдельно от Office. Есть несколько документов here.

+0

$ DllPath = 'C: \ Excel.DataReader.45 \ Excel.4.5.dll'; не существует на моей машине и нигде не может быть найден на моей ОС –

+0

@KolobCanyon Это сторонняя библиотека. https://github.com/ExcelDataReader/ExcelDataReader –

Смежные вопросы