最近做了一個功能,將頁面查詢的表格數據導出到excel表格中,利用NOPI的方法做導出功能。
1.下載NOPI.dll並引用到項目中。
2.前端頁面的導出方法:
//導出 function btnExport() { var colArr = []; //這里寫獲取頁面表格字段的顯示名稱,並存到colArr數組里面,為了方便在后台循環渲染。 if(colArr.length == 0){ alert("請查詢要導出的數據!"); return; }
//這里是要傳到后台查詢數據的查詢條件,根據自己所要傳的參數進行修改,ColNames這個傳上面獲取字段顯示名稱的數組 var searchdata = { AreaNO: $('#chooseBox').val(), StartTime: sDateResult, EndTime: sDateResult, ColNames: colArr };
//QueryType可以自己定義,后台會根據這個進行判斷導出對應的頁面數據 var postData = { QueryType: 1, FileName: "你想要導出的文件名稱", QueryParms: JSON.stringify(searchdata) }; $.post("/Export/ExcelExport", postData, function (data) { if (data) { location.href = '/Export/GetExcelFile?download=' + data; //根據后台返回文件名稱進行下載 } }); }
3.后台的對應的方法:
public class ExportController : Controller { /// <summary> /// 下載Excel文件 /// </summary> /// <param name="download"></param> /// <returns></returns> public FileResult GetExcelFile(string download) { FileStream fs = (FileStream)Session[download]; Session.Remove(download); return File(fs, "application/vnd.ms-excel", download); } /// <summary> /// 導出Excel表格 /// </summary> /// <param name="QueryType"></param> /// <param name="FileName"></param> /// <param name="QueryParms"></param> /// <returns></returns> public string ExcelExport(int queryType, string fileName, string queryParms) { QueryParmsObj o = new QueryParmsObj(); QueryParmsObj request = (QueryParmsObj)JsonToObject(queryParms, o); System.IO.FileStream fs; fileName = fileName + "_導出數據_" + DateTime.Now.ToString("yyyyMMddHHmmss"); string download = string.Format(@"{0}.xlsx", fileName); try { //創建Excel文件的對象 IWorkbook workbook = new HSSFWorkbook(); //根據不同的類型導出不同的報表 if (queryType == 1) { //這里通過參數查詢獲取要導出的數據 var otherController = DependencyResolver.Current.GetService<FinancialAnalysisController>(); var response = otherController.FinancialAnalysisMConerlistData(request.AreaNO,request.StartTime,request.EndTime,null,null,null,null); JObject list = (JObject)JsonConvert.DeserializeObject(response); GetRowsOfType1(workbook, list, fileName,request.ColNames); } else if (queryType == 2) { } string pathString = Request.ApplicationPath; var mappath = Server.MapPath(pathString); var domainPath = AppDomain.CurrentDomain.GetData("DataDirectory").ToString(); if (!Directory.Exists(string.Format("{0}\\Report", domainPath))) { Directory.CreateDirectory(string.Format("{0}\\Report", domainPath)); } string filePath = String.Format(@"{0}\\Report\\{1}_{2}.xlsx", domainPath, fileName, DateTime.Now.ToString("yyyyMMddHHmmss")); // 寫入到客戶端 fs = new FileStream(filePath, FileMode.OpenOrCreate); workbook.Write(fs); fs.Seek(0, SeekOrigin.Begin); } catch (Exception) { throw new Exception(); } Session[download] = fs; return download; } /// <summary> /// 導出格式和數據渲染 /// </summary> /// <param name="workbook"></param> /// <param name="list"></param> /// <param name="name"></param> /// <param name="colNames"></param> /// <returns></returns> private IWorkbook GetRowsOfType1(IWorkbook workbook, JObject list, string name,List<string> colNames) { //添加一個sheet ISheet sheet1 = workbook.CreateSheet("Sheet1"); int colSpan = colNames.Count-1; SetSheetTitle(workbook, sheet1, name,colSpan); IRow row2 = sheet1.CreateRow(2); for (var i = 0; i < colNames.Count; i++) { row2.CreateCell(i).SetCellValue(colNames[i]); } //將數據逐步寫入sheet1各個行 var listData = list["data"]; for (int i = 0; i < listData.ToList().Count; i++) { IRow rowtemp = sheet1.CreateRow(i + 3); var cellVal = ""; for (int j = 0; j < listData[i].ToList().Count; j++) { cellVal = listData[i].ToList()[j].First.ToString(); rowtemp.CreateCell(j).SetCellValue(cellVal); } } return workbook; } /// <summary> /// 設置導出Excel標題 /// </summary> /// <param name="workbook"></param> /// <param name="sheet1"></param> /// <param name="name"></param> private void SetSheetTitle(IWorkbook workbook, ISheet sheet1, string name,int colSpan) { //給sheet1添加第一行的頭部標題 IRow row0 = sheet1.CreateRow(0); row0.HeightInPoints = 30;//行高 row0.CreateCell(0).SetCellValue(name);//創建第一列 IFont font = workbook.CreateFont(); //創建一個字體樣式對象 font.FontHeightInPoints = 17;//字體大小 font.Boldweight = short.MaxValue;//字體加粗 ICellStyle style = workbook.CreateCellStyle();//創建樣式對象 style.SetFont(font); //將字體樣式賦給樣式對象 style.Alignment = HorizontalAlignment.Center; row0.Cells[0].CellStyle = style; ; //把樣式賦給單元格 CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0, 0, colSpan); sheet1.AddMergedRegion(cellRangeAddress); IRow row1 = sheet1.CreateRow(1); row1.HeightInPoints = 20;//行高 row1.CreateCell(0).SetCellValue("制表日期:" + DateTime.Now.Date.ToString("yyyy-MM-dd")); font = workbook.CreateFont(); //創建一個字體樣式對象 font.FontHeightInPoints = 13;//字體大小 font.Boldweight = short.MaxValue;//字體加粗 style = workbook.CreateCellStyle();//創建樣式對象 style.SetFont(font); row1.Cells[0].CellStyle = style; cellRangeAddress = new CellRangeAddress(1, 1, 0, colSpan); sheet1.AddMergedRegion(cellRangeAddress); } /// 把Json文本轉為實體 public static object JsonToObject(string jsonString, object obj) { return JsonConvert.DeserializeObject(jsonString, obj.GetType()); } /// <summary> /// 查詢參數實體 /// </summary> private class QueryParmsObj { public string AreaNO { get; set; } public string StartTime { get; set; } public string EndTime { get; set; } public List<string> ColNames { get; set; } } }