C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: C#からエクセルの離れたセルへ高速でデータを出力する


(過去ログ 111 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■65869 / inTopicNo.1)  C#からエクセルの離れたセルへ高速でデータを出力する
  
□投稿者/ ぱぬっち (1回)-(2013/03/21(Thu) 13:59:20)

分類:[C#] 

C#でエクセルにデータを出力するプログラムを作成しています。
高速に処理するため、配列をエクセルのRangeにセットしています。
その際、エクセルのRangeを次の様に記述するとうまくいきます。
@xlsSheet.Range["A1:A3"] 
一方、次の様に離れたセルを指定するとうまくいきません。
AxlsSheet.Range["A1,A3,A5"];
具体的にはAの場合はA3,A5もA1と同じ値がセットされてしまいます。

C#から配列のデータを出力する際、エクセルのRangeに離れたセルを指定する事はできないのでしょうか?

なんらかの方法で離れたセルへ高速で一括でデータを出力する方法をアドバイスして下さい。

引用返信 編集キー/
■65871 / inTopicNo.2)  Re[1]: C#からエクセルの離れたセルへ高速でデータを出力する
□投稿者/ 魔界の仮面弁士 (181回)-(2013/03/21(Thu) 14:56:54)
No65869 (ぱぬっち さん) に返信
> 高速に処理するため、配列をエクセルのRangeにセットしています。
Range オブジェクトの Areas プロパティを確認してみてください。
それが .Count == 1 の場合は一括代入できますが、.Count が
2 以上の場合は、Areas 単位で個別代入する必要があります。


> A3,A5もA1と同じ値がセットされてしまいます。
"A1:B3,D2:F6,F10" のように、Areas があらわすそれぞれの範囲が、
セル数の異なる Range となる場合、さらに面倒なことに…。

> C#から配列のデータを出力する際、エクセルのRangeに離れたセルを指定する事はできないのでしょうか?
(1) "A1:A5" の範囲の Range を用意する。
(2) その Range の Value プロパティで、5行1列の配列要素を受け取る。
(3) 受け取った配列の 1,3,5行目のみを書き換える。
(4) 元の Range の Value プロパティに書き戻す。

では駄目でしょうか。
値では無く数式なら、Value の代わりに FormulaR1C1 等で。
引用返信 編集キー/
■65874 / inTopicNo.3)  Re[2]: C#からエクセルの離れたセルへ高速でデータを出力する
□投稿者/ ぱぬっち (2回)-(2013/03/21(Thu) 16:20:40)
魔界仮面さん、返信ありがとうございます。
> (4) 元の Range の Value プロパティに書き戻す。
>
> では駄目でしょうか。
> 値では無く数式なら、Value の代わりに FormulaR1C1 等で。
目からウロコです。
凄くヒントになりました。
セルの歯抜け部分には、元々の値、数式をセットすることで対応しました。
本当にありがとうございました。
引用返信 編集キー/
■65882 / inTopicNo.4)  Re[3]: C#からエクセルの離れたセルへ高速でデータを出力する
□投稿者/ shu (237回)-(2013/03/21(Thu) 18:03:24)
No65874 (ぱぬっち さん) に返信
> セルの歯抜け部分には、元々の値、数式をセットすることで対応しました。
> 本当にありがとうございました。
魔界の仮面弁士さんの言っている内容と若干違う気がします。配列をセル範囲から
作成すればセルに設定されている値は配列に設定されるので、書き換えた部分だけ
配列の中を書き換え配列を同一セル範囲に上書きするという流れになると思いますが
ぱぬっち さんのやり方はあくまで作成した配列の全要素に書き込んでからセル範囲に
書くように見えるのですがそれだとパフォーマンスがよくない気がします。
引用返信 編集キー/
■65885 / inTopicNo.5)  Re[4]: C#からエクセルの離れたセルへ高速でデータを出力する
□投稿者/ 魔界の仮面弁士 (182回)-(2013/03/21(Thu) 19:27:59)
No65874 (ぱぬっち さん) に返信
> 魔界仮面さん、返信ありがとうございます。
…誰? (^^;


No65882 (shu さん) に返信
> ぱぬっち さんのやり方はあくまで作成した配列の全要素に書き込んでからセル範囲に
> 書くように見えるのですがそれだとパフォーマンスがよくない気がします。
Excel VBA の場合には同感ですが、C# からの通信ではどうでしょうか。
アウトプロセスである Excel との通信は比較的重い処理なので…。

未検証ですが、「各要素の値が事前に分かっている場合」には、
ぱぬっちさんの案の方が高速な気がします、なんとなく。

まぁ、C# 自身で配列を作成するのとどちらが早いのかは、
データ量にもよるでしょうし、一概には言えないかも知れませんが。

# そういえば、object 配列を代入するか dynamic を代入するかで
# 処理速度に差は出るのだろうか。
引用返信 編集キー/
■65892 / inTopicNo.6)  Re[5]: C#からエクセルの離れたセルへ高速でデータを出力する
□投稿者/ shu (239回)-(2013/03/21(Thu) 23:20:51)
No65885 (魔界の仮面弁士 さん) に返信
> ■No65882 (shu さん) に返信
>>ぱぬっち さんのやり方はあくまで作成した配列の全要素に書き込んでからセル範囲に
>>書くように見えるのですがそれだとパフォーマンスがよくない気がします。
> Excel VBA の場合には同感ですが、C# からの通信ではどうでしょうか。
> アウトプロセスである Excel との通信は比較的重い処理なので…。
>
> 未検証ですが、「各要素の値が事前に分かっている場合」には、
> ぱぬっちさんの案の方が高速な気がします、なんとなく。
既存値をどこから持ってくるかと考えたときにC#側プロセスのメモリ空間に持っていれば
速いと思うのですが、Excelのセルから書き換えないセルの情報を引っ張ってくることが
発生しそうな気がするので例えば10x10の矩形セル範囲の3セルを書き換えるとすると
97セル分情報を取得する処理を個々に行わなければならなくなるので10×10の分最初に
一括で取得した方が速そうな気がしたしだいです。新規シートからすべてプログラム上で
書き込めば前者の方法も可能だと思います。



引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -