2

私の現在のプロジェクトの一部には、120,000 以上のレコードを含む大きな SQL テーブルから Excel ワークシートを作成することが含まれます。現在、SqlDataReader を while ループで使用して、新しい Excel シートに直接データを入力していますが、明らかに非現実的な時間がかかります。StringBuilder を使用してローカルの .CSV ファイルを作成し、それを Excel で開く方が高速なオプションのようです。1,000 行ごとにデータをファイルにダンプするか、一度にすべて書き込むことをお勧めしますか? または、私が考慮していないこのデータをインポートするより効率的な方法はありますか?

データセットはユーザー入力によって異なるため、既存のファイルに単純に追加することはできません。

現在のコード:

SqlConnection cnnct = new SqlConnection("Data Source=Source;Initial Catalog=Catalog;Integrated Security=True;");
            cnnct.Open();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = cnnct;
            string cmdText = "SELECT * FROM TABLE";
            cmd.CommandText = cmdText;

            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                columnChar = 'A';
                rowCount++;

                cellName = columnChar.ToString() + rowCount.ToString();
                    ws.get_Range(cellName, cellName).Value2 = dr["EXAMPLE_FIELD"].ToString();
                    columnChar++;
                //The above three lines are identical for each field (there are 26)
            }
4

3 に答える 3

2

まあ、Excel の相互運用は何としてでも避けたいと思います。.CSV ファイルを作成するというアイデアには、多くのメリットがあります。いつものように「最高の」パフォーマンスは環境に依存しますが、単体テストは常に役に立ちます。

System.IOはかなり最適です。行を読み取っSqlDataReaderて CSV 行を書き込むだけです。非常に単純なコードになり、かなり「速い」に違いありません。

幸運を。

于 2012-11-27T15:27:24.843 に答える
1

.Value2大きな問題の 1 つは、Excel シートをセルごとに入力していることです。これは、 setterを呼び出すたびに COM 相互運用呼び出しを行っているため、処理が遅くなります。

Excelに入れる予定のすべてのデータ(M行×N列)に配列を割り当て、その範囲を表す範囲オブジェクトを作成し、.Value2セッターを使用して配列を範囲にコピーすると、はるかに高速になります。

于 2012-11-27T15:17:35.270 に答える
0

Using DocumentFormat.OpenXml.Spreadsheet in c#, you can write that dataset to Xlsx format or create xml file using System.xml or use thrid party tool/create own excel xml, to create xls format.

于 2012-11-27T15:09:41.847 に答える