QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

【C#】Excelの行をコピー

テンプレートを用意して、Excel出力をしています。

テンプレートには1ページ分の書式(罫線)だけを用意しておき、出力データが1ページ以上ある場合に、その1ページ分の行をコピーして、2ページ以降の必要行までの範囲に貼り付けようとしています。
初めはセルのコピーでやっていのたですが、それだと件数が多い時にコピー回数が増えてしまい処理速度がかなり遅くなる為、行のコピーで回数を減らしたいと思ってます。
ネットを使っていろいろと調べたのですが、みつけることができませんでした。

ご存知の方いらっしゃいましたらおしえてください。

質問者:かな

回答

かなさんの書き込み (2006-05-18 22:51) より:

初めはセルのコピーでやっていのたですが、それだと件数が多い時にコピー回数が増えてしまい処理速度がかなり遅くなる為、行のコピーで回数を減らしたいと思ってます。

ネットを使っていろいろと調べたのですが、みつけることができませんでした。

罫線だけをコピーしたいのであれば、罫線だけを引いた方がコストが低いです。
セルに含まれる、その他の書式・データなどなどの色んな情報までコピーする必要はないです。

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

じゃんぬねっとさん

返信ありがとうございました。

現状は、データを出力する前に必要ページ分だけコピーしています。
コピーをせずに、プログラム内で罫線を引く方法も考えたのですが、罫線が複雑ですのでその方法は諦めました。

投稿者:かな

編集 履歴 (0)

かなさんの書き込み (2006-05-18 23:28) より:

コピーをせずに、プログラム内で罫線を引く方法も考えたのですが、罫線が複雑ですのでその方法は諦めました。

複雑だからといって諦めてしまうのですか...

お気持ちはわからなくもないですが、
あれこれ悩んで工数を無駄にするよりは良いとは思います。

マクロの記録などを使って地道にやったとしても、そこまで面倒だとは思いません。
まずは、見合うほどのスピードアップになるかどうかの検証も必要ですけど...

_________________C# と VB.NET の入門サイト
じゃんぬねっと日誌

投稿者:じゃんぬねっと

編集 履歴 (0)

ディスク容量を気にせず、パフォーマンス重視という事を前提として

空のテンプレートを連続で貼り付けたシートをテンプレートファイルとして用意して置き、データ出力完了後に不要部を消す。
テンプレートを開くコスト(サイズの大きいファイルは開くのにも時間がかかる)も考えると、件数毎にそのテンプレートファイルを用意して置く。
毎回コピペするより不要な箇所を削除する方が、早かった気がします。

毎回、100ページ以上でる固定フォーマットの帳票では、それなりにパフォーマンスアップした経験があります。

ただ、途中でデータによって改ページとかは出来ません。
そういった場合は、コードで処理するしか無いですね。
どの程度のデータが出るとか、テンプレートの形式とかがわからないのでなんとも言えませんが。
その辺りを検討しなが、方式を考えて上手く行った時が楽しいんだけどね〜^^;

投稿者:買太郎

編集 履歴 (0)

じゃんぬねっとさん
買太郎さん

返信ありがとうございます。

連続で貼り付けたテンプレートを用意した方法でもやってみましたが、そうするとテンプレート自体が重くなってしまったせいか、少ない件数の場合の処理速度がかなり遅くなってしまった為、その方法は止めました。
ただ、大量データの時は40分くらいで出来ました。(それでも遅いのですが、1ページ毎にセルをコピーするやり方だと1時間待ってもダメでした)
現在の最大出力件数は6万行くらいです。

なので、今回1ページ分の行をコピーして、残りの行にいっきに貼り付けるやり方だと早くなるかなぁと思って試してみたいのですが、うまくいかない状態です。。

投稿者:かな

編集 履歴 (0)

以下は私が以前にCOM方式で使ったコードの一部です。

'テンプレートの4行目(1〜3行は表題部)に定義してある表示書式を複写し、
'5行目以降のデータ出力行に書式をコピーする。

range1 = (Excel.Range)mWorksheet.Cells[4, 1];
range2 = (Excel.Range)mWorksheet.Cells[4, MaxCol];
range1 = mWorksheet.get_Range(range1, range2);
range1.Copy(Type.Missing);

range1 = (Excel.Range)mWorksheet.Cells[5, 1];
range2 = (Excel.Range)mWorksheet.Cells[dataRowsCount, MaxCol];
range1 = mWorksheet.get_Range(range1, range2);

range1.PasteSpecial(Excel.XlPasteType.xlPasteFormats, Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, false, false);

投稿者:鎌田

編集 履歴 (0)

鎌田さん

教えていただいたやり方でやったら出来ました!
ありがとうございました!!!

大量データでのテストはまだなので、これからやってみます。

投稿者:かな

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。