/ / PowerShell | OLEDB | Excel | Daten von XLSX, die mit einer Drittanbieter-App erstellt wurden, können nicht gelesen werden - Excel, Powershell, Oledb

PowerShell | OLEDB | Excel | Daten aus XLSX, die mit einer Drittanbieter-App erstellt wurden, können nicht gelesen werden - Excel, Powershell, Oledb

** Update (2012.12.13) - Beispielcode, Eingabeformatierung, Ausgabemuster hinzugefügt

Ich habe jetzt seit ein paar Tagen damit zu kämpfen,und ich habe keine Ideen mehr. Ich habe ein Skript getestet (und kann es später hochladen, wenn ich es vor mir habe) erfolgreich gegen mehrere XLSX-Dateien. Ich habe die Verbindungszeichenfolge funktionsfähig, analysiere die Daten, die ich brauche, usw.

Wenn ich versuche, meine Eingabedateien (die von einer Berichtsanwendung eines Drittanbieters generiert wurden) zu verarbeiten, werden die Daten nicht aus dem Arbeitsblatt gelesen.

Wenn ich die Eingabedatei in Excel öffne und speichere (keine Formatänderungen, keine Dateneingabe / -entfernung, keine Änderungen), verarbeitet und analysiert die Eingabedatei alle Daten.

Ich habe versucht, mehrere "Erweiterte Eigenschaften" -Einstellungen in der Verbindungszeichenfolge zu verwenden, einschließlich HDR = Yes / No und IMEX = 1.

Hat jemand jemals so etwas gesehen?


#inputFile_original.xlsx will not parse the data from the worksheet
#inputFile_original_reSaved.xlsx parses the data without any issues

$fileName  = "inputFile_original.xlsx"
#$fileName = "inputFile_original_reSaved.xlsx"
$filePath  = ".OLEDBtest"

#Build the connection string
$ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
$ConnectionString += (Join-Path -Path $filePath -ChildPath $fileName)
$ConnectionString += ";OLE DB Services=-4;Extended Properties="
$ConnectionString += ""Excel 12.0 Xml;HDR=YES;IMEX=1";"

$conn   = New-Object System.Data.OleDb.OleDbConnection($ConnectionString)
$conn.Open()

$tables = $conn.GetOleDbSchemaTable([System.Data.OleDb.OleDbSchemaGuid]::tables,$null)

$cmd    = New-Object System.Data.OleDb.OleDbCommand("Select * FROM [$($tables.rows[0].TABLE_NAME)]",$conn)

$da     = New-Object System.Data.OleDb.OleDbDataAdapter($cmd)
$ds     = New-Object System.Data.DataSet
$da.Fill($ds)

#Output the data to the console
$ds.tables

Außerdem ist die Eingabedatei nicht in einem wirklich einfach zu verwendenden Layout formatiert. Wiederum, weil es von einer Drittanbieteranwendung generiert wird.

Es gibt leere Zeilen und die Kopfzeile beginnt nicht in Zeile 1.

A B C D E          F -------------------------------------------------- ------------------------ 01 | ReportTitle 02 | 03 | ColHeader1 ColHeader2 ColHeader3 ColHeader4 ColHeader5 ColHeader6 04 | Daten Daten Daten Daten Daten 05 | Daten Daten Daten Daten Daten 06 | Daten Daten Daten Daten Daten 07 | Daten Daten Daten Daten Daten 08 | Daten Daten Daten Daten Daten 09 | 10 | Gesamt: 5

Die Ausgabe, die ich empfange, wird unten gezeigt.
(A) Originaldatei

Berichtstitel: F2: F3: F4: F5: F6:  Berichtstitel: ColHeader1 F2: F3: F4: F5: F6:

(B) wieder gespeicherte Datei

Berichtstitel: F2: F3: F4: F5: F6:  Berichtstitel: ColHeader1 F2: ColHeader2 F3: ColHeader3 F4: ColHeader4 F5: ColHeader5 F6: ColHeader6  Berichtstitel: Daten F2: Daten F3: Daten F4: Daten F5: Daten F6: Daten  Berichtstitel: Daten F2: Daten F3: Daten F4: Daten F5: Daten F6: Daten  Berichtstitel: Daten F2: Daten F3: Daten F4: Daten F5: Daten F6: Daten  Berichtstitel: Daten F2: Daten F3: Daten F4: Daten F5: Daten F6: Daten  Berichtstitel: Daten F2: Daten F3: Daten F4: Daten F5: Daten F6: Daten  Berichtstitel: F2: F3: F4: F5: F6:  Berichtstitel: Gesamt: 5 F2: F3: F4: F5: F6:

Antworten:

0 für die Antwort № 1

Anstatt die Excel-Dateien mit OLEDB zu öffnen,Sie können sie einfach in Excel von Powershell aus öffnen ... Dies ist ein schnelles Beispiel, in dem nur die Größe der Blätter gedruckt wird. Das einzige Problem, das ich dabei gelernt habe, war, dass Sie jedes Mal komplett aus Excel aussteigen mussten und alle Überbleibsel davon entfernen mussten (das GC-Zeug am Ende).

foreach($File in $excelFiles)
{
$excel = New-Object -comobject Excel.Application
$excel.visible = $false
$workbook = $excel.Workbooks.Open($File)

write-host "There are $($workbook.Sheets.count) sheets in $File"
For($i = 1 ; $i -le $workbook.Sheets.count ; $i++)
{
$worksheet = $workbook.sheets.item($i)
$rowMax = ($worksheet.usedRange.rows).count
$columnMax = ($worksheet.usedRange.columns).count
write-host "Sheet $($i) ($($worksheet.Name)) has dimensions $($rowMax) x $($columnMax)"

$worksheet = $rowMax = $columnMax = $null
} #end for
$workbook.close($false)
$workbook = $null
$excel.quit()
$excel = $null
[gc]::collect()
[gc]::WaitForPendingFinalizers()

} #end foreach