3

**更新 (2012.12.13) - サンプルコード、入力フォーマット、出力サンプルを追加

私はこれで数日間戦ってきましたが、アイデアが尽きてしまいました。複数の XLSX ファイルに対してスクリプトをテストしました (そして、スクリプトを目の前にしたら後でアップロードできます)。接続文字列が機能し、必要なデータを解析しています...

問題は、(サードパーティのレポート アプリケーションから生成された) 入力ファイルを処理しようとすると、データがワークシートから読み取られないことです。

Excel 内で入力ファイルを開いて保存すると (フォーマットの変更、データの入力/削除、変更はまったく行われません)、入力ファイルはすべてのデータを処理および解析します。

HDR=Yes/No や 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

また、入力ファイルは、本当に使いやすいレイアウトでフォーマットされていません。繰り返しますが、サードパーティのアプリケーションから生成されたためです。

空白行があり、ヘッダー行が行 1 から開始されていません。

      ABCDEF
   -------------------------------------------------- ------------------------
01 | レポートタイトル
02 |
03 | ColHeader1 ColHeader2 ColHeader3 ColHeader4 ColHeader5 ColHeader6
04 | データ データ データ データ データ データ
05 | データ データ データ データ データ データ
06 | データ データ データ データ データ データ
07 | データ データ データ データ データ データ
08 | データ データ データ データ データ データ
09 |
10 | 合計: 5

私が受け取っている出力を以下に示します。
(A) 元ファイル

レポートのタイトル:
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 :
4

1 に答える 1

0

Excel ファイルを OLEDB で開くのではなく、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
于 2012-12-13T20:41:33.013 に答える