大致流程:前端使用URL地址的方式跳转到action后返回file类型数据
js:
window.location.href = '/Home/index?Id=' + id
后台代码:
/// <summary> /// 导出对比结果 /// </summary> /// <param name="quarter"></param> /// <returns></returns> public FileResult index(int Id) { try { var list = 可以根据传入参数查找到数据库中需要导出的数据列表 //创建Excel文件的对象 NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook(); //创建样式 var style = book.CreateCellStyle(); //单元格样式:水平对齐居中 style.Alignment = HorizontalAlignment.Center; //字体样式 var font=book.CreateFont(); //加粗 font.Boldweight=short.MaxValue; //字体样式加入到单元格样式里面 style.SetFont(font); //添加一个sheet NPOI.SS.UserModel.ISheet sheet1 = book.CreateSheet("Sheet1"); var titleCell = sheet1.AddMergedRegion(new CellRangeAddress(0, 2, 0, 3)); var row = sheet1.CreateRow(0); row.CreateCell(0).SetCellValue("签到标题:" + title + " 反馈进度:" + feedBackProgress); //标题的样式设置 row.CreateCell(0).CellStyle = style; //给sheet1添加第一行的头部标题 NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(3); row1.CreateCell(0).SetCellValue("姓名"); row1.CreateCell(1).SetCellValue("性别"); row1.CreateCell(2).SetCellValue("年龄"); //将数据逐步写入sheet1各个行 for (int i = 0; i < list.Count; i++) { NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 4); rowtemp.CreateCell(0).SetCellValue(list[i].name); rowtemp.CreateCell(1).SetCellValue(list[i].sex);//如果是时间字段需要tostring确定格式,否则导出到数据库的时候会变成一个小数的数字 rowtemp.CreateCell(2).SetCellValue(list[i].age); } // 写入到客户端 System.IO.MemoryStream ms = new System.IO.MemoryStream(); book.Write(ms); ms.Seek(0, SeekOrigin.Begin); return File(ms, "application/vnd.ms-excel", string.Format("你的excel-{0}.xls", DateTime.Now.ToString("yyyyMMddhhmmss"))); } catch (Exception ex) { logger.Error(ex.Message + ex.StackTrace); return null; } }
上述代码存在一个错误,就是导出的excel合并行的标题不见了,经过研究发现,要写成如下形式:
//添加一个sheet ISheet sheet1 = book.CreateSheet("Sheet1"); sheet1.AddMergedRegion(new CellRangeAddress(0, 2, 0, 3)); var row = sheet1.CreateRow(0); //标题的样式设置 var titleRow = row.CreateCell(0); //创建样式 var style = book.CreateCellStyle(); //单元格样式:水平对齐居中 style.Alignment = HorizontalAlignment.Center; //字体样式 var font = book.CreateFont(); //加粗 font.Boldweight = short.MaxValue; //字体样式加入到单元格样式里面 style.SetFont(font); titleRow.CellStyle = style; row.CreateCell(0).CellStyle = style; titleRow.SetCellValue("签到标题:" + title + " 反馈进度:" + feedBackProgress);
这里首先是
row.CreateCell(0)在设置的时候要统一用一个变量去设置,第二点就是
titleRow.CellStyle = style; row.CreateCell(0).CellStyle = style;
先设置样式。再设置值,如果顺序颠倒也会出现比如字体不对或者不显示的问题.
另外,合并单元格方法的四个参数解释如下:
//CellRangeAddress四个参数为:起始行,结束行,起始列,结束列