- PR -

EXCEL出力を高速にする方法

投稿者投稿内容
なな
ベテラン
会議室デビュー日: 2003/09/18
投稿数: 79
投稿日時: 2003-10-17 10:03
いつも参考にさせていただいてます。
現在ASP.NETでEXCEL帳票ツールを開発しています。
EXCEL側ではマクロなどは使わず、データベースから取得してきたデータを.NET側で
EXCELシートに埋め込んで、レコード数が複数になった場合は明細行(DETAILみたいなもの)
をどんどんEXCELシートに挿入していく、
とこんな感じなのですが
レスポンスが非常に悪いんです。
レコード件数がそれほど無い場合は気にはならないのですが
レコード数が何千件にもなると処理が全然終わらないのです。
EXCEL出力処理を高速にするコツなどがあればご教授願います。

なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-10-17 10:35
引用:

ななさんの書き込み (2003-10-17 10:03) より:
EXCEL側ではマクロなどは使わず、データベースから取得してきたデータを.NET側でEXCELシートに埋め込んで、レコード数が複数になった場合は明細行(DETAILみたいなもの)をどんどんEXCELシートに挿入していく、


EXCELシートへの埋め込みってどうやってるんでしょうか?
Excelのマクロでやるのと同じ感じですかね(.NET側から呼び出してるだけで)?

引用:

とこんな感じなのですが
レスポンスが非常に悪いんです。
レコード件数がそれほど無い場合は気にはならないのですが
レコード数が何千件にもなると処理が全然終わらないのです。
EXCEL出力処理を高速にするコツなどがあればご教授願います。


Excelのマクロでやるのと同じ感じの操作の場合は、それこそ「Excelマクロを高速化するには?」というようなのと同じ内容だと思います。

よくあるのは、
・各セル単位での値の設定や読み込みを減らす(配列などを作成して一括で行う)
・画面の更新を行わない(これは今回は関係なし?)
というあたりですかね。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-10-17 10:49
 Excelに出力するのと同じイメージのDataTableを用意し、ODBC接続で一気に流し込む。KB257819

 ただし、DataTableなので、列のデータは固定されます。同じ列に数値と文字列を混在させることはできません。明細行が必要なら、その行はあけておき、後からピンポイントで設定しても、たいした時間はかからないでしょう。

 それから、ご存じとは思いますが、エクセルの最大行数は65535(6?)なので、それを超える行は切り捨てられます。
Masa
会議室デビュー日: 2002/08/13
投稿数: 16
投稿日時: 2003-10-17 11:09
Masaです。

揚げ足取りのようで気が引けるのですが...
マクロ(オートメーション含む)で操作可能な行数は
16384行までだったかと...
なな
ベテラン
会議室デビュー日: 2003/09/18
投稿数: 79
投稿日時: 2003-10-17 11:25
なちゃさん、Jittaさん、 Masaさん返答ありがとうございました。
一括でデータを流し込む方法も考えたのですが
帳票が明細行だけでなく集計行が複数あるものなので集計行を挿入するタイミングを考えると
一括では難しいかなぁと思います。
現在は一時表ならぬ一時EXCELシートを改頁ごとに作成してそれから
本番用シートに値を設定するという感じです。
改頁はシートを分けることで対応しています。
デバック実行で追っていくと一時表に落とす時はそれほど時間はかからないのですが
一時表シートから本番用シートにデータを移動させる時に時間がかかるようです。
ヘッダーやフッターもあるのでそれらはセル名で直接設定して
明細行のものは行を増やしながら値を設定しています。
EXCELを使ってHEADER、DETAIL、FOODERが存在するようなレポートを
一般的な帳票ツールのように扱うこと自体無謀なのですかね・。


Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-10-17 11:39
引用:

Masaさんの書き込み (2003-10-17 11:09) より:

揚げ足取りのようで気が引けるのですが...
マクロ(オートメーション含む)で操作可能な行数は
16384行までだったかと...


 どのように扱ったときでしょう?とりあえず、マクロで
Public Sub testmac()
Dim r As Long
Dim c As Range
For r = 1 To 65536
Cells(r, 1) = r
Next
For Each c In Range("COL_B") ' "COL_B"は、B列全て
c(1, 1) = "AAA"
Next
End Sub
としてみると、65536行扱えています。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-10-17 12:06
引用:

ななさんの書き込み (2003-10-17 11:25) より:

EXCELを使ってHEADER、DETAIL、FOODERが存在するようなレポートを
一般的な帳票ツールのように扱うこと自体無謀なのですかね・。


 エクセル(に限らず、Office製品)の印刷は、実行される環境に依存するように思われます。他の人が作ったWord形式のドキュメントを表示したところ、改行位置が微妙に狂っている、という経験はないですか?どうも、実行された環境で使用しているプリンタとドライバより、印字可能範囲を取得し、その範囲に合わせて調整しているようなのです。Office製品は文字数を変更して調整しているようなのです。これはマニュアルや広報、技術文書に書いてあることではなく、経験的なことなので、正しいかどうかはわかりません。

他のことを調べていて、こんなの発見
[XL2002] 異なる環境で印刷範囲やセルの幅や高さが変わる場合の対策
http://support.microsoft.com/default.aspx?scid=kb;ja;400271&Product=excelJPN

[ メッセージ編集済み 編集者: Jitta 編集日時 2003-10-17 12:16 ]
Masa
会議室デビュー日: 2002/08/13
投稿数: 16
投稿日時: 2003-10-17 16:32
引用:

Jittaさんの書き込み (2003-10-17 11:39) より:
引用:

Masaさんの書き込み (2003-10-17 11:09) より:

揚げ足取りのようで気が引けるのですが...
マクロ(オートメーション含む)で操作可能な行数は
16384行までだったかと...


 どのように扱ったときでしょう?とりあえず、マクロで
Public Sub testmac()
Dim r As Long
Dim c As Range
For r = 1 To 65536
Cells(r, 1) = r
Next
For Each c In Range("COL_B") ' "COL_B"は、B列全て
c(1, 1) = "AAA"
Next
End Sub
としてみると、65536行扱えています。



なるほど。
jittaさんのやり方なら出来るわけですね。
一つ大人になりました。

私の作ったものではないのですが、当方の
顧客納入物にて16384行までしか扱えないも
のがあり、SheetオブジェクトのCellsプロ
パティにて直接行&列を指定して代入して
いました。

ソースはかなり汚いため掲載しませんが...

スキルアップ/キャリアアップ(JOB@IT)