应用情景:
一、简单型
只有一个数据列表,从数据库读取表数据,在程序端构造DataTable,格式化为中文(同时处理合计结果),前台页面绑定(使用中文字段绑定),后台调用NOPI导出到EXCEL;
二、复杂型
在一的基础上增加:
1、存在多个数据列表(例如:汇总、明细);
2、可按行进行合计;
3、列名可能是动态增加的(例如支付方式:微信、支付宝、现金、刷卡);
解决方案:
(一)定义页面全局DataTable
private DataTable dtTicketSumReport = new DataTable(); protected Dictionary<string, decimal> dcTicketSum = new Dictionary<string, decimal>(); //用作合计
( 二)初始化字典对象
private void InitDictionary() { this.dcTicketSum.Add("数量", 0); this.dcTicketSum.Add("手续费", 0); this.dcTicketSum.Add("优惠金额", 0); this.dcTicketSum.Add("合计", 0); this.dcTicketSum.Add("成本合计", 0); foreach (UserOperatorMoneyPaymentType item in Enum.GetValues(typeof(UserOperatorMoneyPaymentType))) { this.dcTicketSum.Add(item.ToString(), decimal.Zero); //动态添加字典项; } }
(三)初始化全局Datatable
private void InitGlobalTable() { DataTable dtMoneyDetail = ds.Tables[0]; //从数据库获取数据 //格式化列名(使用中文,导出时也是使用同一个Table) this.dtTicketSumReport.Columns.Add("OperatorId", typeof(int)); //..... this.dtTicketSumReport.Columns.Add("成本", typeof(decimal)); dcMoney = new DataColumn("手续费", typeof(decimal)); //增加列 dcMoney.DefaultValue = "0.00"; this.dtTicketSumReport.Columns.Add(dcMoney); Dictionary<byte, string> dcPaymentType = new Dictionary<byte, string>(); //根据数据库的实际记录,把要增加的列先添加到字典dcPaymentType中 foreach (DataRow dr in dtMoneyDetail.Rows) { byte paymentType = (byte)dr["PaymentType"]; if (!dcPaymentType.ContainsKey(paymentType)) { string columnName = null; UserOperatorMoneyPaymentType paymentTypeEnum; if (!Enum.TryParse<UserOperatorMoneyPaymentType>(paymentType.ToString(), out paymentTypeEnum)) { Response.Write("未定义支付方式" + paymentType.ToString()); Response.End(); } columnName = paymentTypeEnum.ToString(); dcPaymentType.Add(paymentType, columnName); } } foreach (DataRow dr in dtOrderTicketNumSum.Rows) { //读取列名 string amountColumnName = dcPaymentType[paymentType]; //合计: Dictionary<string, decimal> dcTicketSum = new Dictionary<string, decimal>(); this.dcTicketSum["合计"] = this.dcTicketSum["合计"] + realAmount + poundage; this.dcTicketSum[amountColumnName] = this.dcTicketSum[amountColumnName] + realAmount; DataRow drFind = this.dtTicketSumReport.Rows.Find(new object[] { operatorId, scheduleId }); //检查是否已经添加过要新增加的列 if (!this.dtTicketSumReport.Columns.Contains(amountColumnName)) { //增加列 dcMoney = new DataColumn(amountColumnName, typeof(decimal)); dcMoney.DefaultValue = "0.00"; this.dtTicketSumReport.Columns.Add(dcMoney); } if (drFind == null) { drFind = this.dtTicketSumReport.NewRow(); //...... this.dtTicketSumReport.Rows.Add(drFind); } else { drFind["合计"] = (Convert.ToDecimal(drFind["合计"]) + realAmount + poundage).ToString(); } } if (this.dtTicketSumReport!= null) { this.dtTicketSumReport.PrimaryKey = null; this.dtTicketSumReport.Columns.Remove("TicketId"); //去掉不再需要的列(前台页面不用绑定;导出时不用显示); } }
四、绑定前台页面、
private void InitControl() { this.InitGlobalTable(); this.rpTicketSum.DataSource = this.dtTicketSumReport; this.rpTicketSum.DataBind(); }
五、导出EXCEL
private void ProcessExport() { this.InitGlobalTable(); DateTime beginDate = DateTime.Parse(this.dpBeginDate.Text); DateTime endDate = DateTime.Parse(this.dpEndDate.Text); DataTable[] dtArr = null; string[] dtArrTips = null; if (true) { dtArr = .... dtArrTips = new string[] { ........ }; } else { dtArr = ...... dtArrTips = new string[] { .......}; } string fileName = (beginDate == endDate ? beginDate.ToString("yyyy-MM-dd") : string.Format("{0}至{1}", beginDate.ToString("yyyy-MM-dd"), endDate.ToString("yyyy-MM-dd"))) + salerName + "....."; string excelSubTitle = fileName; string[] sumColumnNameArray = new string[] { ....... }; SSM_EC.Site.NpoiExcel.ExportExcel(dtArr, dtArrTips, fileName, AspxHelper.GetExcelHeader(), excelSubTitle, false, AspxHelper.GetExcelProtectPassword(), sumColumnNameArray, null, false, null); }
时间: 2024-11-06 09:36:31