NPOI mvc easyui 根据Excel模板 生成Excel
1、首先下载 NPOI https://npoi.codeplex.com/releases 只要dll 就好 示例代码库太难懂了。
NPOI 是一个开源 免费的 东西。而且不依赖 office.服务端 不安装 office 才行。
其实 这个跟 easyui 关系 不大。
@{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml"; } <link href="~/jquery-easyui-1.4.2/themes/icon.css" rel="stylesheet" /> <script src="~/jquery-easyui-1.4.2/locale/easyui-lang-zh_CN.js"></script> <table id="tt" class="easyui-datagrid" title="Basic DataGrid" style="width: 700px; height: 500px" data-options="rownumbers:true,autoRowHeight:false, pagination:true, toolbar:‘#tb‘,footer:‘#ft‘, pageSize:10,singleSelect:true,collapsible:true,url:‘@Url.Action("GetGridJSON")‘,method:‘get‘"> <thead> <tr> <th data-options="field:‘FlowNoInt‘,formatter:formatFlowNoInt,width:80">流水序号</th> <th data-options="field:‘ProductionNo‘,width:140">产品条码号</th> <th data-options="field:‘Color‘,width:40">颜色</th> <th data-options="field:‘Production_data‘,formatter:Production_data,width:120">生产日期</th> <th data-options="field:‘Author‘,width:50">工号</th> </tr> </thead> </table> <div id="tb" style="padding: 2px 5px;"> <input class="easyui-textbox" id="ProductionNo" name="ProductionNo" data-options="prompt:‘输入产品条码号:‘" style="height: 22px; width: 120px"> 生产日期: 从: <input id="dd1" name="dd1" class="easyui-datebox"></input> 至: <input id="dd2" name="dd2" class="easyui-datebox"></input> <a href="#" class="easyui-linkbutton" onclick="doSearch()" iconcls="icon-search">Search</a> <a href="#" class="easyui-linkbutton" onclick="ExportExcel()" iconcls="icon-search">导出</a> </div> <table id="DataGrid"> </table> <script> function formatFlowNoInt(val, row) { var MANY_ZEROS = "000000000000000000"; if (typeof (val) != "string") val = String(val); return (MANY_ZEROS.substring(0, 6 - val.length)) + val; } function Production_data(val, row) { if (val) { return val.substr(0, 10); } } $(document).ready(function () { $("#dd1").datebox("setValue", "@DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd")"); $("#dd2").datebox("setValue", "@DateTime.Now.AddDays(1).ToString("yyyy-MM-dd")"); $("input").css("font-size", "16px"); } ); function doSearch() { $(‘#tt‘).datagrid(‘load‘, { ProductionNo: $(‘#ProductionNo‘).val(), dd1: $(‘#dd1‘).datebox(‘getValue‘), dd2: $(‘#dd2‘).datebox(‘getValue‘) }); } function ExportExcel() { //// 返回grid的所有可见行给后端供导出Excel用 //var rows = $(‘#tt‘).datagrid("getRows"); //if (rows.length == 0) { // msgShow("没有数据可供导出"); // return; //} ////返回grid的所有列的选项title、列宽等 //// var columns = $(‘#userlist‘).datagrid("options").columns; ////定制DataGrid的columns信息,只返回{field:,title:} //var columns = new Array(); //var fields = $(‘#tt‘).datagrid(‘getColumnFields‘); //for (var i = 0; i < fields.length; i++) { // var opts = $(‘#tt‘).datagrid(‘getColumnOption‘, fields[i]); // var column = new Object(); // column.field = opts.field; // column.title = opts.title; // columns.push(column); //} //var excelWorkSheet = new Object(); //excelWorkSheet.rows = rows; //excelWorkSheet.columns = columns; //excelWorkSheet.sheetName = "设置导出的Excel工作表名"; location.href = ‘@Url.Action("ExportSerialNumberList")‘ + ‘?ProductionNo=‘ + $(‘#ProductionNo‘).val() + ‘&dd1=‘ + $(‘#dd1‘).datebox(‘getValue‘) + ‘&dd2=‘ + $(‘#dd2‘).datebox(‘getValue‘); } </script> <style> .datagrid-cell { font-size: 18px; } .datagrid-header .datagrid-cell span { font-size: 18px; } </style>
ExportExcel() 注释 的那一段 是一个 遍历 easyui 的 datagrid 里面 行 ,然后 变成 json 传到 后台,我不喜欢这样,直接把查询 条件 传到 后台 不就好么。
using System; using System.Collections.Generic; using System.Linq; using System.Web.Mvc; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using System.IO; using System.Diagnostics; using System.Web; namespace SerialNumberBuilder.Controllers { public class ReportController : Controller { // // GET: /Report/ SerialNumberBuilder.Models.SerialNumber_DBEntities db = new Models.SerialNumber_DBEntities(); public ActionResult Index() { return View(); } public List<SerialNumberBuilder.Models.SerialNumberBuilder> Search() { var Temp = db.SerialNumberBuilder; IQueryable<SerialNumberBuilder.Models.SerialNumberBuilder> TempIQueryable = Temp; if (Request.QueryString["ProductionNo"] != null) { string TempStr = Request.QueryString["ProductionNo"].ToString(); TempIQueryable = Temp.Where(X => X.ProductionNo.Contains(TempStr)); } DateTime dd1 = DateTime.Now.AddDays(-365);//开始时间 默认 1年前 DateTime dd2 = DateTime.Now.AddDays(365);// if (Request.QueryString["dd1"] != null && DateTime.TryParse(Request.QueryString["dd1"].ToString(), out dd1) & Request.QueryString["dd2"] != null && DateTime.TryParse(Request.QueryString["dd2"].ToString(), out dd2) ) { TempIQueryable.Where(X => X.Production_data > dd1).Where(Y => Y.Production_data < dd2); } return TempIQueryable.ToList(); } public string GetGridJSON() { JsonSerializerSettings set = new JsonSerializerSettings(); set.DateFormatHandling = 0; return JsonConvert.SerializeObject(Search(), Formatting.Indented, set); } public ActionResult ExportSerialNumberList() { String newfileName = DateTime.Now.ToString("yyyyMMddHHmmssff"); // String newFileName = Server.MapPath("/upfiles/user_" + newfileName + ".xls"); var list = Search(); //打开Excle模板文件 FileStream fileOne = new FileStream(Server.MapPath("/Contents/userModel.xls"), FileMode.Open, FileAccess.ReadWrite); HSSFWorkbook wbOne = new HSSFWorkbook(fileOne); //获取第一个工作表 HSSFSheet sheet = (HSSFSheet)wbOne.GetSheetAt(0); //从第二行开始插入数据(行索引是从0开始的) int startRow = 1; //循环插入数据 foreach (var item in list) { HSSFRow rowOne = (HSSFRow)sheet.CreateRow(startRow); String userId = item.Author.ToString(); rowOne.CreateCell(0).SetCellValue(userId); String userName = item.Color; rowOne.CreateCell(1).SetCellValue(userName); String passWord = item.ProductionNo; rowOne.CreateCell(2).SetCellValue(passWord); startRow = startRow + 1; } MemoryStream ms = new MemoryStream(); wbOne.Write(ms); return File(ms.ToArray(), "application/vnd.ms-excel", HttpUtility.UrlEncode(string.Format("{0}.xls", newfileName))); } } }
ExportSerialNumberList() 让我心烦了。本来 是 用 FileStream 生成 本地 文件 然后 return File (文件名,contentType)。
但是我发现 这个 临时文件 我没法删除。
然后 看了 返回 File 的方法重载。里面 有一个 支持Stream 的,我就 直接 return File(ms, "application/vnd.ms-excel", HttpUtility.UrlEncode(string.Format("{0}.xls", newfileName)));
结果 下载 下来 的文件 打开有问题,没数据。
网上 一查 还非要用 ms.ToArray() 才行。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。