Excel (*.xls) ファイル内のセルのテキスト値を取得するより良い方法

StackOverflow https://stackoverflow.com/questions/1685501

  •  18-09-2019
  •  | 
  •  

質問

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 を所有しています

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top