NPOI导出Excle

前端:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <meta charset="utf-8" />
    <link href="easyui/themes/default/easyui.css" rel="stylesheet" />
    <link href="easyui/themes/icon.css" rel="stylesheet" />
    <script src="easyui/js/jquery.min.js"></script>
    <script src="easyui/js/jquery.easyui.min.js"></script>
    <script src="easyui/js/easyui-lang-zh_CN.js"></script>
    <script type="text/javascript">
        var datagrid = {
            init: function () {
                $('#userGrid').datagrid({
                    toolbar: '',
                    title: "用户信息",
                    iconCls: 'icon icon-list',
                    nowrap: false, //折行
                    rownumbers: true, //行号
                    striped: true, //隔行变色
                    remoteSort: false,//定义从服务器对数据进行排序
                    idField: 'Id', //主键
                    //singleSelect: true, //单选
                    columns: [[
                        { field: 'ck', checkbox: true },
                        { title: 'Id', field: 'Id',  130 },
                        { title: 'Name', field: 'Name',  80 },
                        { title: 'Sex', field: 'Sex',  100 },
                        {
                            title: 'Email', field: 'Email',  100, formatter: function (value) {
                                return "<a href='www.baidu.com'>"+value+"</a>";
                            }
                        },
                        { title: 'Remark', field: 'Remark',  100 }
                    ]],
                    onLoadSuccess: function () {
                    },
                    pagination: true,
                    pageNumber: 1,
                    pageSize: 2,
                    pageList: [2, 3, 10, 50]
                });
            },
            databind: function () {
                $('#userGrid').datagrid({ url: "Handler/UserInfoHandler.ashx?Action=getList" });
            }
        }

        $(document).ready(function () {
            datagrid.init();
            datagrid.databind();
            $("#Report1").click(ExportResumeList1)
            $("#Report2").click(ExportResumeList2)
            $("#Report3").click(ExportResumeList3)
        })
        function ExportResumeList1() {
            $.ajax({
                url: "Handler/ReportHelperHandler.ashx?action=export1",
                type: "get",
                cache: false,
                success: function (data) {
                    alert(data);
                    window.location.href = "Handler/ReportHelperHandler.ashx?action=ResponseFile&filePath=" + escape(data);
                },
                error: function (e) {
                    alert(e);
                }
            });
        }
        //导出文件
        function ExportResumeList2() {
            $("#Export").attr("action", "Handler/ReportHelperHandler.ashx?action=export2");
            $("#Export").submit();
        }
        function ExportResumeList3() {
            $("#Export").attr("action", "Handler/ReportHelperHandler.ashx?action=export3");
            $("#Export").submit();
        }
    </script>
</head>
<body>
    <button id="Report1">Excle导出1</button>
    <button id="Report2">Excle导出2</button>
    <button id="Report3">Excle导出3</button>
    <table id="userGrid" style="400px; height:200px;"></table>
    <form style="display: none;  0px; height: 0px;" id="Export" method="post" action=""></form>
</body>
</html>

  后端:

using Common;
using DBUtility;
using Model;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Text;
using System.Web;

namespace ReportTool
{
    /// <summary>
    /// ReportHelperHandler 的摘要说明
    /// </summary>
    public class ReportHelperHandler : IHttpHandler
    {

        public DataProvider dataprovider = new DataProvider();
        public ReportHelperHandler()
        {
            dataprovider.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;
        }

