Excel (*.xls) ファイル内のセルのテキスト値を取得するより良い方法
質問
Excelファイルからデータを取得するためのインポート関数を作成しようとしています。現在私がそれを行っている方法は次のとおりです。
Private Sub ReadExcel(ByVal childform As PhoneDiag.frmData, ByVal FileName As String)
Dim xlApp As Excel.Application
Dim xlWorkBook As Excel.Workbook
Dim xlWorkSheet As Excel.Worksheet
xlApp = New Excel.ApplicationClass
xlWorkBook = xlApp.Workbooks.Open(FileName)
xlWorkSheet = xlWorkBook.Worksheets(1)
Dim columnrange = xlWorkSheet.Columns
Dim therange = xlWorkSheet.UsedRange
''Add rows by column
For rCnt = 2 To therange.Rows.Count
Dim rowArray(therange.Columns.Count) As String
For cCnt = 1 To therange.Columns.Count
Dim Obj = CType(therange.Cells(rCnt, cCnt), Excel.Range)
Dim celltext As String
celltext = Obj.Value.ToString
rowArray((cCnt - 1)) = celltext
Next
childform.datagridSample.Rows.Add(rowArray)
Next
'' make sure we close the excel.exe service after use
xlWorkBook.Close()
xlApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
End Sub
問題はもちろん、動作がひどいことです。私が収集できる限り、それはおそらく次の行に帰着します。
Dim Obj = CType(therange.Cells(rCnt, cCnt), Excel.Range)
必要なのはセルからのテキストだけであり、セルごとにオブジェクトを作成する必要はありません(オブジェクトをガベージ コレクションに送信する必要はありません)。テキストを取得するだけの簡単な方法はありますか?
理想的には、セルのテキスト値を取得するメソッドを取得できれば、複数の rowArray() をマスター配列に追加して、後でプログラムの値を更新したいと考えています。
他にパフォーマンスに関するヒントがあれば、お知らせください。大変感謝しております。=b
編集:また、すべてのデータを保持するマスター配列、たとえば mArr を作成する場合、2 つのオプションがあることにも気付きました。mArr を大きくしてサブ配列を小さくするのと、mArr を小さくしてサブ配列に多くの情報を保持させる方が、パフォーマンスの観点からより良いでしょうか?
インポートされるファイルには列よりも行の方が多いため、それを「設定」する方法があるかどうか疑問に思っていたため、質問しました。
解決
セルの内容を個別に読み取ると、パフォーマンスが大幅に低下します。私のアドバイスは、まず範囲全体をオブジェクトの配列に読み取り、次にその配列からデータを取得することです。VB.NET では書きませんが、C# ではコードは次のようになります。
Excel.Range firstCell = excelWorksheet.get_Range("A1", Type.Missing);
Excel.Range lastCell = excelWorksheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
object[,] cellValues;
Excel.Range worksheetCells = excelWorksheet.get_Range(firstCell, lastCell);
cellValues = worksheetCells.Value2 as object[,];
この例では、シートの内容全体を cellValues に読み取ります (null に注意してください)。同じアドバイスがシートへの書き込みにも当てはまります。1 つの配列を使用して、すべてを一度に実行します。
興味があれば、これに関する長い投稿があります そこには
ああ、ところで、交換してください
xlApp = New Excel.ApplicationClass
による
xlApp = New Excel.Application
他のヒント
ここでのDataTableにデータを取得するC#バージョンは(しかし、あなたはその要旨を取得する)
...ですcon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+SpreadsheetLocation+";Extended Properties=\"Excel 8.0;IMEX=1;HDR=NO\"");
OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM ["+Worksheet+"$]", con);
DataTable dt = new DataTable();
da.Fill(dt);
ここで、「SpreadSheetLocation」と「ワークシート」は、それぞれのファイルのパスとワークシート名です。あなたが好きな場合は、その後のアレイにデータテーブルの行を変換することができます。
更新:あなたはまた、Excelは、このソリューションのためのマシンにインストールする必要はありません...
は、単純な読書のために、私は ExcelデータリーダーのCodePlexで利用可能を使用すると思います。
コンポーネントを使用してマシンは、Excelがインストールされている必要がありませんし、それを使用するのは非常に簡単です。あなたは、DataSetにワークシートを読むことができます。
.NET用SpreadshsetGear ワークブックを開いてセルの生の値 (数値、テキスト、論理値、またはエラー) にアクセスしたり、セルの書式設定されたテキストを取得したりできます。SpreadsheetGear は Excel のような COM 相互運用ではなくアプリケーションの一部として実行されるため、はるかに高速に実行されます (コメントを参照) このページ 一部のお客様がパフォーマンスについて何と言っているかを確認してください)。
ライブサンプルをご覧いただけます ここ 無料トライアルをダウンロードしてください ここ.
免責事項:私は SpreadsheetGear LLC を所有しています