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

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

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

Re[5]: エクセルへの出力方法


(過去ログ 35 を表示中)

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

■17452 / inTopicNo.1)  エクセルへの出力方法
  
□投稿者/ サリ (8回)-(2008/04/24(Thu) 16:21:08)

分類:[VB.NET/VB2005] 

お世話になります。
現在、windowsアプリケーションで、エクセル出力のロジックを考えています。

とりあえず出力対象となるデータをデータセットに入れてみたのですが、
レコード数40000↑、カラム数60 ありました。

これを、エクセルオブジェクトを作成し、エクセルに1セルずつ貼っていくと、
膨大な時間がかかってしまいます。

そこで、他に何か方法が無いかと思い、質問させていただきました。
(私自身、エクセル出力のロジックは、ループで1セルずつ貼っていく方法しか知らないのですが、
例えば、行単位で出力できるとか、そういう方法があれば教えていただきたいです。)

そもそもレコード数が40000を越えるデータを、行数が65536しかないエクセルに出す というのも
なんだか間違っているような気もしないでもないですが・・・・。

他にも、40000レコードもあるデータを出力するとなると、一般的にはどんな形式で出力しているのかとか、
そういったことでもいいので、教えてください。

宜しくお願いいたします。
引用返信 編集キー/
■17453 / inTopicNo.2)  Re[1]: エクセルへの出力方法
□投稿者/ サリ (9回)-(2008/04/24(Thu) 16:26:18)
2008/04/24(Thu) 16:31:09 編集(投稿者)

なお、追記になりますが、
出力の際は、ただデータセットの情報を出力するだけでなく、
手動でヘッダ情報(帳票名称や出力日、出力条件など)を埋め込む予定です。


環境は、
VB.NET Windowsアプリケーション
SQLServer2005 です。


以上、宜しくお願いします。
引用返信 編集キー/
■17455 / inTopicNo.3)  Re[1]: エクセルへの出力方法
□投稿者/ 魔界の仮面弁士 (692回)-(2008/04/24(Thu) 17:15:23)
No17452 (サリ さん) に返信
> これを、エクセルオブジェクトを作成し、エクセルに1セルずつ貼っていくと、
> 膨大な時間がかかってしまいます。

Excel の Range オブジェクトは、複数のセル範囲を指し示すこともできます。
この場合、Value プロパティに配列を渡すことで、複数セルへの一括代入が可能です。
 oRange = oSheet1.Range("A1:B3")
 oRange.Value = 配列データ

こうする事で、プロパティの呼び出し回数が減るため、処理時間を大幅に削減できます。
(ただし、セル範囲が巨大になる場合は、何回かに分割した方がパフォーマンスが良いでしょう)


その他の手法としては、
 ・CopyFromRecordset メソッドを利用してデータを貼り付ける
 ・タブ区切りテキストとして用意しておき、それを Excel に開かせる
といった方法を使う事もできますね。


> そこで、他に何か方法が無いかと思い、質問させていただきました。

そもそも、内部から Excel VBA から呼び出すのに比べると、
外部から Excel を操作する行為というのは、処理効率は良くありません。
また、Excel ライブラリ自体が巨大であるため、そのロード時間もかかります。


処理量によっては、Excel ライブラリを使わずに、Excel データを直接生成するという
手法を検討すべきかも知れません。

たとえば、ExcelCreator 等を使えば、*.xls や *.xlsx を高速に生成する事ができるでしょう。
また、*.xlsx であれば、中身は zip + xml データなので、構造さえ理解してしまえば、
VB から直接生成する事も可能ですね。

> そもそもレコード数が40000を越えるデータを、行数が65536しかないエクセルに出す というのも
> なんだか間違っているような気もしないでもないですが・・・・。
Excel 2007 や Excel 2008:mac では、1,048,576行までサポートされていますね。


> 他にも、40000レコードもあるデータを出力するとなると、一般的にはどんな形式で出力しているのかとか、
当方だと、タブ区切りテキストとか、ADTGバイナリとか、mdb とか…かな。

ただ、出力形式とは、そのデータを何のために出力するのかによって定められる物なので、
利用目的が分からないことには、どの形式が良いのかという結論には至らないかと思います。
引用返信 編集キー/
■17456 / inTopicNo.4)  Re[2]: エクセルへの出力方法
□投稿者/ サリ (10回)-(2008/04/24(Thu) 17:50:49)
魔界の仮面弁士 様
早速の回答ありがとうございます。

