インフラジスティックス・ジャパン株式会社のBlog

インフラジスティックス・ジャパン株式会社のチームメンバーが技術トレンド、製品Tips、サポート情報からライセンス、日々の業務から感じることなど、さまざまなトピックについてお伝えするBlogです。

チャート + グリッドのExcel出力

image

上の図のような「チャート+グリッド」といった画面構成はよくあるパターンかと思いますが、本ポストではこの「チャート+グリッド」をこのイメージのままエクセルへ出力する方法について書きたいと思います。

 

この「チャート+グリッド」イメージは弊社コントロールの UltraChart と WebDataGrid を利用していますが、それぞれの実装方法については割愛させていただきます。※実装コードを確認したい方は 添付サンプル をご参照下さいませ。

 

WebDataGrid コントロールには、表示している内容をそのままエクセル出力するための WebExcelExporter コントロールが用意されています。最もシンプルな利用方法としては、以下のコード1行だけで、グリッドの内容を元にエクセルブックを生成してクライアントへダウンロードさせること(レスポンスの書き換え)まで行ってくれます。

this.WebExcelExporter.Export(this.WebDataGrid1);

image 
グリッドのみエクセル出力した場合

今回はグリッドだけでなくチャートも同じシート内に一緒に出力したいため、事前にチャートを画像として保存し、エクセルのシートへ貼り付ける必要があります。
具体的には以下のようなコードになります。

        // ************************************************
        // Excel出力
        // ************************************************
        protected void LinkButton1_Click(object sender, EventArgs e)
        {
            //チャートから画像を出力する
            string fileName = "chartImageForExport.bmp";
            UltraChart1.SaveTo(fileName, System.Drawing.Imaging.ImageFormat.Bmp);

            //Saveした画像の取得
            System.Drawing.Image image = System.Drawing.Image.FromFile(fileName);
            Infragistics.Documents.Excel.WorksheetImage imageShape =
              new Infragistics.Documents.Excel.WorksheetImage(image);

            //Excel出力用のワークブックとワークシートを準備
            Infragistics.Documents.Excel.Workbook workbook = new Infragistics.Documents.Excel.Workbook();
            Infragistics.Documents.Excel.Worksheet worksheet1 = workbook.Worksheets.Add("Sheet1");

            // チャート画像出力先の開始位置の指定
            Infragistics.Documents.Excel.WorksheetCell cellB2 = worksheet1.Rows[1].Cells[1]; //チャート画像の出力先の開始位置
            imageShape.TopLeftCornerCell = cellB2;
            imageShape.TopLeftCornerPosition = new PointF(0.0F, 0.0F);

            // チャート画像出力先の終了位置の指定
            Infragistics.Documents.Excel.WorksheetCell cellJ17 = worksheet1.Rows[16].Cells[9]; //チャート画像の出力先の終了位置
            imageShape.BottomRightCornerCell = cellJ17;
            imageShape.BottomRightCornerPosition = new PointF(100.0F, 100.0F);

            // シートに画像を追加
            worksheet1.Shapes.Add(imageShape);
            
            //Worksheet1の19行目のB列目からグリッドの内容をエクスポート(レスポンスヘッダは書きかえない)
            WebExcelExporter1.Export(worksheet1, 18, 1, WebDataGrid1);

            // ******************************************
            // エクセル出力
            // ******************************************
            // メモリストリーム
            System.IO.MemoryStream theStream = new System.IO.MemoryStream();

            // ストリームに作成したワークブックを保存
            workbook.Save(theStream);

            // レスポンスヘッダの書きかえ
            byte[] byteArr = (byte[])Array.CreateInstance(typeof(byte), theStream.Length);
            theStream.Position = 0;
            theStream.Read(byteArr, 0, (int)theStream.Length);
            theStream.Close();
            Response.Clear();
            Response.AddHeader("content-disposition", "attachment; filename=ExportedTo.xlsx");
            Response.BinaryWrite(byteArr);
            Response.End();
        }

まず初めに、UltraChart の SaveTo メソッドでチャートのイメージをビットマップ形式でサーバ側に保存しています※パスは変数 FileName へ。(6~13行目)

次に 弊社のエクセルエンジン(Infragistics.Document.Excel)を使いエクセルブック及びそれに紐づくエクセルシートを生成しています。(15~17行目)

続いて、生成したシートに対して開始位置と終了位置を指定しつつ、出力したチャートの画像を貼り付けています。(19~30行目)

その後、WebExcelExporter の Export メソッドにて、引数で出力対象となるシートと出力開始位置(ここでは19行目のB列から)をしていしてグリッドの内容をエクスポートしています※ブックかシートを引数で渡している時はレスポンスの自動書き換えは発生しない。(32~33行目)

そして最後に生成されたエクセルブックをレスポンスとしてクライアントへ返すことで、チャート+グリッドのエクセル出力を実現しています。(35~52行目)

image

こういったエクスポート機能はユーザに喜ばれる需要のあるモノかと思いますが、比較的簡単に実現できるんです!

 

 

 

[サンプルプログラム]
※今回作成したサンプルは こちら からダウンロードいただけます。

NetAdvantage トライアル版ダウンロード
NetAdvantage は無料トライアルを用意しています。是非一度お試し下さい。

jp.infragistics.com