zoukankan      html  css  js  c++  java
  • 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=" 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,80">流水序号</th>
                <th data-options="field:'ProductionNo',140">产品条码号</th>
                <th data-options="field:'Color',40">颜色</th>
                <th data-options="field:'Production_data',formatter:Production_data,120">生产日期</th>
                <th data-options="field:'Author',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;  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() 才行。
     
  • 相关阅读:
    天梯赛5-12 愿天下有情人都是失散多年的兄妹 【dfs】
    poj2718 Smallest Difference【贪心】
    HDU problem 5635 LCP Array【思维】
    codeforces 782C Andryusha and Colored Balloons【构造】
    HDU 4278 Faulty Odometer【进制转换】
    codeforces B. The Meeting Place Cannot Be Changed【二分】
    POJ 3264 Balanced Lineup 【线段树】
    HDU 1850
    CodeForces-714C
    HDU Problem 1247 Hat's Words 【字典树】
  • 原文地址:https://www.cnblogs.com/bingguang/p/4374369.html
Copyright © 2011-2022 走看看