【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下手囉!
指令安裝 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的部分留下一章節囉!
大家好我是饅頭,希望大家喜歡我的文章
如果有錯誤的地方請不吝指教 ^_^