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() 才行。
     
  • 相关阅读:
    Python面向对象详解
    使用树莓派搭建LoRaWAN网关并接入腾讯云物联网开发平台
    dajngo
    dajngo 项目目录结构调整
    Django
    nacos的简单使用
    MySQL数据库开发规范
    mabatis的sql标签
    直接插入100w数据报错
    大数据量插入到数据库
  • 原文地址:https://www.cnblogs.com/bingguang/p/4374369.html
Copyright © 2011-2022 走看看