📄 dataimport.aspx.cs
字号:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Text;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using Salien.Utility;
using SlnDataImp.Template;
namespace SlnDataImp.DataImp
{
/// <summary>
/// DataImport 的摘要说明。
/// </summary>
public class DataImport : System.Web.UI.Page
{
private Excel.Application xlApp;
private Excel._Workbook xlWorkbook;
private Excel._Worksheet xlWorksheet;
private string m_strFullPath=@"C:\Inetpub\wwwroot\SlnDataImp\UpLoad\temp.xls"; //上传文件在服务器上的全路径
//private string m_strFullPath; //上传文件在服务器上的全路径
private ClsTemplate template; //模板
#region web page controls
protected System.Web.UI.WebControls.Label lblMsg;
protected System.Web.UI.WebControls.Button btnExlToSwap;
protected System.Web.UI.WebControls.Button btnUpload;
protected System.Web.UI.WebControls.Button btnSwapToTB;
protected System.Web.UI.WebControls.DropDownList cboTemp;
protected System.Web.UI.WebControls.Button btnTempDetail;
protected System.Web.UI.HtmlControls.HtmlInputFile fileBrowser;
#endregion
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
this.lblMsg.Text="";
if(ViewState["m_strFullPath"]!=null)
{
m_strFullPath=ViewState["m_strFullPath"].ToString();
}
if(!Page.IsPostBack)
{
FillCboTemp();
}
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.btnUpload.Click += new System.EventHandler(this.btnUpload_Click);
this.btnExlToSwap.Click += new System.EventHandler(this.btnExlToSwap_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void FillCboTemp()
{
string strSql="select * from ZX_Templet_TB";
DataTable dt=SlnDataAccess.GetDataTable(strSql);
foreach(DataRow row in dt.Rows)
{
string strTempName=row["TempName"].ToString();
string strTempID=row["TempID"].ToString();
ListItem item=new ListItem(strTempName,strTempID);
cboTemp.Items.Add(item);
}
cboTemp.Items.Insert(0," ");
}
private string BuildImpTask(string strTempid)
{
//生成批次任务
//ZX_ImpTask_TB
string strSql="select SeqZX_ImpTask.nextval from dual";
DataTable dt=SlnDataAccess.GetDataTable(strSql);
string strImpTaskID=dt.Rows[0][0].ToString();
string strTime=System.DateTime.Now.ToString();
strSql="insert into ZX_ImpTask_TB(Imptaskid,Tempid,Imptaskname,Imptaskstartime)"
+ " values(" + strImpTaskID + "," + strTempid + ",'临时任务',to_date('"
+ strTime + "','yyyy-mm-dd hh24:mi:ss'))";
string strRtn=SlnDataAccess.ExecuteSQL2(strSql);
if(strRtn=="")
{
return strImpTaskID;
}
else
{
return ""; //表示错误
}
}
private void UpdateImpTask(string strImpTaskID,string strMsg)
{
#region 更新数据导入任务
string strTime=System.DateTime.Now.ToString();
string strSql="update ZX_ImpTask_TB set imptaskloginfo='"
+ strMsg + "',imptaskendtime=to_date('"
+ strTime + "','yyyy-mm-dd hh24:mi:ss')"
+ " where ImpTaskID=" + strImpTaskID;
string strRtn=SlnDataAccess.ExecuteSQL2(strSql);
#endregion
}
private string GetSqlTemplate(string[] arrSwapColName,string strImpTaskID)
{
string strSql="insert into ZX_SWAPDATA_TB(ID,ImpTaskID,";
foreach(string s in arrSwapColName)
{
if(s!=null && s!="")
{
strSql+=s + ",";
}
}
strSql=strSql.TrimEnd(',');
strSql+=") Values(SeqZX_SWAPDATA.nextval," + strImpTaskID + ",#VALUES#)";
return strSql;
}
private void btnExlToSwap_Click(object sender, System.EventArgs e)
{
#region 把excel数据导入中间表
//一行一行读起 构造成一行一行的sql
if(cboTemp.SelectedIndex<1)
{
this.lblMsg.Text="必须选择一个模板";
return;
}
string strTempid=cboTemp.SelectedValue; //得到模板号
template=new ClsTemplate(Convert.ToInt32(strTempid)); //查询得到模板相关信息
string strImpTaskID=BuildImpTask(strTempid); //批次id
int intStarRowIndex=template.TempStarRow;
string[] arrExlColName;
string[] arrSwapColName;
template.GetSwapInfo(out arrExlColName,out arrSwapColName);
string strSqlTemplate=GetSqlTemplate(arrSwapColName,strImpTaskID);
string strSql=string.Empty;
if(!OpenExcel())
{
return;
}
string strMsg=string.Empty;
string strValue=string.Empty;
int i=intStarRowIndex;
//读到完全的一个空行,则返回
while(ReadExlRowData(i,arrExlColName,out strValue))
{
strSql=strSqlTemplate.Replace("#VALUES#",strValue);
strMsg+=SlnDataAccess.ExecuteSQL2(strSql);
i+=1;
}
if(strMsg=="")
{
strMsg="数据已经倒入中间表";
}
UpdateImpTask(strImpTaskID,strMsg); //更新任务表
this.lblMsg.Text=strMsg;
CloseExcel();
#endregion
}
private bool ReadExlRowData(int intRowIndex,string[] arrColNames,out string strValue)
{
//读取一行数据,用逗号分开
bool blnRtn=false;
strValue=string.Empty;
int n=arrColNames.Length;
StringBuilder sb=new StringBuilder(n*20);
foreach(string s in arrColNames)
{
if(s!=null && s!="")
{
string strCellText=ReadExlCellData(intRowIndex,s);
if(strCellText=="")
{
sb.Append("null,");
}
else
{
sb.Append("'");
sb.Append(strCellText);
sb.Append("',");
blnRtn=true; //表示该行至少有一个值,不是空行
}
}
}
strValue=sb.ToString();
strValue=strValue.TrimEnd(',');
return blnRtn;
}
private string ReadExlCellData(int intRowIndex,string strColName)
{
//读取一个cell的数据,如果为空 返回 null
Excel.Range rngCell=(Excel.Range)xlWorksheet.Cells[intRowIndex,strColName];
string strRtn=rngCell.Text.ToString().Trim();
return strRtn;
}
private bool OpenExcel()
{
#region open the file
string strMSG=string.Empty;
if(m_strFullPath==null || m_strFullPath=="")
{
this.lblMsg.Text="请先选择需要导入的文件";
return false;
}
GC.Collect();
try
{
strMSG="启动excel进程";
xlApp = new Excel.Application();
xlApp.Visible = false;
xlApp.DisplayAlerts = false;
strMSG="打开指定文件[" + m_strFullPath + "]";
xlWorkbook = (Excel._Workbook)(xlApp.Workbooks.Add(m_strFullPath)); // 获取Workbook
xlWorksheet = (Excel._Worksheet)xlWorkbook.ActiveSheet;
}
catch(System.Exception ex)
{
CloseExcel(); //普通方法停止excel进程
this.lblMsg.Text=strMSG + "出错:" + ex.Message;
return false;
}
finally
{
//一定要想办法杀死启动的excel进程
}
return true;
#endregion
}
private void CloseExcel()
{
if(xlWorkbook != null)
xlWorkbook.Close(null,null,null);
if(xlApp != null)
{
xlApp.Workbooks.Close();
xlApp.Quit();
}
System.Runtime.InteropServices.Marshal.ReleaseComObject (xlWorksheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject (xlWorkbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject (xlApp);
xlWorksheet=null;
xlWorkbook=null;
xlApp = null;
GC.Collect();
}
private void btnUpload_Click(object sender, System.EventArgs e)
{
#region 把文件拷入临时文件夹
string strServerPath=@"..\UpLoad\";
string strFileName =fileBrowser.PostedFile.FileName;
string strUploadFileName=string.Empty; //文件名
string strUploadServerPath=string.Empty; //临时文件全路径
if(strFileName == "")
{
this.lblMsg.Text = "请选择需要导出的数据文件!";
return;
}
if (Path.GetExtension(strFileName)!=".xls")
{
this.lblMsg.Text = "请选择正确的exl数据文件!";
return;
}
strUploadFileName=Path.GetFileName(strFileName);
strUploadServerPath=Server.MapPath(strServerPath + strUploadFileName);
if (File.Exists(strUploadServerPath))
{
try
{
File.Delete(strUploadServerPath);
}
catch(System.Exception ex)
{
string strMsg="需要上传的文件在目录中已经存在,并且在删除它时出现错误,错误信息:[" + ex.Message + "]";
this.lblMsg.Text=strMsg;
return;
}
}
this.fileBrowser.PostedFile.SaveAs(strUploadServerPath); //upload
ViewState["m_strFullPath"]=strUploadServerPath;
m_strFullPath=strUploadServerPath;
this.lblMsg.Text="文件已经上传";
#endregion
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -