读取Excel内容,导入数据库多张表!

客户要求用Excel记录联系人资料,并导入数据库,找了个第3方Wizard控件做了个小功能。
Excel每一个sheet为一个企业名,为了避免麻烦,一次性导入所有联系人。
 同一企业下的相同姓名,相同手机号的为同一个联系人,就不导入。
Excel表中,有些字段不在同一张表:“部门”、“职务”。判断部门和职务是否存在,若不存在添加到部门和职务表,返回ID。
几次测试,取手机号等字段出错,原来要把Excel单元格格式设为文本。
/* 
              Author:Magicam
 *         Date: 1 August 2007
              Email:wx_magicam@qq.com
 * 
*/
        
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Data.OleDb;
using CristiPotlog.Controls;//引用第3方向导式控件
using System.Configuration;

namespace Excel
{
    
public partial class ExcelForm : Form
    
{
        
public ExcelForm()
        
{
            InitializeComponent();
        }


        
public static readonly string ConnectionString = ConfigurationManager.ConnectionStrings[ "DataConnectionString" ].ConnectionString;

        
/// <summary>
        
/// 完成按钮
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void wizard1_Finish( object sender, EventArgs e )
        
{
            MessageBox.Show( 
"导入成功!"this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information );
        }


        
private void wizard1_Cancel( object sender, CancelEventArgs e )
        
{
            
bool isTaskRunning = this.timer1.Enabled;
            
this.timer1.Enabled = false;

            
if ( MessageBox.Show( "确定退出吗?"this.Text, MessageBoxButtons.YesNo, MessageBoxIcon.Question ) != DialogResult.Yes )
            
{
                e.Cancel 
= true;
                
this.timer1.Enabled = isTaskRunning;
            }

        }


        
/// <summary>
        
/// time控件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void timer1_Tick( object sender, EventArgs e )
        
{
            
if ( this.progressBar1.Value == this.progressBar1.Maximum )
            
{
                
this.timer1.Enabled = false;
                
this.wizard1.Next();
            }

            
else
            
{
                
this.progressBar1.PerformStep();
            }

        }


        
/// <summary>
        
/// 选择Excel按钮
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void btnChooseExcel_Click( object sender, EventArgs e )
        
{
            OpenFileDialog openFileDialog 
= new OpenFileDialog();
            openFileDialog.Filter 
= "Microsoft Excel 文件(*.xls)|*.xls";
            openFileDialog.Title 
= "选择Excel文件";

            
if ( DialogResult.Cancel == openFileDialog.ShowDialog())
            
{
                
return;
            }


            
string ExcelPath = openFileDialog.FileName;
            txtExcelPath.Text 
= ExcelPath;

            
string ConnectionExcel = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + ExcelPath + ";" + "Extended Properties=Excel 8.0;";

            OleDbConnection conn 
= new OleDbConnection( ConnectionExcel );
            conn.Open();
            System.Data.DataTable schemaTable 
= conn.GetOleDbSchemaTable( System.Data.OleDb.OleDbSchemaGuid.Tables, null );

            dataGridView1.Rows.Clear();
            dataGridView1.Columns.Clear();

            
//定义dataGridView第一列
            dataGridView1.RowHeadersVisible = false;
            DataGridViewTextBoxColumn textColumn 
= new DataGridViewTextBoxColumn();
            textColumn.HeaderText 
= "工作表";
            dataGridView1.Columns.Insert( 
0, textColumn );
            
//定义dataGridView第二列
            DataGridViewComboBoxColumn comboColumn = new DataGridViewComboBoxColumn();
            comboColumn.HeaderText 
= "选择企业";
            comboColumn.AutoComplete 
= true;
            dataGridView1.Columns.Insert( 
1, comboColumn );

            SqlConnection con 
= new SqlConnection( ConnectionString );
            con.Open();

            
forint i = 0; i < schemaTable.Rows.Count; i++ )
            
{
                
//取出Excel工作表名导入dataGridView第一列
                string tableName = schemaTable.Rows[ i ][ 2 ].ToString().Trim( new char[] '$''\'' } );
                dataGridView1.Rows.Add();
                dataGridView1.Rows[ i ].Cells[ 
0 ].Value = tableName;

                OnInitComboBox( i );
            }
          
        }


        
private void OnInitComboBox( int row )
        
{
            
//第二列根据第一列做模糊查询,供用户选择企业名
            SqlConnection con = new SqlConnection( ConnectionString );
            con.Open();

            SqlDataAdapter sda 
= new SqlDataAdapter();
            DataSet ds 
= new DataSet();

            
string name = dataGridView1.Rows[ row ].Cells[ 0 ].Value.ToString();
            
string str = "select id, name from enterprise where name like '%" + name + "%'";

            sda.SelectCommand 
= new SqlCommand( str, con );
            sda.Fill( ds, 
"enterprise" );

            (( DataGridViewComboBoxCell )( dataGridView1.Rows[ row ].Cells[ 
1 ] )).DataSource    = ds.Tables[ 0 ].DefaultView;
            (( DataGridViewComboBoxCell )( dataGridView1.Rows[ row ].Cells[ 
1 ] )).ValueMember   = "id";
            (( DataGridViewComboBoxCell )( dataGridView1.Rows[ row ].Cells[ 
1 ] )).DisplayMember = "name";
        }


        
private void wizard1_BeforeSwitchPages( object sender, Wizard.BeforeSwitchPagesEventArgs e )
        
{
            WizardPage oldPage 
= this.wizard1.Pages[ e.OldIndex ];

            
if ( oldPage == this.ChooseExcelPage && e.NewIndex > e.OldIndex )
            
{                
                
if ( txtExcelPath.Text == "" )
                
{                   
                    MessageBox.Show( 
"请选择一个Excel文件!"this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information );
                    e.Cancel 
= true;
                }

            }

            
else if( oldPage == this.ChooseEnterprisePage && e.NewIndex > e.OldIndex )
            
{
                SqlConnection con 
= new SqlConnection( ConnectionString );
                con.Open();

                
forint i = 0; i<dataGridView1.Rows.Count; i++ )
                
{
                    
if( dataGridView1.Rows[ i ].Cells[ 1 ].Value == null )
                    
{
                        MessageBox.Show( 
"请选择企业!",  this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information );                        
                        e.Cancel 
= true;
                    }
                    
                }

            }

            
else if( oldPage == this.ProgressPage && e.NewIndex > e.OldIndex )
            
{
                
//导入数据库 
                forint i = 0; i<dataGridView1.Rows.Count; i++ )
                
{
                    
//读取Excel内容到table
                    DataSet DataSet = ReadExcelToTable( i );                                 

                    
forint j = 0; j<DataSet.Tables[ 0 ].Rows.Count; j++ )
                    
{
                        SqlConnection con 
= new SqlConnection( ConnectionString );
                        con.Open();   
                        SqlTransaction transaction;
                        transaction 
= con.BeginTransaction();
                        
try
                        
{
                            
//判断联系人是否重复,若重复跳出循环,不添加
                            string LinkmanName = DataSet.Tables[ 0 ].Rows[ j ].ItemArray[ 0 ].ToString();
                            
string LinkmanMobile = DataSet.Tables[ 0 ].Rows[ j ].ItemArray[ 3 ].ToString();
                            SqlCommand selectLinkmanName 
= new SqlCommand();
                            selectLinkmanName.Connection 
= con;
                            selectLinkmanName.CommandText 
= "select count( * ) from linkman where enterpriseid='" + dataGridView1.Rows[i].Cells[1].Value.ToString() + "'and name='" + LinkmanName + "' and mobile='" + LinkmanMobile + "'";
                            selectLinkmanName.Transaction 
= transaction;
                            
int LinkmanCount = Convert.ToInt32( selectLinkmanName.ExecuteScalar());

                            
if( LinkmanCount > 0 )
                            
{
                                
continue;                               
                            }
            

                            
//判断是否存在该部门,不存在添加                   
                            int departmentID = ExistDepartment( con, DataSet, j, transaction );

                            
//判断是否存在该职务,不存在添加
                            int dutyID = ExistDuty( con, DataSet, j, transaction );

                            
//导入数据库
                            InsertTOSql( con, i, DataSet, j, departmentID, dutyID, transaction );
                        }

                        
catch( Exception e1 )
                        
{
                            transaction.Rollback();        
                        }

                        
finally
                        
{
                            transaction.Commit();
                            con.Close();
                        }

                    }

                }
 
            }

        }


        
private void InsertTOSql( SqlConnection con, int i, DataSet DataSet, int j, int departmentID, int dutyID, SqlTransaction transaction )
        
