C#将execl文件数据导入数据库(sql server)

时间:2022-07-14 06:35:34

  最近在做一个球员管理系统,在系统中添加球员信息时必须单个添加,所以考虑用execl表格的形式批量添加球员相关数据(execl内容形式要与数据库形式对应),且添加的过程中要实现重复球员信息过滤,也就是说,已经在数据库中存在的,就不再进行添加了。下面是实现的具体过程:

第一步:将execl表格内容存储在DataTable中

1、导入npoi数据包(百度下载添加引用即可)

2、添加using NPOI.SS.UserModel

3、新建execl文件,并输入要添加的内容

  我在桌面新建了一个球员数据的execl文件,因为我的数据库是七列,所以文件的内容也是分为七列来输入的,分别是 姓名、号码、身高、体重、位置、总冠军个数、百度百科链接

C#将execl文件数据导入数据库(sql server)

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文件

C#将execl文件数据导入数据库(sql server)

 

2、导入

 由于数据库早已添加这些球员的数据,所以提示添加0行

C#将execl文件数据导入数据库(sql server)

 

 C#将execl文件数据导入数据库(sql server)

  到这里,这个功能就完成了,第一次写,如有错误,欢迎大家指正。