下面的这个例子呢,是直接使用NPOI导出的,但是在.Net MVC 项目里面,我们往往需要通过前端调用后端的方法来导出Excel,这个时候一般回出现一个问题:
就是哪里都不报错,但是无法下载Excel 出现这种问题的原因是因为你使用了ajax来调用方法,ajax不能调用下载功能的方法,所以替换成location吧
前端:
$("#btnEcxel").click(function () { var postData = $('#tbVehicleList').datagrid('getData'); var datas= { json: JSON.stringify(postData), time: $("#StartTime").datebox('getValue') + "~" + $("#EndTime").datebox('getValue') }; location.href = "/Home/Export?json=" + datas.json + "&time=" + datas.time + ""; });
上次写了一篇C#导出Excel的文章,用的是Office组件,现在介绍一个很好用的方式,NPOI导出Excel,参考的这篇文章
NPOI的方式,要求你得用浏览器导出,所以控制台之类的就不能用了,下面新建一个MVC项目
public class HomeController : Controller { // // GET: /Home/ public FileResult Index() { DataTable table = CreatTable();
MemoryStream ms = CreateSheet("蜀云泉", table);
ms.Seek(0,SeekOrigin.Begin);
return File(ms, "application/ms-excel", "蜀云泉.xls");
} /// <summary> /// 创建工作簿 /// </summary> /// <param name="fileName">下载文件名</param> /// <param name="dt">数据源</param> public static MemoryStream CreateSheet(string fileName, DataTable dt) { HSSFWorkbook workbook = new HSSFWorkbook(); MemoryStream ms = new MemoryStream(); //创建一个名称为Payment的工作表 ISheet paymentSheet = workbook.CreateSheet("Payment"); //数据源 DataTable tbPayment = dt; //头部标题 IRow paymentHeaderRow = paymentSheet.CreateRow(0); //循环添加标题 foreach (DataColumn column in tbPayment.Columns) paymentHeaderRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName); // 内容 int paymentRowIndex = 1; foreach (DataRow row in tbPayment.Rows) { IRow newRow = paymentSheet.CreateRow(paymentRowIndex); //循环添加列的对应内容 foreach (DataColumn column in tbPayment.Columns) { newRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString()); } paymentRowIndex++; } //列宽自适应,只对英文和数字有效 for (int i = 0; i <= dt.Rows.Count; i++) { paymentSheet.AutoSizeColumn(i); } //获取当前列的宽度,然后对比本列的长度,取最大值 for (int columnNum = 0; columnNum <= dt.Columns.Count; columnNum++) { int columnWidth = paymentSheet.GetColumnWidth(columnNum) / 256; for (int rowNum = 1; rowNum <= paymentSheet.LastRowNum; rowNum++) { IRow currentRow; //当前行未被使用过 if (paymentSheet.GetRow(rowNum) == null) { currentRow = paymentSheet.CreateRow(rowNum); } else { currentRow = paymentSheet.GetRow(rowNum); } if (currentRow.GetCell(columnNum) != null) { ICell currentCell = currentRow.GetCell(columnNum); int length = Encoding.Default.GetBytes(currentCell.ToString()).Length; if (columnWidth < length) { columnWidth = length; } } } paymentSheet.SetColumnWidth(columnNum, columnWidth * 256); } //将表内容写入流 通知浏览器下载 workbook.Write(ms);
ms.flush();
return ms;
} /// <summary> /// 虚拟 DataTable内容 /// </summary> /// <returns></returns> public static DataTable CreatTable() { //创建DataTable 将数据库中没有的数据放到这个DT中 DataTable datatable = new DataTable(); datatable.Columns.Add("列1", typeof(string)); datatable.Columns.Add("列2", typeof(string)); datatable.Columns.Add("列3", typeof(string)); //创建DatatTable 结束--------------------------- //开始给临时datatable赋值 for (int i = 0; i < 10; i++) { DataRow row = datatable.NewRow(); row["列1"] = "车牌号"; row["列2"] = "里程数"; row["列3"] = "哈哈哈"; datatable.Rows.Add(row); } return datatable; } }
NPOI写入Excel参考这篇文章 ,不过我稍微做了些修改。