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秒,后續再看。