net mvc 利用NPOI導入導出excel

来源:http://www.cnblogs.com/ldyblogs/archive/2017/08/24/npoi.html
-Advertisement-
Play Games

1、導出Excel : 首先引用NPOI包(Action一定要用FileResult) /// <summary> /// 批量導出需要導出的列表 /// </summary> /// <returns></returns> public FileResult ExportStu2() { //獲取 ...


1、導出Excel 
首先引用NPOI包(Action一定要用FileResult)

    /// <summary>  
            /// 批量導出需要導出的列表  
            /// </summary>  
            /// <returns></returns>  
            public FileResult ExportStu2()  
            {  
                //獲取list數據  
                var checkList = (from oc in db.OrganizeCustoms  
                                join o in db.Organizes.DefaultIfEmpty() on oc.custom_id equals o.id  
                                where oc.organize_id == 1  
                                select new  
                                {  
                                    customer_id = o.id,  
                                    customer_name = o.name  
                                }).ToList();  
      
                //創建Excel文件的對象  
                NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook();  
                //添加一個sheet  
                NPOI.SS.UserModel.ISheet sheet1 = book.CreateSheet("Sheet1");  
      
                //貌似這裡可以設置各種樣式字體顏色背景等,但是不是很方便,這裡就不設置了  
      
                //給sheet1添加第一行的頭部標題  
                NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(0);  
                row1.CreateCell(0).SetCellValue("編號");  
                row1.CreateCell(1).SetCellValue("姓名");  
                //....N行  
      
                //將數據逐步寫入sheet1各個行  
                for (int i = 0; i < checkList.Count; i++)  
                {  
                    NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 1);  
                    rowtemp.CreateCell(0).SetCellValue(checkList[i].customer_id.ToString());  
                    rowtemp.CreateCell(1).SetCellValue(checkList[i].customer_name.ToString());  
                    //....N行  
                }  
                // 寫入到客戶端   
                System.IO.MemoryStream ms = new System.IO.MemoryStream();  
                book.Write(ms);  
                ms.Seek(0, SeekOrigin.Begin);  
                DateTime dt = DateTime.Now;  
                string dateTime = dt.ToString("yyMMddHHmmssfff");  
                string fileName = "查詢結果" + dateTime + ".xls";  
                return File(ms, "application/vnd.ms-excel", fileName);  
            }  
View Code

前臺直接寫就可實現:

@Html.ActionLink("點擊導出Excel", "ExportStu2")  

這裡有一篇專門介紹設置樣式的文章:
http://www.cnblogs.com/puzi0315/p/3265958.html
http://blog.csdn.net/xhccom/article/details/7687264
http://blog.csdn.net/bestreally/article/details/23257851

 

 

2、導入Excel:

首先說一些前臺吧,mvc上傳註意必須加 new { enctype = "multipart/form-data" }

    <td>  
        @using (@Html.BeginForm("ImportStu", "ProSchool", FormMethod.Post, new { enctype = "multipart/form-data" }))  
        {  
            <text>選擇上傳文件:(工作表名為“Sheet1”,“電腦號”在A1單元格。)</text>  
            <input name="file" type="file" id="file" />  
            <input type="submit" name="Upload" value="批量導入第一批名冊" />  
        }  
    </td>  
View Code

後臺實現:只傳路徑得出DataTable:

    /// <summary>  
        /// Excel導入  
        /// </summary>  
        /// <param name="filePath"></param>  
        /// <returns></returns>  
        public DataTable ImportExcelFile(string filePath)  
        {  
          HSSFWorkbook hssfworkbook;  
          #region//初始化信息  
          try  
          {  
            using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read))  
            {  
              hssfworkbook = new HSSFWorkbook(file);  
            }  
          }  
          catch (Exception e)  
          {  
            throw e;  
          }  
          #endregion  
      
          using (NPOI.SS.UserModel.ISheet sheet = hssfworkbook.GetSheetAt(0))  
          {  
            DataTable table = new DataTable();  
            IRow headerRow = sheet.GetRow(0);//第一行為標題行  
            int cellCount = headerRow.LastCellNum;//LastCellNum = PhysicalNumberOfCells  
            int rowCount = sheet.LastRowNum;//LastRowNum = PhysicalNumberOfRows - 1  
      
            //handling header.  
            for (int i = headerRow.FirstCellNum; i < cellCount; i++)  
            {  
              DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);  
              table.Columns.Add(column);  
            }  
            for (int i = (sheet.FirstRowNum + 1); i <= rowCount; i++)  
            {  
              IRow row = sheet.GetRow(i);  
              DataRow dataRow = table.NewRow();  
      
              if (row != null)  
              {  
                for (int j = row.FirstCellNum; j < cellCount; j++)  
                {  
                  if (row.GetCell(j) != null)  
                    dataRow[j] = GetCellValue(row.GetCell(j));  
                }  
              }  
              table.Rows.Add(dataRow);  
            }  
            return table;  
          }  
        }  
