読者です 読者をやめる 読者になる 読者になる

1.21 jigowatts

Great Scott!

ASP.NETでExcelファイルを読み込む処理を実装する~EPPlus

概要

最近ASP.NETアプリケーションでExcelを扱う機会が何度かあり、EPPlusというライブラリを使っていたので基本的な部分だけでもまとめてみます。

環境

Visual Studio 2010
EPPlus:EPPlus-Create advanced Excel 2007 spreadsheets on the server - Home

今回の要件は

  1. Excelファイルを読み込み
  2. GridViewに表示

として、サンプルコードを書いてみました。

準備

1.Libsフォルダを作成
2.上記リンクよりダウンロードしたdllを配置
3.参照追加でEPPlusのdllを指定

実装

画面

画面には読み込み用のボタン、GridViewのクリアボタン、Excelの内容を表示するためのGridView、メッセージ用のラベルを配置しました。

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ExcelUpload.aspx.cs" Inherits="WebApplication1.ExcelUpload" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="Button1" runat="server" Text="load" onclick="Button1_Click" />
        <asp:Button ID="Button2" runat="server" Text="clear" onclick="Button2_Click" />
    </div>       
    <div>
        <asp:gridview ID="Gridview1" runat="server"></asp:gridview>
    </div>
    <div>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    </div>    
    </form>
</body>
</html>

コードビハインド

サンプルではExcelファイルを読み込み、DataTableに値をセット、最終的にGridViewにデータバインドをします。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Data;
using OfficeOpenXml;

namespace WebApplication1
{
    public partial class ExcelUpload : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Label1.Text = "";
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            string filePath = @"c:\test\book.xlsx";

            using (var pck = new OfficeOpenXml.ExcelPackage()) 
            {
                try
                {
                    using (var stream = File.OpenRead(filePath))
                    {
                        pck.Load(stream);
                    }
                }
                catch (System.IO.IOException ex) 
                {
                    if (ex.Message.Contains("because it is being used by another process.")) 
                    {
                        Label1.Text = "Excelファイルを閉じてください。";
                    }
                   
                    return;
                }
                catch (Exception)
                {
                    throw;
                }

                var ws = pck.Workbook.Worksheets.First();
                DataTable tbl = new DataTable();

                //1行目はヘッダー
                foreach (var firstRowCell in ws.Cells[1,1,1,ws.Dimension.End.Column])
                {
                    tbl.Columns.Add(firstRowCell.Text);
                }

                //2行目以降がデータ
                const int START_ROW = 2;
                for (int row = START_ROW; row <= ws.Dimension.End.Row; row++)
                {
                    var wsRow = ws.Cells[row, 1, row, ws.Dimension.End.Column];
                    var newRow = tbl.NewRow();

                    foreach (var cell in wsRow)
                    {
                        newRow[cell.Start.Column - 1] = cell.Text;
                    }

                    tbl.Rows.Add(newRow);
                }

                Gridview1.Visible = true;
                Gridview1.DataSource = tbl;
                Gridview1.DataBind();                        
            }
        }

        protected void Button2_Click(object sender, EventArgs e)
        {
            Gridview1.DataSource = null;
            Gridview1.DataBind();
        }
    }
}

実行結果

f:id:sh_yoshida:20140714173134p:plain

まとめ

今回は簡単のためにファイルパスは固定としてしまいましたが、実際はファイル選択ダイアログ、サーバー側にファイルを保存するなどの処理が必要となります。
また、DataTableの値に変更を加えたり、ストアドプロシージャに引き渡してデータベースとの連携を行うなど仕様に合わせた振る舞いは別途書く必要はありますね。