        public void ProcessRequest(HttpContext context)
        {
            try
            {
                context.Response.ContentType = "text/plain";
                string action = context.Request["Action"];
                switch (action)
                {
                    
                    case "export1":
                        export1(context);
                        break;
                    case "ResponseFile":
                        //ResponseFile(context.Request["filePath"]);
                        ResponseFile1(context);
                        break;
                    case "export2":
                        export2(context);
                        //responeResult(filepath,context);
                        break;
                    case "export3":
                        export3(context);
                        //responeResult(filepath,context);
                        break;
                }


            }
            catch (Exception e)
            {

                throw e;
            }
        }
        
        
        private void export1(HttpContext context)
        {
            try
            {
                var result = configEnum.mergeRow.ToString();
                //string BaseTemplateFolder = HttpContext.Current.Server.MapPath("~/Template");
                string BaseTemplateFolder = AppDomain.CurrentDomain.BaseDirectory+ "Template";
                string templateFile = Path.Combine(BaseTemplateFolder, "端午假期网络和信息系统运行值班表(汇总).xlsx");
                ExcelHelper excelHelper = new ExcelHelper(templateFile);
                DataTable configDt = excelHelper.ExcelToDataTable(templateFile, true);
                var list = DataTableHelper.ConvertTo<ConfigModel>(configDt);
                DataTable dt = new DataTable();
                string strSql = string.Empty;
                foreach (var item in list)
                {
                    if (item.key == "cols" && item.type == "sql")
                    {
                        strSql = item.value;
                    }
                }
                dt = dataprovider.FillDataTable(strSql, CommandType.Text);
                string sDirFileName = setDataToTemplate(dt, (List<ConfigModel>)list, context);
                System.IO.File.WriteAllText(HttpContext.Current.Server.MapPath("~/") + "log.txt", "export1"+sDirFileName);
                //返回导出文件的路径
                //ResponseFile(sDirFileName);
                context.Response.Write(sDirFileName);
            }
            catch (Exception e)
            {
                throw e;
            }

        }
        private void ResponseFile1(HttpContext context)
        {
            try
            {

                FileStream fs = new FileStream(context.Request["filePath"], FileMode.Open);
                byte[] bytes = new byte[(int)fs.Length];
                fs.Read(bytes, 0, bytes.Length);
                fs.Close();
                context.Response.ContentType = "application/octet-stream";
                //通知浏览器下载文件而不是打开
                context.Response.AddHeader("Content-Disposition", "attachment;   filename=" + HttpUtility.UrlEncode(Path.GetFileName(context.Request["filePath"]), System.Text.Encoding.UTF8));
                context.Response.BinaryWrite(bytes);
                context.Response.Flush();
                //context.Response.End();
                context.ApplicationInstance.CompleteRequest();
            }
            catch (Exception e)
            {

                throw e;
            }
        }
        
        private void export2(HttpContext context)
        {
            try
            {
                var result = configEnum.mergeRow.ToString();
                //string BaseTemplateFolder = context.Server.MapPath("~/Template");
                string BaseTemplateFolder = AppDomain.CurrentDomain.BaseDirectory + "Template";
                string templateFile = Path.Combine(BaseTemplateFolder, "端午假期网络和信息系统运行值班表(汇总).xlsx");
                ExcelHelper excelHelper = new ExcelHelper(templateFile);
                DataTable configDt = excelHelper.ExcelToDataTable(templateFile, true);
                var list = DataTableHelper.ConvertTo<ConfigModel>(configDt);
                DataTable dt = new DataTable();
                string strSql = string.Empty;
                foreach (var item in list)
                {
                    if (item.key == "cols" && item.type == "sql")
                    {
                        strSql = item.value;
                    }
                }
                dt = dataprovider.FillDataTable(strSql, CommandType.Text);
                string sDirFileName = setDataToTemplate(dt, (List<ConfigModel>)list, context);
                System.IO.File.WriteAllText(context.Server.MapPath("~/") + "log.txt", "export2"+sDirFileName);
                //返回导出文件的路径
                //ResponseFile(sDirFileName,context);
                //return sDirFileName;
                responeResult2(sDirFileName, context);
            }
            catch (Exception e)
            {
                throw e;
            }

        }
        private void responeResult2(string filepath, HttpContext context)
        {
            FileStream fs1 = new FileStream(filepath, FileMode.Open);
            byte[] bytes1 = new byte[(int)fs1.Length];
            fs1.Read(bytes1, 0, bytes1.Length);
            fs1.Close();
            context.Response.ContentType = "application/octet-stream";
            //通知浏览器下载文件而不是打开
            context.Response.AddHeader("Content-Disposition", "attachment;   filename=" + HttpUtility.UrlEncode(Path.GetFileName(filepath), System.Text.Encoding.UTF8));
            context.Response.BinaryWrite(bytes1);
            context.Response.Flush();
            //context.Response.End();
            context.ApplicationInstance.CompleteRequest();
        }

