快速找出DataTable中的重复行 【值得收藏】

mac2022-06-30  79

public override DataTable GetUserDataDTList( string excelPath) 02 . 03 . { 04 . 05 . excelPath = excelPath.Trim(); 06 . 07 . string filename = null ; 08 . 09 . try 10 . 11 . { 12 . 13 . filename = System.Configuration.ConfigurationSettings.AppSettings[ " filename " ].ToString(); 14 . 15 . } 16 . 17 . catch (Exception ex) 18 . 19 . { 20 . 21 . filename = null ; 22 . 23 . throw ex; 24 . 25 . } 26 . 27 . DataTable dt = new DataTable(); 28 . 29 . // DataSet ds = new DataSet(); 30 . 31 . if ( string .IsNullOrEmpty(excelPath)) 32 . 33 . { 34 . 35 . dt = null ; 36 . 37 . // ds = null; 38 . 39 . } 40 . 41 . else 42 . 43 . { 44 . 45 . try 46 . 47 . { 48 . 49 . string strConn = @" Provider = Microsoft.ACE.OLEDB.12.0;Data Source= " + excelPath + " ;Extended Properties = 'Excel 12.0;HDR=Yes;IMEX=1;' " ; 50 . 51 . using (OleDbConnection oconn = new OleDbConnection(strConn)) 52 . 53 . { 54 . 55 . OleDbCommand ocmd = null ; 56 . 57 . oconn.Open(); 58 . 59 . try 60 . 61 . { 62 . 63 . ocmd = new OleDbCommand( " SELECT * FROM [ " + filename + " $] " , oconn); // 在web.config中配置 64 . 65 . OleDbDataAdapter oda = new OleDbDataAdapter(ocmd); 66 . 67 . oda.Fill(dt); 68 . 69 . } 70 . 71 . catch (OleDbException oex) 72 . 73 . { 74 . 75 . dt = null ; 76 . 77 . throw oex; 78 . 79 . // ds = null; 80 . 81 . } 82 . 83 . finally 84 . 85 . { 86 . 87 . oconn.Close(); 88 . 89 . ocmd.Dispose(); 90 . 91 . } 92 . 93 . } 94 . 95 . } 96 . 97 . catch (Exception ex) 98 . 99 . { 100 . 101 . throw ex; 102 . 103 . } 104 . 105 . } 106 . 107 . // return ds.Tables[0]; 108 . 109 . return dt; 110 . 111 . }

说明:该方法需要一个参数用来获取Excel文件的路径,找到后放到一个DataTable中。  对于第二条,为了提高性能,我是这样实现的,每次遍历时只跟它后面的数据比较,因为它前面的数据已经跟它比较过了,没必要它再跟前面的数据比较

/// <summary> 02 . 03 . /// 查看Excel文件中重复的数据 04 . 05 . /// 该方法只是比较编号和客户名称,其他字段没有比较 06 . 07 . /// </summary> 08 . 09 . /// <param name="excelPath"> string:Excel文件路径 </param> 10 . 11 . /// <returns> ArrayList:重复行组成的动态数组 </returns> 12 . 13 . public static ArrayList arrCFData( string excelPath) 14 . 15 . { 16 . 17 . ArrayList arrUserData = new ArrayList(); 18 . 19 . excelPath = excelPath.Trim(); 20 . 21 . if ( string .IsNullOrEmpty(excelPath)) 22 . 23 . { 24 . 25 . arrUserData = null ; 26 . 27 . } 28 . 29 . else 30 . 31 . { 32 . 33 . string ret = null ; 34 . 35 . DataTable dtCompInfo = null ; 36 . 37 . try 38 . 39 . { 40 . 41 . dtCompInfo = DF.DBFactory.GetCompanyDAO().GetUserDataDTList(excelPath); 42 . 43 . if (dtCompInfo != null && dtCompInfo.Rows.Count > 0 ) 44 . 45 . { 46 . 47 . int count = dtCompInfo.Rows.Count; 48 . 49 . int x, y; 50 . 51 . for ( int i = 0 ; i < count;i ++ ) 52 . 53 . { 54 . 55 . for ( int j = i + 1 ; j < count; j ++ ) 56 . 57 . { 58 . 59 . if (dtCompInfo.Rows[i][ 0 ].ToString().Equals(dtCompInfo.Rows[j][ 0 ].ToString()) && dtCompInfo.Rows[i][ 3 ].ToString().Equals(dtCompInfo.Rows[j][ 3 ].ToString())) 60 . 61 . { 62 . 63 . x = i + 2 ; 64 . 65 . y = j + 2 ; 66 . 67 . ret = string .Format( " Excel数据中第{0}行和第{1}行数据重复 " ,x, y); 68 . 69 . arrUserData.Add(ret); 70 . 71 . break ; 72 . 73 . } 74 . 75 . } 76 . 77 . // arrUserData.Add(dtCompInfo.Rows[i][0].ToString() + "出来吧" + dtCompInfo.Rows[i][3].ToString()); 78 . 79 . 80 . 81 . } 82 . 83 . } 84 . 85 . } 86 . 87 . catch (Exception ex) 88 . 89 . { 90 . 91 . ExceptionManager.SaveException(ex, " Company.cs " , ex.Message); 92 . 93 . arrUserData = null ; 94 . 95 . } 96 . 97 . finally 98 . 99 . { 100 . 101 . dtCompInfo = null ; 102 . 103 . } 104 . 105 . } 106 . 107 . return arrUserData; 108 . 109 . }

转载于:https://www.cnblogs.com/Mr0909/archive/2011/05/09/2041523.html

最新回复(0)