> Excel の Range オブジェクトは、複数のセル範囲を指し示すこともできます。
>  ・CopyFromRecordset メソッドを利用してデータを貼り付ける
>  ・タブ区切りテキストとして用意しておき、それを Excel に開かせる
 知らなかったので、とても参考になります。
 この手法を使ってみようと思います。

> 処理量によっては、Excel ライブラリを使わずに、Excel データを直接生成するという
> 手法を検討すべきかも知れません。
> たとえば、ExcelCreator 等を使えば、*.xls や *.xlsx を高速に生成する事ができるでしょう。
 まったく仰るとおりです。
 ただ今回は都合上、外部ツールを使うことができないため、力技です(汗)。

> Excel 2007 や Excel 2008:mac では、1,048,576行までサポートされていますね。
 そうでした;;。すみません。
 一応、今回はExcel2003を想定してます。

> 当方だと、タブ区切りテキストとか、ADTGバイナリとか、mdb とか…かな。
> ただ、出力形式とは、そのデータを何のために出力するのかによって定められる物なので、
> 利用目的が分からないことには、どの形式が良いのかという結論には至らないかと思います。
 すみません、利用目的を最初に書くべきでした・・。
 とりあえず、今回出力するのは明細単位の請求データなのですが、
 エクセルに一覧形式で出した後で加工をしたいというお話でした。


いろいろと丁寧に説明して頂き、本当にありがとうございました。
とりあえず、セル毎に出す という以外の方法を提示していただいたので、
そちらから調べてみたいと思います。

念のため、今日いっぱい開いておきます。
引用返信 編集キー/
■17459 / inTopicNo.5)  Re[3]: エクセルへの出力方法
□投稿者/ 出水 (36回)-(2008/04/24(Thu) 21:03:07)
私の場合、エクセルに持っていくときはcsvを良く使ってますね
まぁ、タブ区切りとあんまり変わりませんが

そういえば、Officeのデータはxmlをzipで圧縮した形式なので
簡単に加工できます、ってこないだのMSCで言ってたような気がします

少なくとも私の持っているバージョンだと出来なかったので
いつから出来るようになっているのかは知らないのですが、
2007だと、そういう方法もありなのかもしれません
引用返信 編集キー/
■17469 / inTopicNo.6)  Re[4]: エクセルへの出力方法
□投稿者/ サリ (11回)-(2008/04/25(Fri) 10:15:48)
出水様
回答ありがとうございます。

> そういえば、Officeのデータはxmlをzipで圧縮した形式なので
すみません、これは初めて聞きました。勉強になります。

Office Open XML・・これのことでしょうか?
http://hibi.hamazo.tv/e786551.html

2007からのようですね。
私はまだ2003なのでダメですがいろいろ勉強してみようと思います。


どうもありがとうございました!!
解決済み
引用返信 編集キー/
■17502 / inTopicNo.7)  Re[5]: エクセルへの出力方法
□投稿者/ 魔界の仮面弁士 (693回)-(2008/04/25(Fri) 18:37:24)
No17469 (サリ さん) に返信
>>そういえば、Officeのデータはxmlをzipで圧縮した形式なので
> すみません、これは初めて聞きました。勉強になります。
> Office Open XML・・これのことでしょうか?

ですます。No17455にて回答した
>> *.xlsx であれば、中身は zip + xml データなので、
がそれに相当します。

細かい仕様についてはこちら。
http://www.ecma-international.org/publications/standards/Ecma-376.htm
http://msdn2.microsoft.com/en-us/library/aa338205.aspx


> 私はまだ2003なのでタ゛メですがいろいろ勉強してみようと思います。
2003 から読み書きも可能ですから、使えないというわけではありませんよ。
Office Update 等による機能追加が必要になりますけれども。
http://www.microsoft.com/downloads/details.aspx?FamilyId=941B3470-3AE9-4AEE-8F43-C6BB74CD1466&displaylang=ja


で、そうした追加インストールをせずとも、Excel 2003 は標準で「XML スプレッドシート形式」という
テキスト形式の保存形式をサポートしています。非圧縮なのでファイルサイズ面では不利ですけれども。
(Excel の「名前を付けて保存」から、XML スプレッドシート形式のテキストファイルを生成できます)
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -