1 ///2 /// 将excel导入到datatable 3 /// 4 /// excel路径 5 /// 返回datatable 6 DataTable ExcelTable = null; 7 FileStream fs = null; 8 DataColumn column = null; 9 DataRow dataRow = null; 10 IWorkbook workbook = null; 11 ISheet sheet = null; 12 IRow row = null; 13 ICell cell = null; 14 int startRow = 0; 15 public bool ExcelToDataTable(string filePath) 16 { 17 18 try 19 { 20 using (fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) 21 { 22 // 解决版本兼容 23 //07以前为xls,以后为xlsx 24 if (filePath.IndexOf(".xlsx") > 0) 25 { 26 workbook = new XSSFWorkbook(fs); 27 } 28 else if (filePath.IndexOf(".xls") > 0) 29 { 30 workbook = new HSSFWorkbook(fs); 31 } 32 if (workbook != null) 33 { 34 sheet = workbook.GetSheetAt(0);//读取第一个sheet 35 ExcelTable = new DataTable(); 36 if (sheet != null) 37 { 38 int rowCount = sheet.LastRowNum;//总行数 39 if (rowCount > 0) 40 { 41 IRow firstRow = sheet.GetRow(1);//第二行 42 int cellCount = firstRow.LastCellNum;//列数 43 //创建datatable的列 44 startRow = 2;//因为第一行是中文列名所以直接从第二行开始读取 45 for (int i = firstRow.FirstCellNum; i < cellCount; ++i) 46 { 47 cell = firstRow.GetCell(i); 48 if (cell != null) 49 { 50 if (cell.StringCellValue != null) 51 { 52 column = new DataColumn(cell.StringCellValue); 53 ExcelTable.Columns.Add(column); 54 } 55 } 56 } 57 58 //填充datatable行 59 for (int i = startRow; i <= rowCount; ++i) 60 { 61 row = sheet.GetRow(i); 62 if (row == null) continue; 63 64 dataRow = ExcelTable.NewRow(); 65 for (int j = row.FirstCellNum; j < cellCount; ++j) 66 { 67 cell = row.GetCell(j); 68 if (cell == null) 69 { 70 dataRow[j] = ""; 71 } 72 else 73 { 74 switch (cell.CellType) 75 { 76 case CellType.Blank: 77 dataRow[j] = ""; 78 break; 79 case CellType.Numeric: 80 short format = cell.CellStyle.DataFormat; 81 //对时间格式的处理 82 if (format == 14 || format == 31 || format == 57 || format == 58) 83 dataRow[j] = cell.DateCellValue; 84 else 85 dataRow[j] = cell.NumericCellValue; 86 break; 87 case CellType.String: 88 dataRow[j] = cell.StringCellValue; 89 break; 90 } 91 } 92 } 93 94 ExcelTable.Rows.Add(dataRow); 95 96 } 97 } 98 } 99 } 100 } 101 //由于excel表在删除一张表的时候回再次读取回出现空行的原因 102 //所以需要一个删除空行的方法⇣⇣⇣⇣ 103 List removelist = new List (); 104 for (int i = 0; i < ExcelTable.Rows.Count; i++) 105 { 106 bool IsNull = true; 107 for (int j = 0; j < ExcelTable.Columns.Count; j++) 108 { 109 if (!string.IsNullOrEmpty(ExcelTable.Rows[i][j].ToString().Trim())) 110 { 111 IsNull = false; 112 } 113 } 114 if (IsNull) 115 { 116 removelist.Add(ExcelTable.Rows[i]); 117 } 118 } 119 for (int i = 0; i < removelist.Count; i++) 120 { 121 ExcelTable.Rows.Remove(removelist[i]); 122 } 123 removelist.Clear(); 124 //遍历将datatable内的值存入数据库 125 foreach (DataRow item in ExcelTable.Rows) 126 { 127 128 RT_Community com = new Model.RT_Community(); 129 RT_UserInfo userinfo = new Model.RT_UserInfo(); 130 Guid guid = Guid.NewGuid(); 131 Guid guidu = Guid.NewGuid(); 132 int aid = GetVpnUserName(item[13].ToString()); 133 int query = 0; 134 135 using (var conn = PublicMethod.GetSqlConnection()) 136 { 137 //当小区名称存在时会返回-1 138 query = conn.Execute(@"IF NOT EXISTS 139 (SELECT Name FROM RT_Community WHERE Name=@Name ) 140 INSERT INTO RT_Community 141 (Id,VpnUser_id,Name,Sabb,PropertyName,PropertyUserName,PropertyPhone,Address,IsDelete) values 142 (@Id,@VpnUser_id,@Name,@Sabb,@PropertyName,@PropertyUserName,@PropertyPhone,@Address,@IsDelete)", 143 new { 144 Id = guid, 145 VpnUser_id = aid, 146 Name = item[0].ToString(), 147 Sabb = ChinesePinYin.GetSpellCode(item[0].ToString()), 148 PropertyName = item[1].ToString(), 149 PropertyUserName = item[2].ToString(), 150 PropertyPhone = item[3].ToString(), 151 Address = item[4].ToString(), 152 IsDelete = 0, 153 }); 154 } 155 //当返回-1时调用查询小区id的方法对guid重新赋值 156 if (query == -1) 157 { 158 guid = GetComId(item[0].ToString()); 159 if (guid.ToString() == "00000000-0000-0000-0000-000000000000") 160 { 161 //当返回的guid为0时 162 return false; 163 } 164 } 165 using (var conn = PublicMethod.GetSqlConnection()) 166 { 167 var result = conn.Execute(@"INSERT INTO RT_UserInfo 168 (Id, 169 rt_community_id, 170 UserCode, 171 Name, 172 BuildingNo, 173 UnitNo, 174 Floor, 175 HouseNo, 176 Address, 177 HeatType, 178 Location, 179 Phone, 180 IsDelete) VALUES 181 (@Id, 182 @rt_community_id, 183 @UserCode, 184 @Name, 185 @BuildingNo, 186 @UnitNo, 187 @Floor, 188 @HouseNo, 189 @Address, 190 @HeatType, 191 @Location, 192 @Phone, 193 @IsDelete)", 194 new 195 { 196 197 Id = guidu, 198 rt_community_id = guid, 199 UserCode = item[5].ToString(), 200 Name = item[6].ToString(), 201 BuildingNo = item[7].ToString(), 202 UnitNo = item[8].ToString(), 203 Floor = item[9].ToString(), 204 HouseNo = item[10].ToString(), 205 Location = item[11].ToString(), 206 Address = item[4].ToString(), 207 HeatType = 0, 208 Phone = item[12].ToString(), 209 IsDelete = 0 210 }); 211 } 212 213 } 214 //成功返回true 215 return true; 216 } 217 catch (Exception) 218 { 219 if (fs != null) 220 { 221 fs.Close(); 222 } 223 return false; 224 } 225 }
//使用时直接用nuget包搜索nopi第一个导入这样就全装好了简单又省事