2012-01-11 6 views
1

Fastest way to interface between live (unsaved) Excel data and C# objects Excelデータに効率的にアクセスする方法についての知識豊富なディスカッションがあります。答えによると、2つの推奨事項は、Excel-Dnaまたはアドインエクスプレスを使用することです。他のプロセスのライブExcelデータ/プロパティに最も高速にアクセスするには

Excel-Dnaとアドインエクスプレスの両方がExcelアドインとして実行する必要があると思います。私の場合、ビジネスロジックは別のプロセスで実行され、Excelインスタンス(New Excel.Application())が作成されます。 Excelの変更で内部オブジェクトを更新する必要があります。

Excelのセル値を取得するには、効率的にDirectCast(Range.Value, Object(,))を使用します。残念ながら、これはRange.TextまたはRange.NumberFormatのような他のプロパティでは不可能です。予想どおり、スルーセルの反復は非常に遅いです。

メインプロセスからExcelデータにアクセスする最も効率的な方法は何だと思いますか?私が思いついた1つのアイデアは、Excelにアドインを追加することです(Excel-Dnaと言っています)。データを集計してメインアプリケーションに投稿します。 AppDomainのクロスマーシャリングに関する経験があまりないので、これが実行可能なアプローチか、別のものが優先されるべきかどうか評価することができます。

+0

Range.Textの値を取得することは、精度が落ちたり、列幅が小さすぎると数値の代わりに###を取得したりする可能性があるため、通常はお勧めできません。 .Text .Valueの構成要素については、http://fastexcel.wordpress.com/2011/11/30/text-vs-value-vs-value2-slow-text-and-how-to-avoid-it/を参照してください。 .Value2 –

+0

合意しました.Value(2)と.NumberFormatを使用する方が良いです。だから問題は.NumberFormat(と2番目のステップで評価したい追加の書式設定プロパティ)を効率的にクエリする方法が残っています。 –

答えて

0

Excelを経由するのではなく、ダイレクトファイルリーダーを使用してファイルを読み取ることができます。 (Excelを自動化してファイルやファイルの一部をコピーする必要がある場合)

最初に、ClosedXMLを見ることをお勧めしますが、多くの同様のプロジェクトがあります。 ClosedXMLはアクティブなプロジェクトのように見え、COMインターフェイスをミラーリングしようとします。 [自分自身では経験がありません]

+0

こんにちはGovert、あなたの入力をありがとう。あなたがそう言っているなら、私は今Excel-Dnaがこの仕事のために作られていないことを100%確信しています:)。 XMLデータを使用することは興味深い回避策ですが、私はこのアプローチを検討します。 XMLデータは、XMLファイルとして保存する場合、またはクリップボードを使用して保存する場合にのみアクセスできます。 –

+0

Excel 2007以降、xmlファイルはデフォルトのファイル形式です。すべての.xlsxファイルは、xmlのすべてのコンテンツを含むちょうどzipファイルです。したがって、通常のExcel 2007/2010ファイルはClosedXMLによって処理されます。私はそれがクリップボードを通して動作するとは思わない。 Excel内でいくつかのアドインを実行し、独自のクロスプロセスデータ転送を行う場合は、Excel-DNAがアドインの理想的なツールになります。 C API。 – Govert

+0

実際には、[Excel 2003 XML Spreadsheet format](http://msdn.microsoft.com/en-us/library/aa140066%28v=office.10%29.aspx)を使用する予定です。書き込みや読み込み時のオーバーヘッドが少なくなります。データはクリップボード(フォーマット "XML Spreadsheet")から取得することもできますが、クリップボードをハイジャックするためのUI原則に違反していることは知っています。 –

0

セルの範囲から1つずつ数値形式を取得することは、技術によっては遅くなり(Interopでは遅くなります)、異なる数値形式の対応する配列を取得する方法がわかりません1つのオブジェクトモデルコールを使用します。
Excelのデータがクラスタの形式である場合、範囲内のすべてのセルが同じ数値形式を持ち、範囲内の数値形式のいずれかが異なる場合、Range("C1:C4").Numberformatは単一の数値形式を取得することができます

+0

あなたの考えをありがとう。共通のフォーマットを持つ範囲を決定する方法はないと思うので、フォーマットについての情報がないため、範囲でNumberFormatを使用することはできません(また、一貫性がない場合はNullを取得することもできません)。 –

+0

OK:好奇心の質問 - とにかくフォーマットされたデータが必要なのはなぜですか?実際のデータではなく、実際の値に比べて精度などが失われていますか? –

+0

これは目的を表示するためのものです:私は、ユーザーが "Excelのようなフォーマット"のようなスイッチを設定できるようにしたいので、数字形式を2度心配する必要はありません。 .Value/Value2からの実際のデータは、出力を生成するためにフォーマットと一緒に格納され、使用されます。 –

関連する問題