View Code

補充一個類:

    /// <summary>  
        /// 根據Excel列類型獲取列的值  
        /// </summary>  
        /// <param name="cell">Excel列</param>  
        /// <returns></returns>  
        private static string GetCellValue(ICell cell)  
        {  
          if (cell == null){ return string.Empty; }  
          switch (cell.CellType)  
          {  
            case CellType.BLANK:  
              return string.Empty;  
            case CellType.BOOLEAN:  
              return cell.BooleanCellValue.ToString();  
            case CellType.ERROR:  
              return cell.ErrorCellValue.ToString();  
            case CellType.NUMERIC:  
            case CellType.Unknown:  
            default:  
              return cell.ToString();//This is a trick to get the correct value of the cell. NumericCellValue will return a numeric value no matter the cell value is a date or a number  
            case CellType.STRING:  
              return cell.StringCellValue;  
            case CellType.FORMULA:  
              try  
              {  
                HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(cell.Sheet.Workbook);  
                e.EvaluateInCell(cell);  
                return cell.ToString();  
              }  
              catch  
              {  
                return cell.NumericCellValue.ToString();  
              }  
          }  
        }  
View Code

得到DataTable後,就想怎麼操作就怎麼操作了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 添加PPA: 1、首先進入ubuntu系統,system—>administration—>update manager—>setting,在軟體源界面,點擊other software 標簽頁,點擊左下角的add,將獲得的PPA地址粘貼進來。 2、也可以在終端輸入,sudo gedit /etc/ ...
  • 本節課程,需要完成擴增子分析解讀1質控 實驗設計 雙端序列合併 先看一下擴增子分析的整體流程,從下向上逐層分析 分析前準備 # 進入工作目錄 cd example_PE250 上一節回顧:我們拿到了雙端數據,進行了質控、並對實驗設計進行了填寫和檢查、最後將雙端數據合併為單個文件進行下游分析。 接下來 ...
  • 對值類型和引用類型的誤解 (引用類型存儲在堆上,值類型存儲在棧上) 對值類型和引用類型的誤解 (引用類型存儲在堆上,值類型存儲在棧上) 在學習C#基礎篇幅的時候總是逃不掉值類型和引用類型,很多新手包括我以前對它的理解也只是停留在"引用類型存儲在堆上,值類型存儲在棧上". 這個誤區主要歸咎於我們根本沒 ...
  • 第 9 章:常用的設計模式 9.1 聚合組件 考慮為常用的特性域提供聚合組件。 要用聚合組件來對高層的概念(物理對象)進行建模,而不是對系統級的任務進行建模。 要讓聚合組件的名字與眾所周知的系統實體相對應,比如 MessageQueue、Process 或 EventLog,這樣就能使類型更加引人註 ...
  • 為什麼有這種需求, 原因是這樣的, 公司有一個Java的web項目,在另一臺伺服器A上,最近老闆一時興起,想把他合併到這台穩定點的伺服器B上,伺服器B上使用IIS來寄宿asp.net 網站, 怎麼辦呢,硬著頭皮上吧,在網上找各種解決方案: 解決方案一:isapi_redirect 這個方法按照方法試 ...
  • 在網路編程過程中需要向伺服器上傳文件。 Multipart/form-data是上傳文件的一種方式。 ...
  • 創建和開發ASP.NET Core應用可以有二種方式:最簡單的方式是通過visual studio 2017 來創建,其優點是簡單方便,但需要安裝最新版本visual studio 2017 preview 15.3 。另一種方式是使用visual studio code來創建,vscode 則是一... ...
  • 微信分享代碼,先引入: 獲取簽名: 分享代碼: wxsign輸出的json ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...