最近在做一个球员管理系统,在系统中添加球员信息时必须单个添加,所以考虑用execl表格的形式批量添加球员相关数据(execl内容形式要与数据库形式对应),且添加的过程中要实现重复球员信息过滤,也就是说,已经在数据库中存在的,就不再进行添加了。下面是实现的具体过程:
第一步:将execl表格内容存储在DataTable中
1、导入npoi数据包(百度下载添加引用即可)
2、添加using NPOI.SS.UserModel
3、新建execl文件,并输入要添加的内容
我在桌面新建了一个球员数据的execl文件,因为我的数据库是七列,所以文件的内容也是分为七列来输入的,分别是 姓名、号码、身高、体重、位置、总冠军个数、百度百科链接
4、选择要打开的文件
利用OpenFileDialog属性找到要导入的文件,利用fileName返回完整文件路径
OpenFileDialog fileDialog = new OpenFileDialog(); fileDialog.Multiselect = true; fileDialog.Title = "请选择文件"; fileDialog.Filter = "所有文件(*xls*)|*.xls*"; //设置要选择的文件的类型 string fileName = ""; if (fileDialog.ShowDialog() == DialogResult.OK) { fileName = fileDialog.FileName;//返回文件的完整路径 }
5、读取文件内容,并保存在DataTable中
具体代码如下:
IWorkbook workbook = null; //新建IWorkbook对象 FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); if (fileName.IndexOf(".xls") > 0) // 2003版本 { workbook = new HSSFWorkbook(fileStream); //xls数据读入workbook } ISheet sheet = workbook.GetSheetAt(0); //获取第一个工作表 IRow row; //datatable数据表 DataTable dt1 = new DataTable(); //创建七个纵列 dt1.Columns.Add("姓名", typeof(System.String)); dt1.Columns.Add("号码", typeof(System.String)); dt1.Columns.Add("身高", typeof(System.String)); dt1.Columns.Add("体重", typeof(System.String)); dt1.Columns.Add("位置", typeof(System.String)); dt1.Columns.Add("总冠军个数", typeof(System.String)); dt1.Columns.Add("百度百科链接", typeof(System.String)); for (int i = 0; i < sheet.LastRowNum + 1; i++) //对工作表每一行 { DataRow dr1 = dt1.NewRow();//新建行 row = sheet.GetRow(i); //row读入第i行数据 if (row != null) { dr1["姓名"] = row.GetCell(0).ToString().Trim(); //获取i行j列数据 dr1["号码"] = row.GetCell(1).ToString().Trim(); //获取i行j列数据 dr1["身高"] = row.GetCell(2).ToString().Trim(); //获取i行j列数据 dr1["体重"] = row.GetCell(3).ToString().Trim(); //获取i行j列数据 dr1["位置"] = row.GetCell(4).ToString().Trim(); //获取i行j列数据 dr1["总冠军个数"] = row.GetCell(5).ToString().Trim(); //获取i行j列数据 dr1["百度百科链接"] = row.GetCell(6).ToString().Trim(); //获取i行j列数据 } dt1.Rows.Add(dr1);//将行加入数据表dt1 } fileStream.Close(); workbook.Close();
注意:获取值的时候一定要使用Trim()取出空格,否则在接下来进行去重操作时可能会因为控制导致去重失败!(都是教训,请记住!!!)
第二步:将DataTable数据导入数据库(sql server)
1、连接数据库并去重
SqlConnection conn = new SqlConnection("Data Source = (local);Initial Catalog = 球员管理系统;Integrated Security=True"); conn.Open(); //若与数据库成员重合,则在此删除dt中重合行,下面再进行插入操作 SqlCommand cmd = new SqlCommand("select * from 信息", conn); SqlDataReader sdr = cmd.ExecuteReader(); while (sdr.Read()) { for (int i = 0; i < dt1.Rows.Count; i++) { if (sdr.GetString(0).ToString().Trim() == dt1.Rows[i][0].ToString()) { dt1.Rows[i].Delete(); } } } sdr.Close();
2、插入数据库
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(conn)) { try { bulkCopy.DestinationTableName = "信息";//要插入的表的表名 bulkCopy.BatchSize = dt1.Rows.Count; bulkCopy.ColumnMappings.Add("姓名", "姓名");//表中的字段名 第一个“id”是dt中的字段名,第二个“id”表中的字段名 bulkCopy.ColumnMappings.Add("号码", "号码"); bulkCopy.ColumnMappings.Add("身高", "身高"); bulkCopy.ColumnMappings.Add("体重", "体重"); bulkCopy.ColumnMappings.Add("位置", "位置"); bulkCopy.ColumnMappings.Add("总冠军个数", "总冠军个数"); bulkCopy.ColumnMappings.Add("百度百科链接", "百度百科链接"); bulkCopy.WriteToServer(dt1); MessageBox.Show("插入成功:" + dt1.Rows.Count + "行"); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
3、关闭释放连接
conn.Close();
conn.Dispose();
第三步:测试
1、选择桌面execl文件
2、导入
由于数据库早已添加这些球员的数据,所以提示添加0行
到这里,这个功能就完成了,第一次写,如有错误,欢迎大家指正。