mvc 根据模板导出excel,直接导出文件流
1.c#
/// <summary> /// 导出员工 /// </summary> /// <returns></returns> [HttpGet] public FileResult ExportEmployee() { var eid = getEnterpriseId(); LogWriter.ToDebug($"导出员工开始"); string templateUrl = "/ExportFile/Template/ExportEmployeesTemplate.xls"; //string temporaryUrl = $"/ExportFile/Temporary/ExportEmployees_{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}.xls"; string templateRealUrl = Request.MapPath(templateUrl); //string temporaryRealUrl = Request.MapPath(temporaryUrl); //System.IO.File.Copy(templateRealUrl, temporaryRealUrl, true); var result = ExportEmployees(eid, templateRealUrl); LogWriter.ToDebug($"导出员工结束"); return result; //return Json(new ResultInfo(1001, "导出员工失败")); }
private FileResult ExportEmployees(Guid eId, string tempFileUrl) { var employeesList = EnterpriseBLL.GetExportEmployees(eId); IWorkbook workbook; try { using (FileStream stream = System.IO.File.Open(tempFileUrl, FileMode.Open, FileAccess.Read)) { workbook = new HSSFWorkbook(stream); ISheet sheet = workbook.GetSheet("Sheet1"); for (int i = 0; i < employeesList.Count; i++) { IRow row = sheet.CreateRow(i + 3); for (int j = 0; j < 7; j++) { ICell cell = row.CreateCell(j); cell.SetCellValue(EnterpriseBLL.getCellValue(employeesList[i], j)); } } } //转为字节数组 NpoiMemoryStream streamOut = new NpoiMemoryStream(); streamOut.AllowClose = false; workbook.Write(streamOut); streamOut.Seek(0, SeekOrigin.Begin); //return File(stream, "application/vnd.ms-excel", file); return File(streamOut, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Employees.xls"); } catch (Exception ex) { LogWriter.ToError($"ZJCX.ZJCDPC.WebUI->EnterpriseBLL->ExportEmployees内部错误,{ex.Message}", ex); throw ex; } } //新建类 重写Npoi流方法 public class NpoiMemoryStream : MemoryStream { public NpoiMemoryStream() { AllowClose = true; } public bool AllowClose { get; set; } public override void Close() { if (AllowClose) base.Close(); } }
前端:
通过创建a标签实现重命名文件
this.$getDownload('/API/ExportEmployee').then(res => { let blob = new Blob([res.data], { type: "application/vnd.openxmlformats-officedocument.spreadsheethml.sheet" }); let objctUrl = URL.createObjectURL(blob); var a = document.createElement('a'); a.innerHTML = "员工信息.xls"; a.download = "员工信息.xls"; a.href = objctUrl; document.body.appendChild(a); var evt = document.createEvent("MouseEvents"); evt.initEvent("click", false, false); a.dispatchEvent(evt); document.body.removeChild(a); })
前端用的vue-anxio,需要注意:
//get请求封装 export function getDownload(url) { return new Promise((resolve, reject) => { axios({ method: 'get', url: baseUrl+url, responseType: 'arraybuffer' }).then(res => { resolve(res) }, err => { console.log('get 报错'); reject(err); }) }) };