/ / PowerShell | OLEDB | Excel | No se pueden leer los datos de XLSX creados desde aplicaciones de terceros: excel, powershell, oledb

PowerShell | OLEDB | Excel | No se pueden leer los datos de XLSX creados desde aplicaciones de terceros: excel, powershell, oledb

** Actualización (2012.12.13): código de muestra agregado, formato de entrada, muestra de salida

He estado luchando con esto por unos días, ahora,y me he quedado sin ideas. He probado un script (y puedo cargarlo más tarde una vez que lo tengo frente a mí) con éxito contra varios archivos XLSX. Tengo la cadena de conexión funcional, analizando los datos que necesito, etc ...

El problema es que cuando intento procesar mis archivos de entrada (generados a partir de una aplicación de informes de terceros), los datos no se leen de la hoja de trabajo.

Si abro y guardo el archivo de entrada dentro de Excel (sin cambios de formato, sin ingreso / eliminación de datos, sin modificaciones), el archivo de entrada procesará y analizará todos los datos.

He intentado usar múltiples configuraciones de "Propiedades Extendidas" en la cadena de conexión, sin éxito, incluyendo HDR = Sí / No e IMEX = 1.

¿Alguien ha visto algo como esto antes?


#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

Además, el archivo de entrada no está formateado en un diseño realmente fácil de usar. Nuevamente, debido a ser generado desde una aplicación de terceros.

Hay líneas en blanco y la fila del encabezado no comienza en la fila 1.

A B C D E          F -------------------------------------------------- ------------------------ 01 | Título de Informe 02 | 03 | ColHeader1 ColHeader2 ColHeader3 ColHeader4 ColHeader5 ColHeader6 04 | Datos Datos Datos Datos Datos Datos 05 | Datos Datos Datos Datos Datos Datos 06 | Datos Datos Datos Datos Datos Datos 07 | Datos Datos Datos Datos Datos Datos 08 | Datos Datos Datos Datos Datos Datos 09 | 10 | Total: 5

La salida que estoy recibiendo se muestra a continuación.
(A) archivo original

Título del informe: F2: F3: F4: F5: F6:  Título del informe: ColHeader1 F2: F3: F4: F5: F6:

(B) archivo guardado de nuevo

Título del informe: F2: F3: F4: F5: F6:  Título del informe: ColHeader1 F2: ColHeader2 F3: ColHeader3 F4: ColHeader4 F5: ColHeader5 F6: ColHeader6  Título del informe: Datos F2: Datos F3: Datos F4: Datos F5: Datos F6: Datos  Título del informe: Datos F2: Datos F3: Datos F4: Datos F5: Datos F6: Datos  Título del informe: Datos F2: Datos F3: Datos F4: Datos F5: Datos F6: Datos  Título del informe: Datos F2: Datos F3: Datos F4: Datos F5: Datos F6: Datos  Título del informe: Datos F2: Datos F3: Datos F4: Datos F5: Datos F6: Datos  Título del informe: F2: F3: F4: F5: F6:  Título del Informe: Total: 5 F2: F3: F4: F5: F6:

Respuestas

0 para la respuesta № 1

En lugar de abrir los archivos de Excel con OLEDB,puede abrirlos en Excel desde Powershell ... Esta es una muestra rápida que solo imprime el tamaño de las hojas. El único problema con el que aprendí fue que tenías que salir completamente de Excel cada vez y eliminar cualquier resto (el material de GC al final).

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