2020-03-26|閱讀時間 ‧ 約 9 分鐘

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

    ASP.NET Core 3.1 — FileUpload 檔案上傳 + NPOI
    我把以前NPOI的範例改成 .NET Core版,但在檔案上傳(FileUpload)上遇見一點問題。
    ASP.NET Core .31 — FileUpload 檔案上傳跟 .NET完整版(MVC 5)有點不同
    改用 IFormFile來做,但大同小異。
    原廠文件就很清楚了,請看
    上傳 + 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”/ibr /  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  //  //==================================  public IActionResult Create() // 基本款  { // 檢視畫面,為了「檔案上傳」,有些地方要自己動手修改。請看上面的「檢視畫面」。  return View();  }
    [HttpPost]  public IActionResult Create(IFormFile FileUpload_FileName) // 多檔上傳,請用 ListIFormFile  { // **************  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。  //}
    //*** 方法二 *** 上傳檔案,不用存檔。直接讓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();  }
    分享至
    成為作者繼續創作的動力吧!
    © 2024 vocus All rights reserved.