|
分類:[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
上の'//の部分が時間をすごく掛かっています。
長い質問だったので申し訳ございません。。。 それでは、お願いします。
|