PowerShell | OLEDB | Excel | 无法从第三方应用程序创build的XLSX中读取数据

**更新(2012.12.13) – 增加示例代码,input格式,输出示例

我已经为此奋斗了几天了,现在我已经没有想法了。 我已经testing了一个脚本(并且可以在我之前上传,稍后再上传),以对付多个XLSX文件。 我有连接stringfunction,parsing我需要的数据等…

问题是,当我尝试处理我的input文件(从第三方报告应用程序生成)时,不从工作表中读取数据。

如果我在Excel中打开并保存input文件(没有格式变化,没有数据input/删除,根本没有修改),input文件将处理和parsing所有数据。

我已经尝试在连接string中使用多个“扩展属性”设置,无济于事,包括HDR =是/否和IMEX = 1。

任何人都见过这样的事情吗?


#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 = ".\OLEDB\test\" #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 

此外,input文件没有格式化为一个非常容易使用的布局。 同样,由于从第三方应用程序生成。

有空行,标题行不在第1行开始。

       ABCDEF
    -------------------------------------------------- ------------------------
 01 |  ReportTitle
 02 |
 03 |  ColHeader1 ColHeader2 ColHeader3 ColHeader4 ColHeader5 ColHeader6
 04 | 数据数据数据数据数据
 05 | 数据数据数据数据数据
 06 | 数据数据数据数据数据
 07 | 数据数据数据数据数据
 08 | 数据数据数据数据数据
 09 |
 10 | 总计:5

我收到的输出如下所示。
(一)原始文件

报告标题:
 F2:
 F3:
 F4:
 F5:
 F6:

报告标题:ColHeader1
 F2: 
 F3: 
 F4: 
 F5: 
 F6:

(B)重新保存文件

报告标题:
 F2:
 F3:
 F4:
 F5:
 F6:

报告标题:ColHeader1
 F2:ColHeader2
 F3:ColHeader3
 F4:ColHeader4
 F5:ColHeader5
 F6:ColHeader6

报告标题:数据
 F2:数据
 F3:数据
 F4:数据
 F5:数据
 F6:数据

报告标题:数据
 F2:数据
 F3:数据
 F4:数据
 F5:数据
 F6:数据

报告标题:数据
 F2:数据
 F3:数据
 F4:数据
 F5:数据
 F6:数据

报告标题:数据
 F2:数据
 F3:数据
 F4:数据
 F5:数据
 F6:数据

报告标题:数据
 F2:数据
 F3:数据
 F4:数据
 F5:数据
 F6:数据

报告标题:
 F2:
 F3:
 F4:
 F5:
 F6:

报告标题:总计:5
 F2:
 F3:
 F4:
 F5:
 F6:

而不是用OLEDB打开Excel文件,你可以在Powershell的Excel中打开它们…这是一个快速的示例,只是打印表单的大小。 我学到的唯一问题是,你必须每次都彻底退出Excel,并清除它的任何剩余部分(最后GC的东西)。

 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