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

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

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

グリッドの内容をExcelコピー


(過去ログ 6 を表示中)

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

■6306 / inTopicNo.1)  グリッドの内容をExcelコピー
  
□投稿者/ なりたい 二等兵(1回)-(2006/09/05(Tue) 20:01:19)

分類:[C#] 


分類:[C#] 

こんばんわ。

はじめまして。

今、グリッドの項目をExcelファイルに保存する作業をやってます。
それで、大きな問題があるので皆さんに質問します。

まず、Microsoft Visual Studio .Net2003, Windwos XP, Excel2000の環境です。
そして、C1ComponentOne と言う事を使っています。

1.プログラムでExcelを操作するとメモリ問題。
vb.netのrange.value "=SUM(A" & Col1 & ":A" & Col2 & ")"
上のようにすれば、Excelの数式が出来ますが、データが多いと「メモリ不足」。

その前の作業は
1)グリッドの内容を編集します。
2)グリッドの内容をExcelに全てコピーします。(C1FlexGridのメソッドを使っています。)
3)保存したExcelファイルを
「DirectCast(CreateObject("Excel.Application"), Excel.Application)」
でメモリ上に呼び出します。
4)"=SUM(A" & Col1 & ":A" & Col2 & ")"と"=INT(D" & j & " * F" & j & ")"をExcelファイルに適用する作業をします。
5)もう一度Excelファイルを保存します。
つまり、FileIOが多いので時間もすごく掛かるし、そのせで「メモリ不足」になるんだと思っていますが。

普通、Excelファイルの行は3000以上です。そして、4)の作業はそのExcelファイルを一つずつ比べてSumとかINTをExcelファイルに書きます。かなり悪いと思います。

で、C1ComponentOneに有る機能を使うと思いましだが、
C1のはSumとINTなどのExcel数式が適用出来ません。

下に問題のコードを付けます。
一部分ですので、実行は出来ません。

'明細Excel出力
Public Function Write_DetailExcel() As Boolean
Dim strStartCol, strEndCol As String
 Try
Const ColKin As Integer = 7 '金額欄です。

   'Excelファイルを最後の行まで読みます。
For i As Integer = 0 To intEnd

'/////////////////////////////////////////////////////////////////////////
'ページが区別されています。
For j As Integer = alExcelStartRow(i) + 1 To alExcelEndRow(i) Step 2
xlRange = DirectCast(xlParentRange(j, ColKin), Excel.Range)
xlRange.pagebreak = Excel.XlPageBreak.xlPageBreakManual
   
'一般項目ならD欄とF欄を掛けて金額欄に付けるExcel数式が必要です。
xlRange.value = "=INT(D" & j & " * F" & j & ")" 
xlRange = Nothing
Next j

'/////////////////////////////////////////////////////////////////////////

'一つのページ処理が終わったらこのページの小計を付けます。
strStartCol = CStr(CInt(alExcelStartRow(i)) + 1)
strEndCol = CInt(alExcelEndRow(i))
xlRange = DirectCast(xlParentRange(strEndCol + 2, ColKin), Excel.Range)
xlRange.pagebreak = Excel.XlPageBreak.xlPageBreakManual
xlRange.value = "=SUM(G" & strStartCol & ":G" & strEndCol & ")"

Next i

Catch ex As Exception
Return False
End Try
End Function

上の'//の部分が時間をすごく掛かっています。

長い質問だったので申し訳ございません。。。
それでは、お願いします。

0
引用返信 編集キー/
■6342 / inTopicNo.2)  Re[1]: グリッドの内容をExcelコピー
□投稿者/ JEI 二等兵(1回)-(2006/09/07(Thu) 15:04:14)

分類:[C#] 

[回答ではありません]

> つまり、FileIOが多いので時間もすごく掛かるし、そのせで「メモリ不足」になるんだと思っていますが。

『FileIO』の回数を減らしてみてはいかがでしょうか
データの編集全てを終わらせてから
最後にExcelにはりつけるだけでは駄目なのですか?


0
引用返信 編集キー/
■6343 / inTopicNo.3)  Re[2]: グリッドの内容をExcelコピー
□投稿者/ 特攻隊長まるるう 一等兵(31回)-(2006/09/07(Thu) 16:49:43)

分類:[C#] 

とりあえず、
http://jeanne.wankuma.com/tips/programing/releasecom.html
> xlRange = Nothing
では解放できてないのでは?と思われますので。

Excel はセル1つ1つにアクセスすると極端に遅くなります。
xlRange.value は複数セル指定での書き込みができます。
object 型の二次元配列を用意し、それと同じ大きさの
Range に1命令で書き込んでみてください。

0
引用返信 編集キー/
■6402 / inTopicNo.4)  Re[3]: グリッドの内容をExcelコピー
□投稿者/ なりたい 二等兵(3回)-(2006/09/11(Mon) 10:10:38)

分類:[C#] 

No6343に返信(特攻隊長まるるうさんの記事)
> とりあえず、
> http://jeanne.wankuma.com/tips/programing/releasecom.html
>>xlRange = Nothing
> では解放できてないのでは?と思われますので。
>
> Excel はセル1つ1つにアクセスすると極端に遅くなります。
> xlRange.value は複数セル指定での書き込みができます。
> object 型の二次元配列を用意し、それと同じ大きさの
> Range に1命令で書き込んでみてください。

JEI 二等兵さん、特攻隊長まるるう 一等兵さんお答えありがとうございました。
とにかく解決しました。
なぜか良く分らないんですが、何とかできました。。。
セルを更新した後、最後に下のようにしたら、うまくリリースできました。
Dim Hs As Excel.HPageBreaks = xlWorkSheet.HPageBreaks
Dim H As Excel.HPageBreak = Hs.Add(xlRange)
System.Runtime.InteropServices.Marshal.ReleaseComObject(H)
System.Runtime.InteropServices.Marshal.ReleaseComObject(Hs)


解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -