0

重複の可能性:
C# から Excel に大量のデータをエクスポートするための最良/最速の方法は何ですか?

次の機能を備えた Web アプリケーションを作成しています。

  1. 管理者が事前定義された Excel テンプレート ファイルにいくつかのデータを保存するとします。管理者ページにアクセスして、この Excel をアップロードします。アプリケーションはこの Excel を読み取り、それに応じてデータベース内のデータを更新します。

  2. データベースに格納されたデータは、ViewDetails ページにアクセスするすべてのユーザーに表示される必要があります。これで、データが画面に表示され、[Excel にダウンロード] オプションが提供される必要があります。また、ユーザーは、データをフィルター処理してデータを並べ替えることができます。

行数が 10000 以上で、各行に約 10 ~ 15 列のテキスト/数値データがあるとします。

私の現在の考えは、Interop.Excel オブジェクトを使用して Excel テンプレートを読み取り、データベースにデータをアップロードすることです。読み取りでは、通常、すべてのデータを DataTable にフェッチし、必要に応じて表示します。並べ替えとフィルタリングの目的で DataView を使用する予定です。ただし、この規模のデータを扱ったことはなく、上記の方法を使用したパフォーマンスについてはわかりません。

私の質問は、私の要件を実現するための最善かつ最速の方法は何ですか? それだけの量のデータを Excel ファイルに書き込むのに約 2 ~ 3 分かかるとどこかで読みました。

また、OpenXML にも出会いました。「Open XML は、さまざまなプラットフォーム上の複数のアプリケーションで自由に実装できる、ワード プロセッシング ドキュメント、プレゼンテーション、およびスプレッドシートのオープン スタンダードです。」

要件をよりよく実現するために使用できますか、それとも他の方法がありますか? 私は最近 C# Web アプリケーションの開発を開始し、Excel スプレッドシートを初めて使用しました。前もって感謝します :)

4

4 に答える 4

3

epplus を使用して Excel ファイルを読み込んで保存することをお勧めします。非常に高速で用途が広いです。特にロードは簡単です:

 Try
            Dim existingFile As New FileInfo(path)

            Using ExcelPackage As New ExcelPackage(existingFile)
                Dim Wsht As ExcelWorksheet = Nothing

                Try
                    Wsht = ExcelPackage.Workbook.Worksheets(1)

                Catch ex As Exception

                End Try


                Dim tbl As New DataTable
                Dim hasHeader = True
                For i = 1 To Wsht.Dimension.End.Column
                    tbl.Columns.Add()
'this is very "dumb" if you need better column names just iterate over the file and get them
                Next

                Dim startRow = 1 '1 due to the excel quirk
                For rowNum = startRow To Wsht.Dimension.End.Row
                    Dim wsRow = Wsht.Cells(rowNum, 1, rowNum, Wsht.Dimension.End.Column)
                    Dim row = tbl.NewRow
                    For Each cell In wsRow
                        row(cell.Start.Column - 1) = cell.Text
                    Next
                    tbl.Rows.Add(row)
                Next
'do something with the tbl datatable


            End Using
        Catch ex As Exception

        End Try

欠点: 現在サポートされているのは xlsx ファイルのみです

于 2012-10-30T14:24:17.880 に答える
2

それはすべて、あなたが持っているデータの量、あなたがしたいこと(例えば、完全なフォーマットでExcelシートを生成する)、そしてあなたの予算に依存します。

私の意見では、Excelの相互運用は悪い考えです。特にサーバーでは、エラーが発生しやすくなります。実際、Officeアプリがサーバー上でマルチインスタンスを実行するのではなく、インタラクティブになるように構築されているという理由だけで、サーバー上で相互運用機能を実行することは決してありません。

私がうまく使用した2つの方法は、OpenXML(ただし、これは使いにくい)と商用のAsposeCellsライブラリです。後者は非常に高速で、実質的にすべてのExcelの機能をサポートします。詳細については、 http://www.aspose.com/categories/.net-components/aspose.cells-for-.net/default.aspxを参照してください

于 2012-10-30T13:39:10.490 に答える
1

個人的には、あなたがやりたいことを正確に行うプロジェクトがいくつかあるコードプレックスを見ていきます。Excel ファイルはオープン xml 形式ですが、非常に高速で煩雑になる可能性があります。次に、 com も使用できますが、それも面倒です。

http://exceldatareader.codeplex.com/

高速なデータ生成 -- 500,000 セルの一意の文字列を含む新しいワークブックを 10 秒未満で生成できます。

于 2012-10-30T12:46:30.153 に答える
0

複数のオプションを試す必要があります。時間を計って、状況に最適なパフォーマンスが得られるオプションを確認してください。1つのオプションは、あなたが言及した相互運用です。もう 1 つは、 JET SQL コマンドでOLE DB 接続を使用する方法です。書式設定は簡単に台無しになる可能性があることに注意してください。たとえば、シート名は、JET SQL クエリを記述するときに「テーブル名」になるため、アップロードごとに一貫性を保つ必要があります。これらのStackOverflow のヒントをお読みください。

于 2012-10-30T13:04:39.817 に答える