zoukankan      html  css  js  c++  java
  • XAF 如何批量汇入数据从Excel中

    1.首先用ExcelReader类实现读取Excel数据

    2.定义一个泛型方法负责根据不同的BO汇入数据

    3.实现代码

      1>ExcelReaer类

    代码
    /// <summary>
        
    /// 操作Excel幫助類
        
    /// 2010-08-02
        
    /// </summary>
        public class ExcelReader : IDisposable
        {
            
    #region Variables
            
    private int[] _PKCol;
            
    private string _strExcelFilename;
            
    private bool _blnMixedData=true;
            
    private bool _blnHeaders=false;        
            
    private string _strSheetName;
            
    private string _strSheetRange;
            
    private bool _blnKeepConnectionOpen=false;
            
    private OleDbConnection _oleConn; 
            
    private OleDbCommand _oleCmdSelect;
            
    private OleDbCommand _oleCmdUpdate;
            
    #endregion

            
    #region properties

            
    private string _StrWhere;
            
    /// <summary>
            
    /// 匯入條件: where 之後條件
            
    /// </summary>
            public string StrWhere
            {
                
    get
                {
                    
    return _StrWhere;
                }
                
    set
                {
                    _StrWhere 
    = value;
                }
            } 

            
    public int[] PKCols
            {
                
    get {return _PKCol;}
                
    set {_PKCol=value;}
            }

            
    public string ColName(int intCol)
            {
                
    string sColName="";
                
    if (intCol<26)
                    sColName
    = Convert.ToString(Convert.ToChar((Convert.ToByte((char'A')+intCol)) );
                
    else
                {
                    
    int intFirst = ((int) intCol / 26);
                    
    int intSecond = ((int) intCol % 26);
                    sColName
    = Convert.ToString(Convert.ToByte((char'A')+intFirst);
                    sColName 
    += Convert.ToString(Convert.ToByte((char'A')+intSecond);
                }
                
    return sColName;
            }

            
    public int ColNumber(string strCol)
            {
                strCol 
    = strCol.ToUpper(); 
                
    int intColNumber=0;
                
    if (strCol.Length>1
                {
                    intColNumber 
    = Convert.ToInt16(Convert.ToByte(strCol[1])-65);  
                    intColNumber 
    += Convert.ToInt16(Convert.ToByte(strCol[1])-64)*26
                }
                
    else
                    intColNumber 
    = Convert.ToInt16(Convert.ToByte(strCol[0])-65);  
                
    return intColNumber;
            }

            
    public String[] GetExcelSheetNames(){
                System.Data.DataTable dt 
    = null;
                
    try{
                    
    if (_oleConn ==null) Open();
                    
    // Get the data table containing the schema
                    dt = _oleConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                    
    if(dt == null){
                        
    return null;
                    }
                    String[] excelSheets 
    = new String[dt.Rows.Count];
                    
    int i = 0;
                    
    // Add the sheet name to the string array.
                    foreach(DataRow row in dt.Rows){
                        
    string strSheetTableName = row["TABLE_NAME"].ToString();
                        excelSheets[i] 
    = strSheetTableName.Substring(0,strSheetTableName.Length-1); 
                        i
    ++;
                    }
                    
    return excelSheets;
                }
                
    catch(Exception){
                    
    return null;
                }
                
    finally{
                    
    // Clean up.
                    if(this.KeepConnectionOpen==false){
                        
    this.Close();
                    }
                    
    if(dt != null){
                        dt.Dispose();
                        dt
    =null;
                    }
                }
            }
                                                                
            
    public string ExcelFilename
            {
                
    get { return _strExcelFilename;}
                
    set { _strExcelFilename=value;}
            }
            
    public string SheetName
            {
                
    get { return _strSheetName;}
                
    set { _strSheetName=value;}
            }
            
    public string SheetRange
            {
                
    get {return _strSheetRange;}
                
    set 
                {
                    
    if (value.IndexOf(":")==-1throw new Exception("Invalid range length"); 
                    _strSheetRange
    =value;}
            }        
            
    public bool KeepConnectionOpen
            {
                
    get { return _blnKeepConnectionOpen;}
                
    set {_blnKeepConnectionOpen=value;}
            }
            
    public bool Headers
            {
                
    get { return _blnHeaders;}
                
    set { _blnHeaders=value;}
            }
            
    public bool MixedData
            {
                
    get {return _blnMixedData;}
                
    set {_blnMixedData=value;}
            }
            
    #endregion

            
    #region Methods
            
            
    #region Excel Connection
            
    private string ExcelConnectionOptions()
            {
                
    string strOpts="";
                
    if (this.MixedData ==true)
                    strOpts 
    += "Imex=2;";
                
    if (this.Headers==true)
                    strOpts 
    += "HDR=Yes;";
                
    else    
                    strOpts 
    += "HDR=No;";
                
    return strOpts;
            }
            
            
    private string ExcelConnection()
            {
                
    return
                    
    @"Provider=Microsoft.Jet.OLEDB.4.0;" + 
                    
    @"Data Source=" + _strExcelFilename  + ";" + 
                    
    @"Extended Properties=" + Convert.ToChar(34).ToString() + 
                    
    @"Excel 8.0;"+ ExcelConnectionOptions() + Convert.ToChar(34).ToString(); 
            }
            
    #endregion


            
    #region Open / Close
            
    public void Open()
            {
                
    try
                {
                    
    if (_oleConn !=null)
                    {
                        
    if (_oleConn.State==ConnectionState.Open)
                        {
                            _oleConn.Close();
                        }
                        _oleConn
    =null;
                    }

                    
    //Server.MapPath("MyWebSite");

                    

                    
    //MapPath("XX");

                    
    if (System.IO.File.Exists(_strExcelFilename)==false)
                    {
                        
    throw new Exception("Excel file " + _strExcelFilename +  "could not be found.");
                    }
                    _oleConn 
    = new OleDbConnection(ExcelConnection());  
                    _oleConn.Open();                   
                }
                
    catch (Exception ex)
                {
                    
    throw ex;
                }
            }

            
    public void Close()
            {
                
    if (_oleConn !=null)
                {
                    
    if (_oleConn.State != ConnectionState.Closed) 
                        _oleConn.Close(); 
                    _oleConn.Dispose();
                    _oleConn
    =null;
                }
            }
            
    #endregion

            
    #region Command Select
            
    private bool SetSheetQuerySelect()
            {
                
    try
                {
                    
    if (_oleConn == null)
                    {
                        
    throw new Exception("Connection is unassigned or closed."); 
                    }

                    
    if (_strSheetName.Length ==0)
                        
    throw new Exception("Sheetname was not assigned."); 

                    _oleCmdSelect 
    =new OleDbCommand(
                        
    @"SELECT * FROM [" 
                        
    + _strSheetName + "$"
                     
                        
    + _strSheetRange
                        
    + "]" + _StrWhere , _oleConn);   
                
                    
    return true;
                }            
                
    catch (Exception ex)
                {
                    
    throw ex;
                }
                

            }
            
    #endregion

            
    #region simple utilities
            
    private string AddWithComma(string strSource,string strAdd)
            {
                
    if (strSource !="") strSource = strSource += "";
                
    return strSource + strAdd;
            }

            
    private string AddWithAnd(string strSource,string strAdd)
            {
                
    if (strSource !="") strSource = strSource += " and ";
                
    return strSource + strAdd;
            }
            
    #endregion

            
    private OleDbDataAdapter SetSheetQueryAdapter(DataTable dt)
            {
                
    // Deleting in Excel workbook is not possible
                
    //So this command is not defined
                try
                {
                    
    if (_oleConn == null)
                    {
                        
    throw new Exception("Connection is unassigned or closed."); 
                    }


                    
    if (_strSheetName.Length ==0)
                        
    throw new Exception("Sheetname was not assigned."); 
                    
                    
    if (PKCols == null)
                        
    throw new Exception("Cannot update excel sheet with no primarykey set."); 
                    
    if (PKCols.Length<1
                        
    throw new Exception("Cannot update excel sheet with no primarykey set."); 
                        
                    OleDbDataAdapter oleda 
    = new OleDbDataAdapter(_oleCmdSelect);                 
                    
    string strUpdate="";
                    
    string strInsertPar="";
                    
    string strInsert="";
                    
    string strWhere="";
                    
                    
                    
    for (int iPK=0;iPK<PKCols.Length;iPK++)
                    {
                        strWhere 
    = AddWithAnd(strWhere,dt.Columns[iPK].ColumnName +  "=?"); 
                    }
                    strWhere 
    =" Where "+strWhere;

                    
    for (int iCol=0;iCol<dt.Columns.Count;iCol++)
                    {
                        strInsert
    = AddWithComma(strInsert,dt.Columns[iCol].ColumnName);
                        strInsertPar
    = AddWithComma(strInsertPar,"?");
                        strUpdate
    = AddWithComma(strUpdate,dt.Columns[iCol].ColumnName)+"=?";
                    }

                    
    string strTable = "["+ this.SheetName + "$" + this.SheetRange + "]";  
                    strInsert 
    = "INSERT INTO "+ strTable + "(" + strInsert +") Values (" + strInsertPar + ")";
                    strUpdate 
    = "Update " + strTable + " Set " + strUpdate + strWhere;
                    
                    
                    oleda.InsertCommand 
    = new OleDbCommand(strInsert,_oleConn);
                    oleda.UpdateCommand 
    = new OleDbCommand(strUpdate,_oleConn); 
                    OleDbParameter oleParIns 
    = null;
                    OleDbParameter oleParUpd 
    = null;
                    
    for (int iCol=0;iCol<dt.Columns.Count;iCol++)
                    {
                        oleParIns 
    = new OleDbParameter("?",dt.Columns[iCol].DataType.ToString());
                        oleParUpd 
    = new OleDbParameter("?",dt.Columns[iCol].DataType.ToString());
                        oleParIns.SourceColumn 
    =dt.Columns[iCol].ColumnName;
                        oleParUpd.SourceColumn 
    =dt.Columns[iCol].ColumnName;
                        oleda.InsertCommand.Parameters.Add(oleParIns);
                        oleda.UpdateCommand.Parameters.Add(oleParUpd);
                        oleParIns
    =null;
                        oleParUpd
    =null;
                    }

                    
    for (int iPK=0;iPK<PKCols.Length;iPK++)
                    {
                        oleParUpd 
    = new OleDbParameter("?",dt.Columns[iPK].DataType.ToString());
                        oleParUpd.SourceColumn 
    =dt.Columns[iPK].ColumnName;
                        oleParUpd.SourceVersion 
    = DataRowVersion.Original;
                        oleda.UpdateCommand.Parameters.Add(oleParUpd);
                    }
                    
    return oleda;
                }            
                
    catch (Exception ex)
                {
                    
    throw ex;
                }
                
            }

            
    #region command Singe Value Update
            
    private bool SetSheetQuerySingelValUpdate(string strVal)
            {
                
    try
                {
                    
    if (_oleConn == null)
                    {
                        
    throw new Exception("Connection is unassigned or closed."); 
                    }

                    
    if (_strSheetName.Length ==0)
                        
    throw new Exception("Sheetname was not assigned."); 

                    _oleCmdUpdate 
    =new OleDbCommand(
                        
    @" Update [" 
                        
    + _strSheetName 
                        
    + "$" + _strSheetRange
                        
    + "] set F1=" + strVal, _oleConn);   
                    
    return true;
                }            
                
    catch (Exception ex)
                {
                    
    throw ex;
                }
                

            }
            
    #endregion

            

            
    public void SetPrimaryKey(int intCol)
            {
                _PKCol 
    = new int[1] { intCol };            
            }

            

            
    private void SetPrimaryKey(DataTable dt)
            {
                
    try
                {
                    
    if (PKCols!=null)
                    {
                        
    //set the primary key
                        if (PKCols.Length>0)
                        {
                            DataColumn[] dc;
                            dc 
    = new DataColumn[PKCols.Length];
                            
    for (int i=0;i<PKCols.Length;i++)
                            {
                                dc[i] 
    =dt.Columns[PKCols[i]]; 
                            }
                    
                            
                            dt.PrimaryKey 
    = dc;

                        }
                    }
                }
                
    catch (Exception ex)
                {
                    
    throw ex;
                }
            }

             
    public DataTable GetTable()
            {
                
    return GetTable("ExcelTable");
            }
            
    public DataTable GetTable(string strTableName)
            
            {
                
    try
                {
                    
    //Open and query
                    if (_oleConn ==null) Open();
                    
    if (_oleConn.State != ConnectionState.Open)
                        
    throw new Exception("Connection cannot open error."); 
                    
    if (SetSheetQuerySelect()==falsereturn null;

                    
    //Fill table
                    OleDbDataAdapter oleAdapter = new OleDbDataAdapter();   
                    oleAdapter.SelectCommand 
    = _oleCmdSelect;   
                    DataTable dt 
    = new DataTable(strTableName+"1");
                    oleAdapter.FillSchema(dt, SchemaType.Source);  
                    oleAdapter.Fill(dt);
                    
    if (this.Headers ==false)
                    {
                        
    if (_strSheetRange.IndexOf(":")>0)
                        {
                            
    string FirstCol = _strSheetRange.Substring(0,_strSheetRange.IndexOf(":")-1); 
                            
    int intCol = this.ColNumber(FirstCol);
                            
    for (int intI=0;intI<dt.Columns.Count;intI++)
                            {
                                dt.Columns[intI].Caption 
    =ColName(intCol+intI);
                            }
                        }
                    }
                    SetPrimaryKey(dt);
                    
    //Cannot delete rows in Excel workbook
                    dt.DefaultView.AllowDelete =false;
                
                    
    //Clean up
                    _oleCmdSelect.Dispose();
                    _oleCmdSelect
    =null;
                    oleAdapter.Dispose();
                    oleAdapter
    =null;
                    
    if (KeepConnectionOpen==false) Close();
                    
    return dt;            

                }
                
    catch (Exception ex)
                {
                    
    throw ex;
                }
            }

            
    private void CheckPKExists(DataTable dt)
            {
                
    if (dt.PrimaryKey.Length==0
                    
    if (this.PKCols !=null)
                    {
                        SetPrimaryKey(dt);
                    }
                    
    else
                        
    throw new Exception("Provide an primary key to the datatable"); 
            }
            
    public DataTable SetTable(DataTable dt)
            {
                
    try
                {
                    DataTable dtChanges 
    = dt.GetChanges();
                    
    if (dtChanges == nullthrow new Exception("There are no changes to be saved!"); 
                    CheckPKExists(dt);
                    
    //Open and query
                    if (_oleConn ==null) Open();
                    
    if (_oleConn.State != ConnectionState.Open)
                        
    throw new Exception("Connection cannot open error."); 
                    
    if (SetSheetQuerySelect()==falsereturn null;

                    
    //Fill table
                    OleDbDataAdapter oleAdapter = SetSheetQueryAdapter(dtChanges);        
                    
                    oleAdapter.Update(dtChanges); 
                    
    //Clean up
                    _oleCmdSelect.Dispose();
                    _oleCmdSelect
    =null;
                    oleAdapter.Dispose();
                    oleAdapter
    =null;
                    
    if (KeepConnectionOpen==false) Close();
                    
    return dt;            
                }
                
    catch (Exception ex)
                {
                    
    throw ex;
                }
            }

            
    #region Get/Set Single Value

            
    public void SetSingleCellRange(string strCell)
            {
                _strSheetRange 
    = strCell + ":" + strCell;
            }

            
    public object GetValue(string strCell)
            {
                SetSingleCellRange(strCell);
                
    object objValue=null;
                
    //Open and query
                if (_oleConn ==null) Open();
                
    if (_oleConn.State != ConnectionState.Open)
                    
    throw new Exception("Connection is not open error."); 

                
    if (SetSheetQuerySelect()==falsereturn null;
                objValue 
    = _oleCmdSelect.ExecuteScalar();

                _oleCmdSelect.Dispose();
                _oleCmdSelect
    =null;    
                
    if (KeepConnectionOpen==false) Close();
                
    return objValue;
            }

            
    public void SetValue(string strCell,object objValue)
            {
                
                
    try
                {

                    SetSingleCellRange(strCell);
                    
    //Open and query
                    if (_oleConn ==null) Open();
                    
    if (_oleConn.State != ConnectionState.Open)
                        
    throw new Exception("Connection is not open error."); 
                    
                    
    if (SetSheetQuerySingelValUpdate(objValue.ToString())==falsereturn;
                    objValue 
    = _oleCmdUpdate.ExecuteNonQuery(); 

                    _oleCmdUpdate.Dispose();
                    _oleCmdUpdate
    =null;    
                    
    if (KeepConnectionOpen==false) Close();
                }
                
    catch (Exception ex)
                {
                    
    throw ex;
                }
                
    finally
                {
                    
    if (_oleCmdUpdate != null)
                    {
                        _oleCmdUpdate.Dispose();
                        _oleCmdUpdate
    =null;
                    }
                }
                
            }
            
    #endregion
            

            
    #endregion

            
    #region Dispose / Destructor
            
    public     void Dispose()
            {
                
    if (_oleConn !=null)
                {
                    _oleConn.Dispose();
                    _oleConn
    =null;
                }
                
    if (_oleCmdSelect!=null)
                {
                    _oleCmdSelect.Dispose(); 
                        _oleCmdSelect
    =null;
                }
                
    // Dispose of remaining objects.
            }
    #endregion
        
            
    #region CTOR
            
    public ExcelReader()
            {
                
    //
                
    // TODO: Add constructor logic here
                
    //
            }
            
    /// <summary>
            
    /// 默認有表頭
            
    /// </summary>
            
    /// <param name="filName"></param>
            
    /// <param name="sheetName"></param>
            public ExcelReader(string fileName, string sheetName)
            {
                
    if (string.IsNullOrEmpty(fileName) == true)
                { 
    throw new ArgumentNullException("文件名不能為空!"); }
                
    if (string.IsNullOrEmpty(sheetName) == true) { throw new ArgumentNullException("Excel文件中Sheet Name不能為空!");
                }
                
    this.ExcelFilename = fileName;
                
    this.SheetName = sheetName;
                
    //this.Headers = true;
            }
            
    /// <summary>
            
    /// 初始化
            
    /// </summary>
            
    /// <param name="filName">表名稱和路徑</param>
            
    /// <param name="sheetName">Excel中Sheet name</param>
            
    /// <param name="isHeaders">是否有表頭,默認是false</param>
            public ExcelReader(string fileName,string sheetName,bool isHeaders)
            {
                
    if (string.IsNullOrEmpty(fileName) == true)
                { 
    throw new ArgumentNullException("文件名不能為空!"); }
                
    if (string.IsNullOrEmpty(sheetName) == true)
                {
                    
    throw new ArgumentNullException("Excel文件中Sheet Name不能為空!");
                }
                
                
    this.ExcelFilename = fileName;
                
    this.SheetName     = sheetName;
                
    this.Headers       = isHeaders;
            }
            
    #endregion
        }

         2>汇入数据的业务逻辑类

    代码
     /// <summary>
        
    /// 匯入數據業務邏輯
        
    /// 2010-08-01
        
    /// </summary>
        public class ImportDataLogic
        {
           
           
    #region 匯入MRF單
            
            
    public static ImportDataDelegate<MP_MRF> CreateMP_MRFImportDataDelegate()
            {
                
    return delegate (Session session, object [] args) 
                {
                    DataRow row;
                    User currentUser;
                    Init(session, args, 
    out row, out currentUser);

                    MP_MRF mrf 
    = new MP_MRF(session);
                    mrf.OrderNO 
    = row["PRODUCTIONNO"].ToString();
                    mrf.Plnt 
    = row["PLANT"].ToString();
                    mrf.Material 
    = row["MATERIAL"].ToString();
                    mrf.Description 
    = row["MATERIAL_DESCRIPTION"].ToString();
                    mrf.Order_Qty 
    = int.Parse(row["ORDER_QTY"].ToString());
                    mrf.QtyOfOuter 
    = int.Parse(row["QTY/OUTER"].ToString());
                    mrf.Unit 
    = row["BASE_UNIT"].ToString();
                    mrf.COMPONENT 
    = row["COMPONENT"].ToString();
                    mrf.COMPONENT_DESCRIPTION 
    = row["COMPONENT_DESCRIPTIO"].ToString();
                    mrf.COMPONENT_QTY 
    = int.Parse(row["COMPONENT_QTY"].ToString());
                    mrf.COMPONENT_SCRAP 
    = decimal.Parse(row["COMPONENT_SCRAP"].ToString());
                    mrf.COMPONT_UNIT 
    = row["COMPONT_UNIT"].ToString();
                    mrf.Start_Date 
    = DateTime.Now;
                    mrf.Finish_Date 
    =DateTime.Now;
                    mrf.Write_Date 
    = DateTime.Now;
                    mrf.Create_Date 
    = DateTime.Now;
                    mrf.Create_Uid 
    = currentUser;
                    mrf.Write_Uid 
    = currentUser; //mrf.Save();
                    
                    
    return mrf;
                };
            }

            
    public static ValidateDataDelegate<MP_MRF> CreateMP_MRFValidateDataDelegate()
            {
                
    return (mrf, args) =>
                {
                    
    if(mrf != null)
                       
    return mrf.Plnt.Length <= 4 ;//在此写入验证逻辑
                    return false;
                };
            }
            
    #endregion
            
    #region Mothed
           
         

            
    /// <summary>
            
    /// 初始化匯入對象帶masterObject
            
    /// </summary>
            
    /// <param name="session"></param>
            
    /// <param name="args"></param>
            
    /// <param name="masterObject"></param>
            
    /// <param name="currentUser"></param>
            
    /// <param name="row"></param>
            private static void Init(Session session, object[] args, out object masterObject, out User currentUser, out DataRow row)
            {
                masterObject 
    = null;
                currentUser 
    = null;
                row 
    = null;
                
    if (args != null)
                {
                    masterObject 
    = args[0];
                    row 
    = (DataRow)args[1];
                    currentUser 
    = session.GetObjectByKey<User>(SecuritySystem.CurrentUserId);
                }
                
    else { throw new ArgumentNullException("args"); }
            }
            
    /// <summary>
            
    /// 初始化匯入對象
            
    /// </summary>
            
    /// <param name="session"></param>
            
    /// <param name="args"></param>
            
    /// <param name="row"></param>
            
    /// <param name="currentUser"></param>
            private static void Init(Session session, object[] args, out DataRow row, out User currentUser)
            {
                
    if (args == null)
                { 
    throw new ArgumentNullException("args"); }
                
    //object masterObject = args[0];
                row = (DataRow)args[1];
                currentUser 
    = session.GetObjectByKey<User>(SecuritySystem.CurrentUserId);
            }
            
            
    /// <summary>
            
    /// 將對象轉換為字符且截取兩端空格
            
    /// </summary>
            
    /// <param name="obj"></param>
            
    /// <returns></returns>
            private static  string ToStingTrim(object obj)
            {
                
    if (obj == null)
                { 
    return ""; }
                
    return obj.ToString ().Trim();
            }
            
    /// <summary>
            
    /// 
            
    /// </summary>
            
    /// <param name="obj"></param>
            
    /// <returns></returns>
            private static int ToInt(object obj)
            {
                
    if (obj == null) { 
                    
    //throw new  ArgumentNullException("Object");
                    return 0;
                }
                
    return int.Parse(obj.ToString());
            } 
            
    #endregion
        }

           3>汇入数据管理类

       

    代码
     /// <summary>
        
    /// 匯入數據代理
        
    /// </summary>
        
    /// <typeparam name="T"></typeparam>
        
    /// <param name="sessin"></param>
        
    /// <param name="args"></param>
        
    /// <returns></returns>
        public delegate  T ImportDataDelegate<T>(Session sessin, params object[] args);

        
    /// <summary>
        
    /// 驗證要匯入數據代理
        
    /// </summary>
        
    /// <typeparam name="T"></typeparam>
        
    /// <param name="data"></param>
        
    /// <param name="args"></param>
        
    /// <returns></returns>
        public delegate bool ValidateDataDelegate<T>(T data, params object[] args);

        
    /// <summary>
        
    /// 
        
    /// </summary>
        public class ImportDataManager
        {
            
    /// <summary>
            
    /// 匯入對象到ListView
            
    /// </summary>
            
    /// <typeparam name="T"></typeparam>
            
    /// <param name="dt">DataTable</param>
            
    /// <param name="importDataDelegate"></param>
            
    /// <param name="customValidateDataDelegate"></param>
            
    /// <param name="listView"></param>
            
    /// <returns></returns>
            public static int ImportData<T>(DataTable dt,ImportDataDelegate<T> importDataDelegate, ValidateDataDelegate<T> customValidateDataDelegate, ListView listView) where T : IXPSimpleObject
            {
                
    if (listView == null)
                {
                    
    throw new ArgumentNullException("listView");
                }
                UnitOfWork uow 
    = null;
                
    int countOK = 0;
                
    try
                {
                    
    if (listView.ObjectSpace == null)
                    {
                        
    throw new ArgumentNullException("listView.ObjecSpace");
                    }
                    uow 
    = new UnitOfWork(listView.ObjectSpace.Session.DataLayer);//
                    using (NestedUnitOfWork nestedUOW = uow.BeginNestedUnitOfWork()) {
                        PropertyCollectionSource pcs 
    = listView.CollectionSource as PropertyCollectionSource;
                        
    object masterObject = pcs != null ? nestedUOW.GetObjectByKey(pcs.MasterObjectType, nestedUOW.GetKeyValue(pcs.MasterObject)) : null;
                        
    foreach (DataRow row in dt.Rows){
                             T obj 
    = importDataDelegate(nestedUOW, masterObject, row);
                            
    #region Validate Object
                             
    if (obj != null)
                             {
                                 
    bool isValid = false;
                                 
    try
                                 {
                                     RuleSetValidationResult validationResult 
    = Validator.RuleSet.ValidateTarget(obj,new ContextIdentifiers(DefaultContexts.Save.ToString()));
                                     isValid 
    = validationResult.State != ValidationState.Invalid && (customValidateDataDelegate != null ? customValidateDataDelegate(obj, masterObject) : true);
                                     
    if (isValid)
                                     {
                                         nestedUOW.CommitChanges();
                                     }
                                 }
                                 
    catch (Exception )
                                 {
                                     isValid 
    = false;
                                 }
                                 
    finally
                                 {
                                     
    if (isValid)
                                     {
                                         countOK
    ++;
                                     }
                                 }
                             }
                            
    #endregion
                        }
                    }
                    uow.CommitChanges();
                }
                
    catch (Exception commitException){
                    
    try {
                        uow.RollbackTransaction();
                    }
                    
    catch (Exception rollBackException){
                        
    throw new Exception(String.Format("異常類型 {0} 撤銷匯入數據 {1} type.\n錯誤信息:{2}\n堆棧跟蹤:{3}", rollBackException.GetType(), typeof(T), rollBackException.Message, rollBackException.StackTrace), rollBackException);
                    }
                    
    throw new UserFriendlyException(new Exception(String.Format("匯入失敗!\n異常類型 {0} 當匯入數據 {1} 類型.\n錯誤信息 = {2}\n堆棧跟蹤:{3}\n沒有記錄匯入.", commitException.GetType(), typeof(T), commitException.Message, commitException.StackTrace)));
                }
                
    finally{
                    uow.Dispose();
                    uow 
    = null;
                }
                listView.ObjectSpace.Refresh();
                
    return countOK;
            }

            
    public static void ImportData<T>(DataTable dt,ImportDataDelegate<T> importDataDelegate, ValidateDataDelegate<T> customValidateDataDelegate, ListView listView,bool notifyAboutResults)  where  T : IXPSimpleObject
            {
                
    int countOK = ImportData<T>(dt,importDataDelegate,customValidateDataDelegate,listView);
                
    if(notifyAboutResults == true)
                {
                    
    throw new UserFriendlyException(new Exception(string.Format("已經匯入{0}條記錄!", countOK)));
                }
            }
        }

    4.调用方法:

         

    代码
    string fileName = "";
    string sheetName = "Sheet1";
    bool isHeader = true;
    ExcelReader er 
    = null;
    DataTable dt 
    = null;
    OpenFileDialog ofd 
    = new OpenFileDialog();
    ofd.Filter 
    = "Excel 文件|*.xls";
    ofd.ShowDialog();
    fileName 
    = ofd.FileName;
    if (string.IsNullOrEmpty(fileName) == truereturn;
    er 
    = new ExcelReader(fileName, sheetName, isHeader);
    er.MixedData 
    = true;
    er.KeepConnectionOpen 
    = true;

    dt 
    = er.GetTable();
    ImportDataManager.ImportData
    <WH_IL>(dt, ImportDataLogic.CreateDummyWH_ILImportDataDelegate(),
                                ImportDataLogic.CreateWH_ILValidateDataDelegate(), listView, 
    true);

     

    欢迎转载,转载请注明出处:http://www.cnblogs.com/Tonyyang/

  • 相关阅读:
    增强遍历和Object多参数遍历
    Git忽略规则(.gitignore配置)不生效原因和解决
    算法基本概念及常用算法Python实现
    使用GitBook编写项目文档
    Python 闭包
    Linux 进程管理
    Kafka 安装及入门
    IP地址0.0.0.0表示什么
    Docker 入门
    Docker Linux下安装
  • 原文地址:https://www.cnblogs.com/Tonyyang/p/1795823.html
Copyright © 2011-2022 走看看