NPOI 入門--創建excel文件及下載


1.后台生成excel文件,測試數據大約6W行,后面會提供具體代碼及測試時間。

后台框架MVC5,NPOI版本2.4.1,后台代碼:

        /// <summary>
        /// 創建excel並下載
        /// </summary>
        [HttpGet]
        public FileContentResult CreateExcel()
        {
            HttpContext context = HttpContext.ApplicationInstance.Context;
            SDMAPI si = new SDMAPI();
            //測量運行時間
            Stopwatch sw = new Stopwatch();
            sw.Start();
            DataTable dt = si.GetHospitallist();
            sw.Stop();
            var t1 = sw.Elapsed;
            sw.Restart();
            XSSFWorkbook workbooktmp = new XSSFWorkbook();
            /*利用SXSSFWorkbook可以提升速度,主要是為大文件服務*/
            var book = new SXSSFWorkbook(workbooktmp, dt.Rows.Count + 1);  
            //創建sheet1
            ISheet sheet = book.CreateSheet("Sheet1");
            IRow headerRow = sheet.CreateRow(0);
            /*組裝excel字段,將datatable的columns做為excel里面的字段名*/
            foreach (DataColumn column in dt.Columns)
            {
                headerRow.CreateCell(column.Ordinal).SetCellValue(column.Caption);
            }
            sw.Stop();
            var t2 = sw.Elapsed;

            //Data Rows
            sw.Restart();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                IRow drow = sheet.CreateRow(i + 1);
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    ICell cell = drow.CreateCell(j, CellType.String);
                    cell.SetCellValue(dt.Rows[i][j].ToString());
                }
            }
            sw.Stop();
            var t3 = sw.Elapsed;

            using (MemoryStream ms = new MemoryStream())
            {
                sw.Restart();
                book.Write(ms); 
                sw.Stop();
                book.Dispose();
                ms.Flush();
                var t4 = sw.Elapsed;
                LogHelper.Info("獲取數據耗時:" + t1 + ",組裝excel字段:" + t2 + ",組裝excel耗時:" + t3 + ",對象寫到內存:" + t4);
//返回文件流
return File(ms.ToArray(), "application/octet-stream", "test.xlsx"); } }

 

前端頁面請求:在Chrome中文件大了以后會報錯,網絡錯誤,解決方法如下:

  //下載文件
    $("#btndownload").on("click", function () {
        var url = 'test/CreateExcel';
        var xhr = new XMLHttpRequest();
        xhr.open('GET', url, true);
        xhr.responseType = "blob";// 返回類型blob
        //發送ajax請求
        xhr.send();
        /*回調函數*/
        xhr.onload = function () {
            try {
                // 請求完成
                if (this.status == 200) {
                    // 返回200
                    //var filename = this.getResponseHeader("Content-Disposition");
                    var blob = this.response;
                    /*利用html5中的a標簽download下載文件*/
                    var a = document.createElement('a');
                    a.download = "test.xlsx";//文件名,可以通過獲取頭文件信息來獲取后台設定的文件名。
                    a.href = URL.createObjectURL(blob);//由於文件比較大的話,需要利用 URL.createObjectURL,否則在Chrome中會報錯“網絡錯誤”。
                    $("body").append(a);
                    a.click();
                    $(a).remove();
                }
            }
            catch (e) {
                modaldisplay("3", "提示", e.message);
            }
        };

 

以上可以完成最簡單的利用NPOI創建文件及下載。

測試效果如下:

現在還不確定寫入流中為什么需要18秒,后續再看。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM