ASP.NET EXCEL导出文件添加指定单元格下拉框、只读、设置单元格格式

#region 导出相关
        [PostBack("Name")]
        [PostBack("selectYearMonth")]
        [GridPostBack(GridPostBackMode.CheckedRows, true, "dgList")]
        protected void btnExport_Click(MiniButton sender, WuhanIns.Web.MiniUI.Core.AjaxActionEventArgs e)
        {
            try
            {
                HrStaffBaseItem[] detailItem = e.GetRequestParam<HrStaffBaseItem[]>("dgList");
                if (detailItem.Count() <= 0)
                {
                    JSAlert("请至少选择一条记录!");
                    return;
                }
                string[] ids = detailItem.Select(d => d.Id).ToArray();

                //在服务端自动创建一个文件夹
                string FileBaseDir = "ExportExcel";//写死一个excel临时存储文件夹名称
                string fileBasePath = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, FileBaseDir);

                //清空指定目录
                DirectoryInfo directory = new DirectoryInfo(fileBasePath);
                if (directory.Exists)
                {
                    directory.Delete(true);
                }
                DirectoryInfo newDirInfo = Directory.CreateDirectory(fileBasePath);//在指定路径创建所有目录和子目录
                if (newDirInfo.Exists)
                {
                    string strYearMonth = e.GetRequestParam<string>("selectYearMonth");
                    DateTime? selectYearMonth = null;
                    if (!string.IsNullOrEmpty(strYearMonth))
                    {
                        selectYearMonth = GetDateTime("selectYearMonth", e);
                    }
                    string projectid = e.GetRequestParam<string>("Project_Id");
                    string subcontractor_id = e.GetRequestParam<string>("subcontractor_id");
                    string Name = JsonUtil.DecodeKeyValue(e.GetRequestParam("Name")).Value.Value.Trim();
                    DataTable dt = HrStaffBaseManager.GetTableExportSource(ids, selectYearMonth, projectid, subcontractor_id, Name);//根据条件获取导出数据源

                    //DataView dv = dt.DefaultView;
                    //string[] ids = detailItem.Select(d => d.Id).ToArray();
                    dv.RowFilter = "id in (" + ids + ")";
                    //dv.RowFilter = "id in ('000e0b42-165a-4b45-92dd-48a9dc1aaaaa')";
                    //DataTable dtNew = dv.ToTable();

                    if (dt != null && dt.Rows.Count > 0)
                    {
                        foreach (DataRow dr in dt.Rows)
                        {
                            if (dr["性别"] != null && dr["性别"].ToString() != "")
                            {
                                int curEnum = Convert.ToInt32(dr["性别"].ToString());
                                dr["性别"] = ((性别)curEnum).ToString();
                            }
                            if (dr["工种"] != null && dr["工种"].ToString() != "")
                            {
                                int curEnum = Convert.ToInt32(dr["工种"].ToString());
                                dr["工种"] = ((工种)curEnum).ToString();
                            }
                            if (dr["学历"] != null && dr["学历"].ToString() != "")
                            {
                                int curEnum = Convert.ToInt32(dr["学历"].ToString());
                                dr["学历"] = ((学历)curEnum).ToString();
                            }
                            if (dr["是否贫困县"] != null && dr["是否贫困县"].ToString() != "")
                            {
                                int curEnum = Convert.ToInt32(dr["是否贫困县"].ToString());
                                dr["是否贫困县"] = ((是否)curEnum).ToString();
                            }
                            if (dr["发放方式"] != null && dr["发放方式"].ToString() != "")
                            {
                                int curEnum = Convert.ToInt32(dr["发放方式"].ToString());
                                dr["发放方式"] = ((EPC发放方式)curEnum).ToString();
                            }
                            if (dr["出生年月"] != null && dr["出生年月"].ToString() != "")
                            {
                                dr["出生年月"] = Convert.ToDateTime(dr["出生年月"].ToString()).ToString("yyyy-MM-dd").ToString();
                            }

                            if (dr["护照有效期至"] != null && dr["护照有效期至"].ToString() != "")
                            {
                                dr["护照有效期至"] = Convert.ToDateTime(dr["护照有效期至"].ToString()).ToString("yyyy-MM-dd").ToString();
                            }
                            if (dr["办理日期"] != null && dr["办理日期"].ToString() != "")
                            {
                                dr["办理日期"] = Convert.ToDateTime(dr["办理日期"].ToString()).ToString("yyyy-MM-dd").ToString();
                            }
                            if (dr["到期时间"] != null && dr["到期时间"].ToString() != "")
                            {
                                dr["到期时间"] = Convert.ToDateTime(dr["到期时间"].ToString()).ToString("yyyy-MM-dd").ToString();
                            }
                            if (dr["证书有效期"] != null && dr["证书有效期"].ToString() != "")
                            {
                                dr["证书有效期"] = Convert.ToDateTime(dr["证书有效期"].ToString()).ToString("yyyy-MM-dd").ToString();
                            }
                            if (dr["保险有效期"] != null && dr["保险有效期"].ToString() != "")
                            {
                                dr["保险有效期"] = Convert.ToDateTime(dr["保险有效期"].ToString()).ToString("yyyy-MM-dd").ToString();
                            }
                            if (dr["特殊工种"] != null && dr["特殊工种"].ToString() != "")
                            {
                                int curEnum = Convert.ToInt32(dr["特殊工种"].ToString());
                                dr["特殊工种"] = ((是否)curEnum).ToString();
                            }
                            if (dr["购买保险"] != null && dr["购买保险"].ToString() != "")
                            {
                                int curEnum = Convert.ToInt32(dr["购买保险"].ToString());
                                dr["购买保险"] = ((是否)curEnum).ToString();
                            }
                        }
                    }

                    DateTime curTime = DateTime.Now;
                    //string excelName = string.Format("劳务人员台帐明细({0}年{1}月{2}日{3}时{4}分{5}秒).xls", curTime.Year, curTime.Month, curTime.Day, curTime.Hour, curTime.Minute, curTime.Second);//导出excel文件名称
                    string excelName = string.Format("劳务人员台帐明细({0}).xls", curTime.ToString("yyyyMMddHHmmss"));//导出excel文件名称
                    //string excelName = string.Format("劳务人员台帐明细({0}年{1}月{2}日{3}时{4}分{5}秒).xlsx", curTime.Year, curTime.Month, curTime.Day, curTime.Hour, curTime.Minute, curTime.Second);//导出excel文件名称
                    string excelFullName = Path.Combine(fileBasePath, excelName);//将两个字符串组合成一个路径

                    //ExcelRender.RenderToExcel(dt, excelFullName);//DataTable转换成Excel文档流,并保存到文件
                    RenderToExcel(dt, excelFullName);//DataTable转换成Excel文档流,并保存到文件

                    //下载该excel文件至pc端
                    Session["FileFullPath"] = excelFullName;
                    if (File.Exists(excelFullName))
                    {
                        this.JSShowWindow("../../Handler/DownLoadFile.ashx", false);
                    }
                }
            }
            catch
            {

            }
        }

        private DateTime GetDateTime(string datePickerId, AjaxEventArgs e)
        {
            //string str = e.GetRequestParam(datePickerId);
            //KeyValuePair<string, string> data = new KeyValuePair<string, string>();
            data = JsonUtil.DecodeKeyValue(str).Value;
            //data = JsonUtil.DecodeKeyValue(str.Trim('"')).Value;
            //string timeStr = data.Value;
            //if (!string.IsNullOrEmpty(timeStr))
            //{
            //    return DateTime.Parse(timeStr);
            //}
            //return NoneValue.NaDateTime;

            string str = e.GetRequestParam(datePickerId);
            if (!string.IsNullOrEmpty(str))
            {
                return DateTime.Parse(str.Trim('"'));
            }
            return NoneValue.NaDateTime;
        }
        #endregion
/// <summary>
        /// 根据条件获取导出数据源
        /// </summary>
        /// <param name="startTime"></param>
        /// <param name="endTime"></param>
        /// <param name="qbsIdList"></param>
        /// <returns></returns>
        public DataTable GetTableExportSource(string[] ids, DateTime? selectYearMonth, string project_id, string subcontractor_id, string Name)
        {
//            string sql = @" select  
//                                    hsb.name 姓名,
//                                    hsb.identity_card 身份证号码,
//                                    decode(hsb.sex, 0, '男', 1, '女', '') 性别,
//                                    hsb.birthday 出生年月,
//                                    hsb.age 年龄,
//                                    hsb.anmelden_location_number 户口所在地,
//                                    hsb.position 工种,
//                                    hsb.educational_level 学历,
//                                    hsb.seniority 工作年限,
//                                    hsb.ispoor 是否贫困县,
//                                    hsb.address 家庭地址,
//                                    hsb.emergency_contact 紧急联系人,
//                                    hsb.emergency_contact_tel 紧急联系人电话,
//                                    hsb.contact_relationship 关系,
//                                    sb.subcontractor_name 所属分包商,
//                                    decode(hsb.pay_type, 0, '项目部代发', 1, '分包商自行发放', '') 发放方式,
//                                    hsb.bank_account 银行卡号
//                                from 
//                                    hr_staff_base hsb LEFT JOIN subcontractor_base sb ON hsb.subcontractor_id = sb.id
//                                where 1=1
//                                and (hsb.deleted =0 OR hsb.deleted is null)
//                                and hsb.project_id = :W_project_id
//                                and hsb.subcontractor_id = :W_subcontractor_id ";


            string sql = @" select  
                                    hsb.NAME 姓名,
	                                hsb.identity_card 身份证号码,
	                                cast( hsb.sex AS CHAR ) 性别,
	                                cast( hsb.birthday AS CHAR ) 出生年月,
	                                hsb.age 年龄,
	                                hsb.anmelden_location_number 户口所在地,
	                                cast( hsb.position AS CHAR ) 工种,
	                                cast( hsb.educational_level AS CHAR ) 学历,
	                                hsb.seniority 工作年限,
	                                cast( hsb.ispoor AS CHAR ) 是否贫困县,
	                                hsb.address 家庭地址,
	                                hsb.emergency_contact 紧急联系人,
	                                hsb.emergency_contact_tel 紧急联系人电话,
	                                hsb.contact_relationship 关系,
	                                sb.subcontractor_name 所属分包商,
	                                cast( hsb.pay_type AS CHAR ) 发放方式,
	                                hsb.bank_account 银行卡号,
	                                hsb.passport_number 护照号码,
	                                hsb.passport_type 护照类型,
	                                hsb.visanumber 签证编号,
	                                cast( hsb.hz_period AS CHAR ) 护照有效期至,
	                                cast( hsb.handling_date AS CHAR ) 办理日期,
	                                cast( hsb.due_date AS CHAR ) 到期时间,
	                                cast( hsb.is_operation AS CHAR ) 特殊工种,
	                                hsb.special_cer_code 特种作业证编号,
	                                cast( hsb.special_cer_time AS CHAR ) 证书有效期,
	                                cast( hsb.insurance AS CHAR ) 购买保险,
	                                hsb.insurance_type 保险类型,
	                                cast( hsb.insurance_time AS CHAR ) 保险有效期 
                                from 
                                    hr_staff_base hsb LEFT JOIN subcontractor_base sb ON hsb.subcontractor_id = sb.id
                                where 1=1
                                and (hsb.deleted =0 OR hsb.deleted is null)
                                and hsb.project_id = :W_project_id ";

            List<MySqlParameter> listParam = new List<MySqlParameter>();
            MySqlParameter parm1 = new MySqlParameter();
            parm1.MySqlDbType = MySqlDbType.String;
            parm1.ParameterName = ":W_project_id";
            parm1.Value = project_id;
            listParam.Add(parm1);

            if (!string.IsNullOrEmpty(subcontractor_id))
            {
                sql += " and hsb.subcontractor_id = :W_subcontractor_id ";
                MySqlParameter parm2 = new MySqlParameter();
                parm2.MySqlDbType = MySqlDbType.String;
                parm2.ParameterName = ":W_subcontractor_id";
                parm2.Value = subcontractor_id;
                listParam.Add(parm2);
            }

            if (ids.Length > 0)
            {
                sql += " and hsb.id in (" + DBUtil.ArrayToSQLIn(ids) + ") ";
            }

            if (selectYearMonth != null)
            {
                sql += " and (hsb.coming_date <= :W_COMING_DATE and (hsb.out_date is null or hsb.out_date >= :W_OUT_DATE)) ";
                MySqlParameter parm3 = new MySqlParameter();
                parm3.MySqlDbType = MySqlDbType.DateTime;
                parm3.ParameterName = ":W_COMING_DATE";
                parm3.Value = selectYearMonth;
                listParam.Add(parm3);

                MySqlParameter parm4 = new MySqlParameter();
                parm4.MySqlDbType = MySqlDbType.DateTime;
                parm4.ParameterName = ":W_OUT_DATE";
                parm4.Value = selectYearMonth;
                listParam.Add(parm4);
            }

            if (!string.IsNullOrEmpty(Name))
            {
                //sql += " and hsb.name = :W_Name ";
                sql += " and hsb.name like :W_Name ";
                MySqlParameter parm5 = new MySqlParameter();
                parm5.MySqlDbType = MySqlDbType.String;
                parm5.ParameterName = ":W_Name";
                parm5.Value = "%" + Name + "%";
                listParam.Add(parm5);
            }

            sql += @" order by hsb.name ";

            DataTable dt = DBHelper.Context.FromSql(sql).AddParameter(listParam.ToArray()).ToDataTable();
            return dt;
        }
#region datatable导出Excel公共方法
        /// <summary>
        /// DataTable转换成Excel文档流,并保存到文件
        /// </summary>
        /// <param name="table"></param>
        /// <param name="fileName">保存的路径</param>
        public static void RenderToExcel(DataTable table, string fileName)
        {
            using (MemoryStream ms = RenderToExcel(table))
            {
                SaveToFile(ms, fileName);
            }
        }

        /// <summary>
        /// DataTable转换成Excel文档流
        /// </summary>
        /// <param name="table"></param>
        /// <returns></returns>
        public static MemoryStream RenderToExcel(DataTable table)
        {
            #region
            MemoryStream ms = new MemoryStream();
            using (table)
            {
                IWorkbook workbook = new HSSFWorkbook();
                ISheet sheet = workbook.CreateSheet();
                IRow headerRow = sheet.CreateRow(0);

                #region 设置单元格为下拉框并限制输入值
                SetCellDropdownlist(sheet, 2, IdTextItem.ToItems(typeof(Model.性别)).Select(d => d.Text).ToArray());//性别
                SetCellDropdownlist(sheet, 6, IdTextItem.ToItems(typeof(Model.工种)).Select(d => d.Text).ToArray());//工种
                SetCellDropdownlist(sheet, 7, IdTextItem.ToItems(typeof(Model.学历)).Select(d => d.Text).ToArray());//学历
                SetCellDropdownlist(sheet, 9, IdTextItem.ToItems(typeof(Model.是否)).Select(d => d.Text).ToArray());//是否贫困县
                SetCellDropdownlist(sheet, 15, IdTextItem.ToItems(typeof(Model.EPC发放方式)).Select(d => d.Text).ToArray());//发放方式
                SetCellDropdownlist(sheet, 23, IdTextItem.ToItems(typeof(Model.是否)).Select(d => d.Text).ToArray());//特殊工种
                SetCellDropdownlist(sheet, 26, IdTextItem.ToItems(typeof(Model.是否)).Select(d => d.Text).ToArray());//购买保险
                #endregion

                // handling header.
                foreach (DataColumn column in table.Columns)
                    headerRow.CreateCell(column.Ordinal).SetCellValue(column.Caption);//If Caption not set, returns the ColumnName value

                // handling value.
                int rowIndex = 1;

                foreach (DataRow row in table.Rows)//遍历行数据
                {
                    IRow dataRow = sheet.CreateRow(rowIndex);//创建行
                    IDataFormat dataformat = workbook.CreateDataFormat();//创建单元格格式对象
                    foreach (DataColumn column in table.Columns)//遍历列数据
                    {
                        //dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());//创建单元格并赋值

                        #region 设置单元格是否可编辑样式
                        ICellStyle cellstyleLock = workbook.CreateCellStyle();//创建单元格样式对象
                        if (column.ToString() == "所属分包商")
                        {
                            cellstyleLock.IsLocked = true;//单元格上锁,单元格不可编辑
                        }
                        else
                        {
                            cellstyleLock.IsLocked = false;//单元格解除锁定,单元格可编辑
                            cellstyleLock.DataFormat = dataformat.GetFormat("text");//设置单元格格式,当前格式为文本
                        }
                        sheet.SetDefaultColumnStyle(column.Ordinal, cellstyleLock);//设置单元格样式
                        dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());//创建单元格并赋值
                        #endregion

                    }
                    rowIndex++;
                }
                sheet.ProtectSheet("MD5");//设置sheet受保护,使IsLocked属性生效
                AutoSizeColumns(sheet);//自动设置Excel列宽

                workbook.Write(ms);
                ms.Flush();
                ms.Position = 0;
            }
            return ms;
            #endregion
        }

        /// <summary>
        /// 自动设置Excel列宽
        /// </summary>
        /// <param name="sheet">Excel表</param>
        private static void AutoSizeColumns(ISheet sheet)
        {
            if (sheet.PhysicalNumberOfRows > 0)
            {
                IRow headerRow = sheet.GetRow(0);

                for (int i = 0, l = headerRow.LastCellNum; i < l; i++)
                {
                    sheet.AutoSizeColumn(i);
                }
            }
        }

        /// <summary>
        /// 保存Excel文档流到文件
        /// </summary>
        /// <param name="ms">Excel文档流</param>
        /// <param name="fileName">文件名</param>
        private static void SaveToFile(MemoryStream ms, string fileName)
        {
            using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write))
            {
                byte[] data = ms.ToArray();

                fs.Write(data, 0, data.Length);
                fs.Flush();

                data = null;
            }
        }

        /// <summary>
        /// 设置单元格为下拉框并限制输入值
        /// </summary>
        /// <param name="sheet"></param>
        private static void SetCellDropdownlist(ISheet sheet, int columnIndex, string[] listVals)
        {
            //设置生成下拉框的行和列(开始行,结束行,开始列,结束列)
            //当开始列=结束列时,仅当前列设置下拉框
            var cellRegions = new CellRangeAddressList(0, 65535, columnIndex, columnIndex);
            //var cellRegions = new CellRangeAddressList(0, 65535, 0, 0);

            //设置 下拉框内容
            DVConstraint constraint = DVConstraint.CreateExplicitListConstraint(listVals);

            //绑定下拉框和作用区域,并设置错误提示信息
            HSSFDataValidation dataValidate = new HSSFDataValidation(cellRegions, constraint);
            dataValidate.CreateErrorBox("输入不合法", "请输入下拉列表中的值。");
            dataValidate.ShowPromptBox = true;

            sheet.AddValidationData(dataValidate);
        }
        #endregion

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值