あなたは、Excel データを DataTable に高速かつ効率的にインポートするという共通の課題に遭遇しました。 Microsoft Excel ドライバーを使用した現在の VB ソリューションは実行可能なアプローチですが、機能強化を提供できる代替方法をいくつか検討してみましょう。
C# を好む場合は、Ciarán から抜粋したスニペットを次に示します。 Walsh の答え:
string sSheetName = null; string sConnection = null; DataTable dtTablesList = default(DataTable); OleDbCommand oleExcelCommand = default(OleDbCommand); OleDbDataReader oleExcelReader = default(OleDbDataReader); OleDbConnection oleExcelConnection = default(OleDbConnection); sConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test.xls;Extended Properties=\"Excel 12.0;HDR=No;IMEX=1\""; oleExcelConnection = new OleDbConnection(sConnection); oleExcelConnection.Open(); dtTablesList = oleExcelConnection.GetSchema("Tables"); if (dtTablesList.Rows.Count > 0) { sSheetName = dtTablesList.Rows[0]["TABLE_NAME"].ToString(); } dtTablesList.Clear(); dtTablesList.Dispose(); if (!string.IsNullOrEmpty(sSheetName)) { oleExcelCommand = oleExcelConnection.CreateCommand(); oleExcelCommand.CommandText = "Select * From [" + sSheetName + "]"; oleExcelCommand.CommandType = CommandType.Text; oleExcelReader = oleExcelCommand.ExecuteReader(); nOutputRow = 0; while (oleExcelReader.Read()) { } oleExcelReader.Close(); } oleExcelConnection.Close();
.NET 用のマネージド Excel ライブラリと最新の Excel ファイル形式のサポートの両方を提供する NPOI ライブラリの使用を検討してください。 NPOI は、ODBC ドライバーを使用する場合と比較して速度が向上する可能性があります。
using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; public static DataTable ReadExcelSheet(string filePath, string sheetName) { var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read); var workbook = new HSSFWorkbook(stream); var sheet = workbook.GetSheet(sheetName); var table = new DataTable(); var firstRow = sheet.GetRow(0); for (int i = 0; i < firstRow.Cells.Count; i++) { table.Columns.Add(firstRow.Cells[i].ToString()); } for (int i = 1; i <= sheet.LastRowNum; i++) { var row = sheet.GetRow(i); var dataRow = table.NewRow(); for (int j = 0; j < row.Cells.Count; j++) { dataRow[j] = row.Cells[j].ToString(); } table.Rows.Add(dataRow); } return table; }
オブジェクトの破棄に関するご質問については、明示的に Dispose() を呼び出したり、変数を設定したりする必要はありません。 using ブロックが終了するとオブジェクトが自動的に破棄されるため、VB コードでは Nothing に変更します。ただし、一般的には、適切なリソース管理を確保するためにオブジェクトを明示的に破棄することをお勧めします。
速度が重要な要素の場合は、Excel ファイルを CSV ファイルに変換することを検討してください。 (.csv) を DataTable にインポートする前に。 CSV ファイルは単純な構造のプレーン テキスト ファイルであるため、読み取り速度が大幅に向上します。 TextFieldParser クラスを使用すると、CSV ファイルを効率的に読み取ることができます:
public static DataTable GetDataTableFromCSVFile(string csv_file_path) { var csvData = new DataTable(); using (var csvReader = new TextFieldParser(csv_file_path)) { csvReader.SetDelimiters(new string[] { "," }); csvReader.HasFieldsEnclosedInQuotes = true; var colFields = csvReader.ReadFields(); foreach (var column in colFields) { var dataColumn = new DataColumn(column); dataColumn.AllowDBNull = true; csvData.Columns.Add(dataColumn); } while (!csvReader.EndOfData) { var fieldData = csvReader.ReadFields(); //Making empty value as null for (int i = 0; i < fieldData.Length; i++) { if (fieldData[i] == string.Empty) { fieldData[i] = null; } } csvData.Rows.Add(fieldData); } } return csvData; }
以上がC# または VB.NET で Excel シートを DataTable に効率的に読み取るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。