1、頁面后台代碼添加如下屬性:
/// <summary> /// 總數 /// </summary> private double total { set { Session["DPMS.POP.POP_ExcelLeadIn_total"] = value; } get { if (Session["DPMS.POP.POP_ExcelLeadIn_total"] == null) { return 0; } return Convert.ToDouble(Session["DPMS.POP.POP_ExcelLeadIn_total"]); } } /// <summary> /// 當前進度 /// </summary> private int cur { set { Session["DPMS.POP.POP_ExcelLeadIn_cur"] = value; } get { if (Session["DPMS.POP.POP_ExcelLeadIn_cur"] == null) { return 0; } return Convert.ToInt32(Session["DPMS.POP.POP_ExcelLeadIn_cur"]); } } /// <summary> /// 錯誤信息 /// </summary> private string errMsg { set { Session["DPMS.POP.POP_ExcelLeadIn_errMsg"] = value; } get { if (Session["DPMS.POP.POP_ExcelLeadIn_errMsg"] == null) { return string.Empty; } return Session["DPMS.POP.POP_ExcelLeadIn_errMsg"].ToString(); } } /// <summary> /// 開始時間 /// </summary> private DateTime startTime { set { Session["DPMS.POP.POP_ExcelLeadIn_startTime"] = value; } get { if (Session["DPMS.POP.POP_ExcelLeadIn_startTime"] == null) { return DateTime.Now; } return Convert.ToDateTime(Session["DPMS.POP.POP_ExcelLeadIn_startTime"]); } }
2、在處理數據的開始,初始化total和startTime變量:
total = int.Parse(dataSet.Tables[0].Rows[0][0].ToString());
startTime = DateTime.Now;
3、在處理數據過程中,不斷累加cur:
cur++;
4、前端每隔500毫秒獲取進度:
<script type="text/javascript">
//更新進度
function refreshProcess() {
var itv = setInterval(function () {
$.ajax({
url: "ExcelLeadIn.aspx?action=getProcess&t=" + new Date().valueOf(),
type: "POST",
data: {},
success: function (data) {
if (data == "導入進度:100.00%") {
clearInterval(itv);
$("#msg").html(data);
alert("導入成功");
} else {
if (data.indexOf("錯誤:") == 0) {
clearInterval(itv);
}
$("#msg").html(data);
}
}
});
}, 500);
}
refreshProcess();
</script>
5、后台計算進度:
protected void Page_Load(object sender, EventArgs e) { string result = string.Empty; if (Request["action"] == "getProcess") { try { LoginEntity loginUser = (LoginEntity)this.Session[BasePage.LOGIN_USER_KEY]; string userId = loginUser.USER_ID; if (string.IsNullOrEmpty(errMsg)) { if (total == 0) { result = "導入進度:0%"; } else { DateTime now = DateTime.Now; TimeSpan ts = now - startTime; string time = string.Empty; double per = cur / total; if (per > 0) { double totalSeconds = ts.TotalSeconds / per - ts.TotalSeconds; if (totalSeconds > 60) { time = (int)Math.Round(totalSeconds / 60) + "分"; } else { time = (int)Math.Round(totalSeconds) + "秒"; } } string percent = (cur / total * 100).ToString("0.00"); if (percent == "100.00") { cur = 0; total = 0; result = string.Format("導入進度:{0}%", percent); } else { result = string.Format("導入進度:{0}%,剩余時間:{1}", percent, time); } } } else { result = "錯誤:" + errMsg; } } catch (Exception ex) { result = "錯誤:" + ex.Message; } } if (!string.IsNullOrEmpty(result)) { Response.Write(result); Response.End(); } }
效果圖(文字錯了,不是“導入進度”,而是“數據處理進度:”):

