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

DataGridからExcelへのダウンロードの高速化

いつもこの会議室を参考にしています。
現在、DataGridからExcelへのダウンロード機能を開発しております。
ダウンロードは出来るようになったのですが、
非常に時間がかかります。例えば、カラム数が40近くで
行数が250あるとしたら、大体70秒近くかかってしまいます。
以下の例より、もっと効率よく、処理が早く出来る方法はあるんでしょうか?
よろしくお願いします。

Dim Excel As Excel.Application
Dim ExcelBook As Excel.Workbook
Dim ExcelSheet As Excel.Worksheet
Dim myRow As DataRow
Dim myColumn As DataColumn
Dim colIndex As Integer
Dim rowIndex As Integer

Excel = CType(CreateObject("Excel.Application"), Excel.Application)
ExcelBook = CType(Excel.Workbooks.Add, Excel.Workbook)
ExcelSheet = CType(ExcelBook.Worksheets(1), Excel.Worksheet)

'ヘッダー部分の挿入
For Each myColumn In DataTable.Columns
colIndex += 1
ExcelSheet.Cells(1, colIndex) = myColumn.ColumnName
Next

rowIndex = 1

For Each myRow In DataTable.Rows
rowIndex += 1
colIndex = 1
Dim myColumn2 As DataColumn
For Each myColumn2 In DataTable.Columns
colIndex += 1
ExcelSheet.Cells(rowIndex, colIndex) = _
myRow(myColumn2.ColumnName).ToString()
Next myColumn2

Next myRow

ExcelSheet.Cells.EntireColumn.AutoFit()
ExcelSheet.Range("A1").Select()
ExcelSheet.Application.Visible = True

質問者:宇宙人

回答

DataGridが吐くHTMLタグをそのままExcelに読ませる。
頁にDataGridを一つ置いて、
Response.ContentType = "application/vnd.ms-excel"
とし、データバインドするだけ。
[ メッセージ編集済み 編集者: todo 編集日時 2004-03-23 17:06 ]

投稿者:todo

編集 履歴 (0)

todoさん、早速のお返事ありがとうございます。
実はDataGridからExcelへの吐き出しを、Web Applicationではなく
Windows Applicationで作っております。
説明不足で申し訳ないです。Windows Applicationの場合でも
何かご存知でしょうか?

投稿者:宇宙人

編集 履歴 (0)

2次元配列を使って一気に代入するとか。(Range)

市販コンポーネントでよければ、Excelクリエータがあります。
あるいは、市販のGridで、そのままExcelに保存できるかもしれない。

投稿者:todo

編集 履歴 (0)

1年前にC#の勉強をしようと同じことをやっていました。
しかも下記のような貧弱なコードで、遊びで作ったので動けば良しでした。
(今見たらとても恥ずかしいコード・・・・・)
やっぱ時間はかかってます。

        int col;
        int row;
        int c;

        sheet.Cells[1,1]="項目0";
        sheet.Cells[1,2]="項目1";
        sheet.Cells[1,3]="項目2";
        sheet.Cells[1,4]="項目3";
        sheet.Cells[1,5]="項目4";
        sheet.Cells[1,6]="項目5";
        sheet.Cells[1,7]="項目6";
        c=this.BindingContext[dataset,table].Count;

        for(col=1; col<8;col++)
            for(row=2; row<c+1; row++)
            {
                sheet.Cells[row,col] = dataGrid1[row-2,col-1];
            }
        }

今ふと思いました。(未確認ですみません)
DataGrid の1つのカラム全体をExcel の列へコピーってできないのかな?

投稿者:じいじ

編集 履歴 (0)

[HOW TO] ASP.NET、ADO.NET、および Visual C# .NET を使用して Excel データをクエリし、表示する方法
http://support.microsoft.com/default.aspx?scid=kb;ja;306572

[HOWTO] Visual Basic .NET と ADO.NET を使用して Excel ブックのレコードの取得と変更を行う方法
http://support.microsoft.com/default.aspx?scid=kb;ja;316934

[HOW TO] Visual Basic .NET を使用してデータを Excel ブックに転送する方法
http://support.microsoft.com/default.aspx?scid=kb;ja;306022

この辺かな?

 問題は、1つの列に数値と文字列、日付などの「データ型」が混在したときです。列全体が、一番多いデータ型として、扱われます。また、nullは文字列として扱われます。

既出のような???

検索文字列を忘れていました。
「.NET Framework」カテゴリから、「excel」を検索すると、出てきませんでした。なぜ?そこで、「All Products」カテゴリを、「ado excel」で検索しました。
[ メッセージ編集済み 編集者: Jitta 編集日時 2004-03-24 09:55 ]

投稿者:Jitta

編集 履歴 (0)

Windows ApplicationからWebのDataGridを使う手があります。

System.Webを参照設定して

System.Web.UI.WebControls.DataGrid dg = new System.Web.UI.WebControls.DataGrid();
dg.DataSource = データテーブル等;
dg.DataBind();

System.IO.StreamWriter sw = new System.IO.StreamWriter("hoge.xls");
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(sw);
dg.RenderControl(hw);
sw.Close();

高速、安定が売りです。Excelに読み込ませるとき少し重い。

投稿者:todo

編集 履歴 (0)
ウォッチ

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