ASP.NET Core - FileUpload 檔案上傳 + NPOI

ASP.NET Core 3.1 - FileUpload 檔案上傳跟 .NET完整版(MVC 5)有點不同

改用 IFormFile來做,但大同小異。搭配NPOI就可以上傳檔案並讀取 Excel檔

 

我把以前NPOI的範例改成 .NET Core版,但在檔案上傳(FileUpload)上遇見一點問題。

ASP.NET Core .31 - FileUpload 檔案上傳跟 .NET完整版(MVC 5)有點不同

改用 IFormFile來做,但大同小異。

 



 

 

原廠文件就很清楚了,請看 https://docs.microsoft.com/zh-tw/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1

 

上傳 + NPOI讀取 Excel檔

這個範例從 Web Form => MVC 5 => ASP.NET core寫法都差不多。

 

如果您要用 LinqToExcel,可以把 Excel的 "工作表"當成 DB資料表 那樣讀取,也很簡便。

 

 

== 檢視畫面 ==

為了支援檔案上傳,HTML 表單必須指定 multipart/form-data的編碼類型(enctype)。
若要支援上傳多個檔案的 files input 元素,請在 <input> 元素上提供 multiple 屬性。

這些寫法我盡量跟 MVC 5類似,初學者就不會覺得差異太大

    <!--                                        動作 ,      控制器  -->
    @using (Html.BeginForm("Create", "NPOI", FormMethod.Post, new { enctype = "multipart/form-data" })) 
    {
    <div class="form-horizontal">
        <h4>檔案上傳 與 NPOI</h4>......基本款
        <hr />

        <div class="form-group">
                <!-- ******************************************************************** -->
                <i>這裡需要手動改成 "檔案上傳"的表單元件 type="file"</i><br />
                <input type="file" id="FileUpload_FileName" name="FileUpload_FileName" />
                @*     若要支援上傳多個檔案的 files input 元素,請在 <input> 元素上提供 multiple 屬性         *@
                <!-- ******************************************************************** -->
        </div>
        <div class="form-group">
                <input type="submit" value="Create(檔案上傳 與 NPOI)" class="btn btn-default" />

                <h3>@ViewBag.Message</h3>
        </div>
    </div>
    }

 

== 控制器 ==

(命名空間)

using System.IO;    //-- FileStream會用到這個命名空間
using System.Text;
using Microsoft.AspNetCore.Http;  //檔案上傳 IFormFile 會用到
// NPOI 2.0的命名空間 --   HSSF(Excel 2003), XSSF(Excel 2007), XWPF(Word 2007)。 
using NPOI.XSSF.UserModel;   //-- XSSF 用來產生Excel 2007檔案(.xlsx)
using NPOI.SS.UserModel;    //-- v.1.2.4起 新增的。

 

        //=========================================
        //== 檔案上傳 與 NPOI -- 對應 Web Form的範例 -- NPOI_20_04_FileUpload.aspx
        //  https://docs.microsoft.com/zh-tw/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1
        //=========================================

        public IActionResult Create()   // 基本款
        {   // 檢視畫面,為了「檔案上傳」,有些地方要自己動手修改。請看上面的「檢視畫面」。
            return View();
        }

        [HttpPost]
        public IActionResult Create(IFormFile FileUpload_FileName)   // 多檔上傳,請用 List<IFormFile>
        {   //                                    **************
            try
            {                
                if (FileUpload_FileName.Length > 0)   // 檢查 <input type="file"> 是否輸入檔案?
                {  
                    XSSFWorkbook workbook;   // NPOI。透過 NuGet安裝,必須裝 DotNETCore專屬的NPOI版本。

                    using (var ms = new MemoryStream())
                    {

                         FileUpload_FileName.CopyTo(ms);
                        //if (ms.Length < 2097152)
                        //{   // 限制上傳檔案必須小於2MB。 https://docs.microsoft.com/zh-tw/aspnet/core/mvc/models/file-uploads?view=aspnetcore-3.1

                           
                        //}

                        //*** 方法二 ***   上傳檔案,不用存檔。直接讓NOPI 讀取檔案內容(Stream串流)
                        Stream stream = new MemoryStream(ms.ToArray());   
                        
                        workbook = new XSSFWorkbook(stream);   // 將剛剛的Excel (Stream)讀取到工作表裡面
                        //== XSSFWorkbook() 只能讀取 System.IO.Stream

                    }

                    // 讀取 Excel裡面的工作表(跟以前 MVC 5完全相同)
                    #region
                    XSSFSheet u_sheet = (XSSFSheet)workbook.GetSheetAt(0);  // 0表示:第一個 worksheet工作表

                        StringBuilder SB = new StringBuilder();   // System.Text命名空間

                        XSSFRow headerRow = (XSSFRow)u_sheet.GetRow(0);  //-- Excel 表頭列       
                        // 表頭列,共有幾個 "欄位"?(取得最後一欄的數字)

                        for (int k = headerRow.FirstCellNum; k < headerRow.LastCellNum; k++)
                        {   // 把上傳的 Excel「表頭列」,每一欄位抓到
                            if (headerRow.GetCell(k) != null)   {
                                SB.Append(headerRow.GetCell(k).StringCellValue + "   ");
                            }
                        }
                        // for迴圈的「啟始值」要加一,表示不包含 Excel表頭列
                        for (int i = (u_sheet.FirstRowNum + 1); i <= u_sheet.LastRowNum; i++)
                        {   // 每一列做迴圈
                            XSSFRow row = (XSSFRow)u_sheet.GetRow(i);  //不包含 Excel表頭列的 "其他資料列"
                            for (int j = row.FirstCellNum; j < row.LastCellNum; j++)
                            {  //-- 每一個欄位(行)做迴圈
                                if (row.GetCell(j) != null)   {
                                    SB.Append(row.GetCell(j).ToString() + "   ");  //每一個欄位
                                }
                            }
                            ViewBag.Message = "上傳成功。" + SB.ToString();
                        #endregion
                    }
                }
            }
            catch   {
                ViewBag.Message = "上傳失敗。File upload failed!!";
            }
            return View();
        }

 

 

 

 

 

我將思想傳授他人, 他人之所得,亦無損於我之所有;

猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。----Thomas Jefferson

寫信給我,不要私訊 --  mis2000lab (at) yahoo.com.台灣  或  school (at) mis2000lab.net



ASP.NET遠距教學、線上課程(Web Form + MVC)。 第二門 課程「四折」-- 以MVC課程 作優惠。
第一天課程, "完整" 試聽。  如不滿意  全額退費!
................   facebook社團   https://www.facebook.com/mis2000lab   ......................

................  YouTube (ASP.NET) 線上教學影片  http://goo.gl/rGLocQ

*********************************************************************************************

*** ASP.NET MVC線上課程 第一天 免費看 (5.5小時) *** 

************************************************************(歡迎索取,免費申請)*****

 

Blog文章 "附的範例" 無法下載,請看 這裡 ...... https://dotblogs.com.tw/mis2000lab/2016/03/14/2008_2015_mis2000lab_sample_download

請看我們的「售後服務」範圍(嚴格認定)

......................................................................................................................................................

...................................................................................................................................................... 

[遠距教學、教學影片] ASP.NET (Web Form) 課程 上線了!MIS2000Lab.主講

事先錄製好的影片,並非上課時側錄!   觀看影片時,有如我「一對一」跟您面對面講課

 

ASP.NET MVC 5 線上教學

累積時數約 75小時...... 第一天(5.5小時)完整內容,"免費"讓您評估

    MIS2000 Lab.  線上教學影片(YouTube) **免費觀賞**