ホームページ > バックエンド開発 > C++ > C# または VB.NET で Excel シートを DataTable に効率的に読み取るにはどうすればよいですか?

C# または VB.NET で Excel シートを DataTable に効率的に読み取るにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-31 21:50:17
オリジナル
705 人が閲覧しました

How can I efficiently read Excel sheets into a DataTable in C# or VB.NET?

Excel シートを DataTable に読み取る: パフォーマンスと効率の最適化

あなたは、Excel データを DataTable に高速かつ効率的にインポートするという共通の課題に遭遇しました。 Microsoft Excel ドライバーを使用した現在の VB ソリューションは実行可能なアプローチですが、機能強化を提供できる代替方法をいくつか検討してみましょう。

C# 実装

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 に変更します。ただし、一般的には、適切なリソース管理を確保するためにオブジェクトを明示的に破棄することをお勧めします。

高速読み取りのための CSV 変換

速度が重要な要素の場合は、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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート