【ASP.NET MVC】在您的網站上加入匯入或匯出 Excel 功能(一)

【ASP.NET MVC】在您的網站上加入匯入或匯出 Excel 功能(一)
網站上常有這樣的功能,在網站上做出匯入Excel或是將報表會出至Excel,而今天使用的套件是NPOI這一個套件,安裝方式也非常的簡單,使用上也很直覺;而另外一套是LinqtoExcel(未來在與各位分享)
而為什麼選用這一套呢?因為饅頭在使用LinqtoExcel時發生了一個錯誤,Microsoft.ACE.OLEDB.12.0 提供者並未登錄於本機電腦上,雖然有解決的辦法(安裝套件即可),但是系統部屬時開發者無法介入的情況只好選用其他的開發元件了,接下來就看看饅頭怎麼做吧!

 

網站上常有這樣的功能,在網站上做出匯入Excel或是將報表會出至Excel,而今天使用的套件是NPOI這一個套件,安裝方式也非常的簡單,使用上也很直覺;而另外一套是LinqtoExcel(未來在與各位分享)

而為什麼選用這一套呢?因為饅頭在使用LinqtoExcel時發生了一個錯誤,Microsoft.ACE.OLEDB.12.0 提供者並未登錄於本機電腦上,雖然有解決的辦法(安裝套件即可),但是系統部屬時開發者無法介入的情況只好選用其他的開發元件了,接下來就看看饅頭怎麼做吧!


上傳(匯入)Excel檔案

首先該套件可以從Nuget下載安裝到專案中,所以我們就由Nuget下手囉!

Step1

指令安裝 PM> Install-Package NPOI

安裝完畢後,我們需要一個檔案上傳的介面,可以讓使用者上傳檔案到伺服器上,我們在Controller 上新增一個Upload的頁面,頁面的Html很簡單只要一個input及一個submit的按鈕即可,在Form我們要設定enctype的編碼方式為"multipart/form-data"


@*View*@
@using (Html.BeginForm("Upload", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
         <input type="file" class="form-control" name="file" />
         <button type="submit" class="btn btn-primary">Upload!</button>
}

另外也要在Controller中新增一個接收Post的ActionResult


[HttpPost]
public ActionResult Upload(HttpPostedFileBase file)
{
    if (Request.Files["file"].ContentLength > 0)
    {
        string extension =
            System.IO.Path.GetExtension(file.FileName);

        if (extension == ".xls" || extension == ".xlsx")
        {
            string fileLocation = Server.MapPath("~/Content/") + Request.Files["file"].FileName;
            if (System.IO.File.Exists(fileLocation)) // 驗證檔案是否存在
            {
                System.IO.File.Delete(fileLocation);
            }

            Request.Files["file"].SaveAs(fileLocation); // 存放檔案到伺服器上

            
        }
    }

    return this.RedirectToAction("Index");
}

OK,檔案可以上傳了,接下來我們就要開始使用NPOI套件來讀取Excel了!

目前Office 有分為2003傳統格式與2007之後的版本XML的格式;所以我們這邊分為兩個方式運作,首先先介紹2007格式

Office 2007 Excel


// 建立一個工作簿
XSSFWorkbook excel;

// 檔案讀取
using (FileStream files = new FileStream(fileLocation, FileMode.Open, FileAccess.Read))
{
    excel = new XSSFWorkbook(files); // 將剛剛的Excel 讀取進入到工作簿中
}

Office 2003 Excel


HSSFWorkbook excel;

using (FileStream files = new FileStream(fileLocation, FileMode.Open, FileAccess.Read))
{
    excel = new HSSFWorkbook(files);
}

取得活頁簿


// Excel 的哪一個活頁簿,有兩種方式可以取得活頁簿
ISheet sheet = excel.GetSheetAt(0);  // 在第幾個活頁簿,饅頭建議使用,畢竟我們不知道使用者會把活頁部取神麼名字,先抓地一個在說!(從0開始計算)
ISheet sheetb = excel.GetSheet("Name"); // 利用名稱擷取

取得行列

取得資料的概念是先抓Row(列),在抓欄的方式


for (int row = 1; row <= sheet.LastRowNum; row++) // 使用For 走訪所有的資料列
{
    if (sheet.GetRow(row) != null) // 驗證是不是空白列
    {
        for (int c = 0; c <= sheet.GetRow(row).LastCellNum; c++) // 使用For 走訪資料欄
        {
              // 資料取得,等等說明
        }
    }
}

取得資料

在NPOI取得資料的方式區分為字串、日期、布林與數值四種,這四種方式取得也都不一樣...這有點小困擾...


sheet.GetRow(row).GetCell(c).NumericCellValue; // 數值
sheet.GetRow(row).GetCell(c).StringCellValue; // 字串
sheet.GetRow(row).GetCell(c).BooleanCellValue; // 布林
sheet.GetRow(row).GetCell(c).DateCellValue; // 日期

最後資料能抓到了,就可以開始處理自己所需要的邏輯了,看是要存到資料庫或是做其他的處理都可以囉!篇幅的關係,饅頭將下載(匯出)Excel的部分留下一章節囉!

 


 

大家好我是饅頭,希望大家喜歡我的文章

如果有錯誤的地方請不吝指教 ^_^