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">
    &nbsp;生产日期: 
   从:
       <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() 才行。
 
posted @ 2015-03-28 16:10  pengbg  阅读(860)  评论(1编辑  收藏  举报