        private void export3(HttpContext context)
        {
            try
            {
                var result = configEnum.mergeRow.ToString();
                string BaseTemplateFolder = context.Server.MapPath("~/Template");
                string templateFile = Path.Combine(BaseTemplateFolder, "端午假期网络和信息系统运行值班表(汇总).xlsx");
                ExcelHelper excelHelper = new ExcelHelper(templateFile);
                DataTable configDt = excelHelper.ExcelToDataTable(templateFile, true);
                var list = DataTableHelper.ConvertTo<ConfigModel>(configDt);
                DataTable dt = new DataTable();
                string strSql = string.Empty;
                foreach (var item in list)
                {
                    if (item.key == "cols" && item.type == "sql")
                    {
                        strSql = item.value;
                    }
                }
                dt = dataprovider.FillDataTable(strSql, CommandType.Text);
                string sDirFileName = setDataToTemplate(dt, (List<ConfigModel>)list, context);
                System.IO.File.WriteAllText(context.Server.MapPath("~/") + "log.txt", "export13"+sDirFileName);
                //返回导出文件的路径
                //ResponseFile(sDirFileName,context);
                //return sDirFileName;
                responeResult3(sDirFileName, context);
            }
            catch (Exception e)
            {
                throw e;
            }

        }
        private void responeResult3(string filepath, HttpContext context)
        {
            FileInfo file = new FileInfo(filepath);//创建一个文件对象  
            context.Response.Clear();//清除所有缓存区的内容  
            context.Response.Charset = "GB2312";//定义输出字符集  
            context.Response.ContentEncoding = Encoding.Default;//输出内容的编码为默认编码  
            context.Response.AddHeader("Content-Disposition", "attachment;filename=" + file.Name);
            //添加头信息。为“文件下载/另存为”指定默认文件名称  
            context.Response.AddHeader("Content-Length", file.Length.ToString());
            //添加头文件,指定文件的大小,让浏览器显示文件下载的速度   
            context.Response.WriteFile(file.FullName);// 把文件流发送到客户端  
            context.Response.End();
            //context.ApplicationInstance.CompleteRequest();
        }
        /// <summary>
        /// 将数据设置到模板中
        /// </summary>
        public string setDataToTemplate(DataTable dt)
        {
            string tmpFilePath = string.Empty;
            string BaseTmpFolder = AppDomain.CurrentDomain.BaseDirectory + "Export\";
            string BaseTemplateFolder = AppDomain.CurrentDomain.BaseDirectory + "Template\";

            foreach (string fileInfo in Directory.GetFiles(BaseTmpFolder))
            {
                File.Delete(fileInfo);
            }
            string templateFile = BaseTemplateFolder + "端午假期网络和信息系统运行值班表(汇总).xlsx";
            string tmpFile = string.Format("{0}{1}年{2}", BaseTmpFolder, DateTime.Now.ToString("yyyy"), "端午假期网络和信息系统运行值班表(汇总).xlsx");
            File.Copy(templateFile, tmpFile);
            ExcelHelper excelHelper = new ExcelHelper(tmpFile);
            DataSet ds = new DataSet();
            ds.Tables.Add(dt);
            excelHelper.DataSetToExcel(ds, 3, 0, 0);

            return tmpFile;

        }
        public string setDataToTemplate(DataTable dt, List<ConfigModel> Listconfig, HttpContext context)
        {
            string tmpFilePath = string.Empty;
            string BaseTmpFolder = context.Server.MapPath("~/Export");
            string BaseTemplateFolder = context.Server.MapPath("~/Template");

            foreach (string fileInfo in Directory.GetFiles(BaseTmpFolder))
            {
                File.Delete(fileInfo);
            }
            string templateFile = Path.Combine(BaseTemplateFolder, "端午假期网络和信息系统运行值班表(汇总).xlsx");
            string tmpFile = string.Format("{0}\{1}年{2}", BaseTmpFolder, DateTime.Now.ToString("yyyy"), "端午假期网络和信息系统运行值班表(汇总).xlsx");
            File.Copy(templateFile, tmpFile);
            ExcelHelper excelHelper = new ExcelHelper(tmpFile);
            DataSet ds = new DataSet();
            ds.Tables.Add(dt);
            excelHelper.DataSetToExcel(ds, 3, 0, 0, Listconfig);

            return tmpFile;

        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

  注意:

临时文件夹读写权限设置:1.自己设置

2.通过代码控制

//给Excel文件添加"Everyone,Users"用户组的完全控制权限  
FileInfo fi = new FileInfo(excelPath);  
System.Security.AccessControl.FileSecurity fileSecurity = fi.GetAccessControl();  
fileSecurity.AddAccessRule(new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, AccessControlType.Allow));  
fileSecurity.AddAccessRule(new FileSystemAccessRule("Users", FileSystemRights.FullControl, AccessControlType.Allow));  
fi.SetAccessControl(fileSecurity);  
  
//给Excel文件所在目录添加"Everyone,Users"用户组的完全控制权限  
DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(excelPath));  
System.Security.AccessControl.DirectorySecurity dirSecurity = di.GetAccessControl();  
dirSecurity.AddAccessRule(new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, AccessControlType.Allow));  
dirSecurity.AddAccessRule(new FileSystemAccessRule("Users", FileSystemRights.FullControl, AccessControlType.Allow));  
di.SetAccessControl(dirSecurity);

  

原文地址:https://www.cnblogs.com/liuqiyun/p/6907284.html