{
            SqlCommand insertToSql 
= new SqlCommand();
            insertToSql.Connection 
= con;
            insertToSql.CommandText 
= @"insert into linkman( enterpriseID, name, departmentID, dutyID, mobile, phone, email, fax, IsLinkman )
                                      values( 
" + dataGridView1.Rows[ i ].Cells[ 1 ].Value.ToString() + ", '" + DataSet.Tables[ 0 ].Rows[ j ].ItemArray[ 0 ].ToString() + "', " + departmentID + ""
                          
+ dutyID + ", '" + DataSet.Tables[ 0 ].Rows[ j ].ItemArray[ 3 ].ToString() + "', '" + DataSet.Tables[ 0 ].Rows[ j ].ItemArray[ 4 ].ToString() + "', '" +
                          DataSet.Tables[ 
0 ].Rows[ j ].ItemArray[ 5 ].ToString() + "', '" + DataSet.Tables[ 0 ].Rows[ j ].ItemArray[ 6 ].ToString() + "', 1 )"
            insertToSql.Transaction 
= transaction;
            insertToSql.ExecuteNonQuery();            
        }


        
private static int ExistDuty( SqlConnection con, DataSet DataSet, int j, SqlTransaction transaction )
        
{
            SqlCommand selectDuty 
= new SqlCommand();
            selectDuty.Connection 
= con;
            selectDuty.CommandText 
= "select id from duty where name ='" + DataSet.Tables[ 0 ].Rows[ j ].ItemArray[ 2 ].ToString() + "'";
            selectDuty.Transaction 
= transaction;
            
int dutyID = Convert.ToInt32( selectDuty.ExecuteScalar());
            
if ( dutyID == 0 )
            
{
                SqlCommand insertDuty 
= new SqlCommand();
                insertDuty.Connection 
= con;
                insertDuty.CommandText 
= "insert into duty( name ) values( '" + DataSet.Tables[0].Rows[ j ].ItemArray[ 2 ].ToString() + "')";
                insertDuty.Transaction 
= transaction;
                insertDuty.ExecuteNonQuery(); 
               
                dutyID 
= GetID( con, transaction );
            }

            
return dutyID;
        }


        
private static int ExistDepartment( SqlConnection con, DataSet DataSet, int j, SqlTransaction transaction )
        
{
            SqlCommand selectDepartment 
= new SqlCommand();
            selectDepartment.Connection 
= con;
            selectDepartment.CommandText 
= "select id from department where name = '" + DataSet.Tables[ 0 ].Rows[ j ].ItemArray[ 1 ].ToString() + "'";
            selectDepartment.Transaction 
= transaction;
            
int departmentID = Convert.ToInt32( selectDepartment.ExecuteScalar());
            
if ( departmentID == 0 )
            
{
                SqlCommand insertDepartment 
= new SqlCommand();
                insertDepartment.Connection 
= con;

                insertDepartment.CommandText 
= "insert into department( name ) values( '" + DataSet.Tables[ 0 ].Rows[ j ].ItemArray[ 1 ].ToString() + "' )";
                insertDepartment.Transaction 
= transaction;
                insertDepartment.ExecuteNonQuery();
               
                departmentID 
= GetID( con, transaction );
            }

            
return departmentID;
        }


        
private static int GetID( SqlConnection con, SqlTransaction transaction )
        
{
            
string sql = "select @@identity";
            SqlCommand command 
= new SqlCommand( sql, con );
            command.Transaction 
= transaction;
            
return Convert.ToInt32( command.ExecuteScalar());
        }


        
private DataSet ReadExcelToTable( int i )
        
{
            
string ConnectionExcel = "Provider=Microsoft.Jet.Oledb.4.0;Data Source='" + txtExcelPath.Text + "';Extended Properties=Excel 8.0";
            OleDbConnection connection 
= new OleDbConnection( ConnectionExcel );
            OleDbDataAdapter adp 
= new OleDbDataAdapter( "Select * from  [" + dataGridView1.Rows[ i ].Cells[ 0 ].Value.ToString() + "$]", connection );
            DataSet DataSet 
= new DataSet();
            adp.Fill( DataSet, 
"Book1" );
            
return DataSet;
        }


        
private void wizard1_AfterSwitchPages( object sender, Wizard.AfterSwitchPagesEventArgs e )
        
{
            WizardPage newPage 
= this.wizard1.Pages[ e.NewIndex ];

            
if( newPage == this.ChooseExcelPage )
            
{
                
this.wizard1.NextEnabled = this.ChooseEnterprisePage.Enabled;
            }

            
else if( newPage == this.ChooseEnterprisePage )
            
{
                
this.wizard1.NextEnabled = this.ProgressPage.Enabled;
            }

            
else if( newPage == this.ProgressPage)
            
{
                
this.wizard1.BackEnabled = false;
                
this.wizard1.NextEnabled = false;
                
this.progressBar1.Value = this.progressBar1.Minimum;
                
this.timer1.Enabled = true;
            }

        }

    }

}



posted @ 2007-08-01 00:20  Magicam  阅读(2131)  评论(4编辑  收藏  举报