Npoi将excel数据导入到sqlserver数据库

时间:2021-05-13 04:25:22
  1         /// <summary>
  2         /// 将excel导入到datatable
  3         /// </summary>
  4         /// <param name="filePath">excel路径</param>
  5         /// <returns>返回datatable</returns>
  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<DataRow> removelist = new List<DataRow>();
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第一个导入这样就全装好了简单又省事