SilverlightアプリケーションでExcelファイルのダウンロード(WCF RIA Services)

キーテクノロジNPOIWCF RIA ServicesSilverlightNPOIを使ってサーバーサイドで作成したExcelファイルをSilverlightで受信してファイルに出力するサンプルです。Loadボタンを押すと、データがDataGridに表示されます。Export...ボタンを押すとExcelファイルが保存されます。 

C# (1.5 MB)
 
 
 
 
 
(0)
797 times
Add to favorites
4/1/2011
E-mail Twitter del.icio.us Digg Facebook

namespace ExcelDownloadSample.Web
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.IO;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel.DomainServices.Hosting;
    using System.ServiceModel.DomainServices.Server;
    using NPOI.HSSF.UserModel;
    using NPOI.SS.UserModel;

    [EnableClientAccess()]
    public class ExcelService : DomainService
    {
        // sample data
        private static readonly IEnumerable<Person> db = Enumerable.Range(1, 100)
            .Select(i =>
                new Person
                {
                    ID = i,
                    Name = "田中 太郎" + i,
                    Birthday = DateTime.Now
                });

        // get sample data
        public IQueryable<Person> GetPeople()
        {
            return db.AsQueryable();
        }

        // get excel binary
        [Invoke]
        public byte[] GetExecl()
        {
            var book = CreateWorkbook(db);
            var ms = new MemoryStream();
            book.Write(ms);
            return ms.ToArray();
        }

        private static HSSFWorkbook CreateWorkbook(IEnumerable<Person> source)
        {
            var book = new HSSFWorkbook();
            var sheet = book.CreateSheet("Person");

            CreateHeaderRow(book, sheet);
            foreach (var p in source.Select((person, index) => new { person, index }))
            {
                CreateRow(book, sheet, p.index + 1, p.person);
            }
            return book;
        }

        // ヘッダー行を作成する
        private static void CreateHeaderRow(HSSFWorkbook book, Sheet sheet)
        {
            var row = sheet.CreateRow(0);

            // 0列目はIDの列
            var idCell = row.CreateCell(0);
            idCell.SetCellValue("ID");

            // 1列目は名前の列
            var nameCell = row.CreateCell(1);
            nameCell.SetCellValue("名前");

            // 3列目は誕生日の列
            var birthdayCell = row.CreateCell(2);
            birthdayCell.SetCellValue("誕生日");

            // 4方に罫線
            var style = book.CreateCellStyle();
            style.BorderTop = CellBorderType.THIN;
            style.BorderLeft = CellBorderType.THIN;
            style.BorderBottom = CellBorderType.THIN;
            style.BorderRight = CellBorderType.THIN;

            // 薄いグリーンの背景色で塗りつぶす
            style.FillForegroundColor = IndexedColors.LIGHT_GREEN.Index;
            style.FillPattern = FillPatternType.SOLID_FOREGROUND;
            // テキストはセンタリング
            style.Alignment = HorizontalAlignment.CENTER;

            // 太字
            var font = book.CreateFont();
            font.Boldweight = (short)FontBoldWeight.BOLD;
            style.SetFont(font);

            // 全てのヘッダー用のセルに、上で作ったスタイルを適用する
            foreach (var cell in new[] { idCell, nameCell, birthdayCell })
            {
                cell.CellStyle = style;
            }

        }

        // index行目のデータを作る
        private static void CreateRow(HSSFWorkbook book, Sheet sheet, int index, Person p)
        {
            // 行を作って
            var row = sheet.CreateRow(index);

            // id列を作る
            var idCell = row.CreateCell(0);
            idCell.SetCellValue(p.ID);

            // 名前も適当に入れて
            var nameCell = row.CreateCell(1);
            nameCell.SetCellValue(p.Name);

            // 誕生日も適当に
            var birthdayCell = row.CreateCell(2);
            birthdayCell.SetCellValue(p.Birthday);

            // 全ての列に4方に罫線のあるスタイルを作って適用する
            // あえて別々のスタイルを設定してるのは、誕生日セルにフォーマットを入れるため
            foreach (var cell in new[] { idCell, nameCell, birthdayCell })
            {
                var style = book.CreateCellStyle();
                style.BorderTop = CellBorderType.THIN;
                style.BorderRight = CellBorderType.THIN;
                style.BorderLeft = CellBorderType.THIN;
                style.BorderBottom = CellBorderType.THIN;

                cell.CellStyle = style;
            }
            // 日付用yyyy年mm月dd日のフォーマットで誕生日は表示するようにする
            var format = book.CreateDataFormat();
            birthdayCell.CellStyle.DataFormat = format.GetFormat("yyyy年mm月dd日");
        }
    }

    /// <summary>
    /// Entity
    /// </summary>
    public class Person
    {
        [Key]
        [Display(AutoGenerateField = false)]
        public int ID { get; set; }

        [Display(Name = "名前")]
        public string Name { get; set; }

        [Display(Name = "誕生日")]
        public DateTime Birthday { get; set; }
    }
}