¡¡¡¡public partial class ExcelHelper : IDisposable
¡¡¡¡{
¡¡¡¡#region Fileds
¡¡¡¡private string _excelObject = "Provider=Microsoft.{0}.OLEDB.{1};Data Source={2};Extended Properties=\"Excel {3};HDR={4};IMEX={5}\"";
¡¡¡¡private string _filepath = string.Empty;
¡¡¡¡private string _hdr = "No";
¡¡¡¡private string _imex = "1";
¡¡¡¡private OleDbConnection _con = null;
¡¡¡¡#endregion
¡¡¡¡#region Ctor
¡¡¡¡public ExcelHelper(string filePath)
¡¡¡¡{
¡¡¡¡this._filepath = filePath;
¡¡¡¡}
¡¡¡¡#endregion
¡¡¡¡#region Properties
¡¡¡¡/// <summary>
¡¡¡¡/// »ñÈ¡Á¬½Ó×Ö·û´®
¡¡¡¡/// </summary>
¡¡¡¡public string ConnectionString
¡¡¡¡{
¡¡¡¡get
¡¡¡¡{
¡¡¡¡string result = string.Empty;
¡¡¡¡if (String.IsNullOrEmpty(this._filepath))
¡¡¡¡return result;
¡¡¡¡//¼ì²éÎļþ¸ñʽ
¡¡¡¡FileInfo fi = new FileInfo(this._filepath);
¡¡¡¡if (fi.Extension.Equals(".xls"))
¡¡¡¡{
¡¡¡¡result = string.Format(this._excelObject, "Jet", "4.0", this._filepath, "8.0", this._hdr, this._imex);
¡¡¡¡}
¡¡¡¡else if (fi.Extension.Equals(".xlsx"))
¡¡¡¡{
¡¡¡¡result = string.Format(this._excelObject, "Ace", "12.0", this._filepath, "12.0", this._hdr, this._imex);
¡¡¡¡}
¡¡¡¡return result;
¡¡¡¡}
¡¡¡¡}
¡¡¡¡/// <summary>
¡¡¡¡/// »ñÈ¡Á¬½Ó
¡¡¡¡/// </summary>
¡¡¡¡public OleDbConnection Connection
¡¡¡¡{
¡¡¡¡get
¡¡¡¡{
¡¡¡¡if (_con == null)
¡¡¡¡{
¡¡¡¡this._con = new OleDbConnection();
¡¡¡¡this._con.ConnectionString = this.ConnectionString;
¡¡¡¡}
¡¡¡¡return this._con;
¡¡¡¡}
¡¡¡¡}
¡¡¡¡/// <summary>
¡¡¡¡/// HDR
¡¡¡¡/// </summary>
¡¡¡¡public string Hdr
¡¡¡¡{
¡¡¡¡get { return this._hdr; }
¡¡¡¡set { this._hdr = value; }
¡¡¡¡}
¡¡¡¡/// <summary>
¡¡¡¡/// IMEX
¡¡¡¡/// </summary>
¡¡¡¡public string Imex
¡¡¡¡{
¡¡¡¡get { return this._imex; }
¡¡¡¡set { this._imex = value; }
¡¡¡¡}
¡¡¡¡#endregion
¡¡¡¡#region Methods
¡¡¡¡/// <summary>
¡¡¡¡/// Gets a schema
¡¡¡¡/// </summary>
¡¡¡¡/// <returns>Schema</returns>
¡¡¡¡public DataTable GetSchema()
¡¡¡¡{
¡¡¡¡DataTable dtSchema = null;
¡¡¡¡if (this.Connection.State != ConnectionState.Open) this.Connection.Open();
¡¡¡¡dtSchema = this.Connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
¡¡¡¡return dtSchema;
¡¡¡¡}
¡¡¡¡private string GetTableName()
¡¡¡¡{
¡¡¡¡string tableName = string.Empty;
¡¡¡¡DataTable dt = GetSchema();
¡¡¡¡for (int i = 0; i < dt.Rows.Count; i++)
¡¡¡¡{
¡¡¡¡tableName += dt.Rows[i][2].ToString().Trim();
¡¡¡¡}
¡¡¡¡return tableName.Substring(0, tableName.Length - 1);
¡¡¡¡}
¡¡¡¡public DataTable ReadTable()
¡¡¡¡{
¡¡¡¡return this.ReadTable(GetTableName(), ExcelHelperReadTableMode.ReadFromWorkSheet);
¡¡¡¡}
¡¡¡¡/// <summary>
¡¡¡¡/// Read all table rows
¡¡¡¡/// </summary>
¡¡¡¡/// <param name="tableName">Table Name</param>
¡¡¡¡/// <returns>Table</returns>
¡¡¡¡public DataTable ReadTable(string tableName)
¡¡¡¡{
¡¡¡¡return this.ReadTable(tableName, ExcelHelperReadTableMode.ReadFromWorkSheet);
¡¡¡¡}
¡¡¡¡/// <summary>
¡¡¡¡/// Read table
¡¡¡¡/// </summary>
¡¡¡¡/// <param name="tableName">Table Name</param>
¡¡¡¡/// <param name="mode">Read mode</param>
¡¡¡¡/// <returns>Table</returns>
¡¡¡¡public DataTable ReadTable(string tableName, ExcelHelperReadTableMode mode)
¡¡¡¡{
¡¡¡¡return this.ReadTable(tableName, mode, "");
¡¡¡¡}
¡¡¡¡/// <summary>
¡¡¡¡/// Read table
¡¡¡¡/// </summary>
¡¡¡¡/// <param name="tableName">Table Name</param>
¡¡¡¡/// <param name="mode">Read mode</param>
¡¡¡¡/// <param name="criteria">Criteria</param>
¡¡¡¡/// <returns>Table</returns>
¡¡¡¡public DataTable ReadTable(string tableName, ExcelHelperReadTableMode mode, string criteria)
¡¡¡¡{
¡¡¡¡if (this.Connection.State != ConnectionState.Open)
¡¡¡¡{
¡¡¡¡this.Connection.Open();
¡¡¡¡}
¡¡¡¡string cmdText = "Select * From [{0}]";
¡¡¡¡if (!string.IsNullOrEmpty(criteria))
¡¡¡¡{
¡¡¡¡cmdText += " Where " + criteria;
¡¡¡¡}
¡¡¡¡string tableNameSuffix = string.Empty;
¡¡¡¡if (mode == ExcelHelperReadTableMode.ReadFromWorkSheet)
¡¡¡¡tableNameSuffix = "$";
¡¡¡¡OleDbCommand cmd = new OleDbCommand(string.Format(cmdText, tableName + tableNameSuffix));
¡¡¡¡cmd.Connection = this.Connection;
¡¡¡¡OleDbDataAdapter adpt = new OleDbDataAdapter(cmd);
¡¡¡¡DataSet ds = new DataSet();
¡¡¡¡adpt.Fill(ds, tableName);
¡¡¡¡if (ds.Tables.Count >= 1)
¡¡¡¡{
¡¡¡¡return ds.Tables[0];
¡¡¡¡}
¡¡¡¡else
¡¡¡¡{
¡¡¡¡return null;
¡¡¡¡}
¡¡¡¡}
¡¡¡¡/// <summary>
¡¡¡¡/// Drop table
¡¡¡¡/// </summary>
¡¡¡¡/// <param name="tableName">Table Name</param>
¡¡¡¡public void DropTable(string tableName)
¡¡¡¡{
¡¡¡¡if (this.Connection.State != ConnectionState.Open)
¡¡¡¡{
¡¡¡¡this.Connection.Open();
¡¡¡¡}
¡¡¡¡string cmdText = "Drop Table [{0}]";
¡¡¡¡using (OleDbCommand cmd = new OleDbCommand(string.Format(cmdText, tableName), this.Connection))
¡¡¡¡{
¡¡¡¡cmd.ExecuteNonQuery();
¡¡¡¡}
¡¡¡¡this.Connection.Close();
¡¡¡¡}
¡¡¡¡/// <summary>
¡¡¡¡/// Write table
¡¡¡¡/// </summary>
¡¡¡¡/// <param name="tableName">Table Name</param>
¡¡¡¡/// <param name="tableDefinition">Table Definition</param>
¡¡¡¡public void WriteTable(string tableName, Dictionary<string, string> tableDefinition)
¡¡¡¡{
¡¡¡¡using (OleDbCommand cmd = new OleDbCommand(this.GenerateCreateTable(tableName, tableDefinition), this.Connection))
¡¡¡¡{
¡¡¡¡if (this.Connection.State != ConnectionState.Open) this.Connection.Open();
¡¡¡¡cmd.ExecuteNonQuery();
¡¡¡¡}
¡¡¡¡}
¡¡¡¡/// <summary>
¡¡¡¡/// Add new row
¡¡¡¡/// </summary>
¡¡¡¡/// <param name="dr">Data Row</param>
¡¡¡¡public void AddNewRow(DataRow dr)
¡¡¡¡{
¡¡¡¡string command = this.GenerateInsertStatement(dr);
¡¡¡¡ExecuteCommand(command);
¡¡¡¡}
¡¡¡¡/// <summary>
¡¡¡¡/// Execute new command
¡¡¡¡/// </summary>
¡¡¡¡/// <param name="command">Command</param>
¡¡¡¡public void ExecuteCommand(string command)
¡¡¡¡{
¡¡¡¡using (OleDbCommand cmd = new OleDbCommand(command, this.Connection))
¡¡¡¡{
¡¡¡¡if (this.Connection.State != ConnectionState.Open) this.Connection.Open();
¡¡¡¡cmd.ExecuteNonQuery();
¡¡¡¡}
¡¡¡¡}
¡¡¡¡/// <summary>
¡¡¡¡/// Generates create table script
¡¡¡¡/// </summary>
¡¡¡¡/// <param name="tableName">Table Name</param>
¡¡¡¡/// <param name="tableDefinition">Table Definition</param>
¡¡¡¡/// <returns>Create table script</returns>
¡¡¡¡private string GenerateCreateTable(string tableName, Dictionary<string, string> tableDefinition)
¡¡¡¡{
¡¡¡¡StringBuilder sb = new StringBuilder();
¡¡¡¡bool firstcol = true;
¡¡¡¡sb.AppendFormat("CREATE TABLE [{0}](", tableName);
¡¡¡¡firstcol = true;
¡¡¡¡foreach (KeyValuePair<string, string> keyvalue in tableDefinition)
¡¡¡¡{
¡¡¡¡if (!firstcol)
¡¡¡¡{
¡¡¡¡sb.Append(",");
¡¡¡¡}
¡¡¡¡firstcol = false;
¡¡¡¡sb.AppendFormat("{0} {1}", keyvalue.Key, keyvalue.Value);
¡¡¡¡}
¡¡¡¡sb.Append(")");
¡¡¡¡return sb.ToString();
¡¡¡¡}
¡¡¡¡/// <summary>
¡¡¡¡/// Generates insert statement script
¡¡¡¡/// </summary>
¡¡¡¡/// <param name="dr">Data row</param>
¡¡¡¡/// <returns>Insert statement script</returns>
¡¡¡¡private string GenerateInsertStatement(DataRow dr)
¡¡¡¡{
¡¡¡¡StringBuilder sb = new StringBuilder();
¡¡¡¡bool firstcol = true;
¡¡¡¡sb.AppendFormat("INSERT INTO [{0}](", dr.Table.TableName);
¡¡¡¡foreach (DataColumn dc in dr.Table.Columns)
¡¡¡¡{
¡¡¡¡if (!firstcol)
¡¡¡¡{
¡¡¡¡sb.Append(",");
¡¡¡¡}
¡¡¡¡firstcol = false;
¡¡¡¡sb.Append(dc.Caption);
¡¡¡¡}
¡¡¡¡sb.Append(") VALUES(");
¡¡¡¡firstcol = true;
¡¡¡¡for (int i = 0; i <= dr.Table.Columns.Count - 1; i++)
¡¡¡¡{
¡¡¡¡if (!object.ReferenceEquals(dr.Table.Columns[i].DataType, typeof(int)))
¡¡¡¡{
¡¡¡¡sb.Append("'");
¡¡¡¡sb.Append(dr[i].ToString().Replace("'", "''"));
¡¡¡¡sb.Append("'");
¡¡¡¡}
¡¡¡¡else
¡¡¡¡{
¡¡¡¡sb.Append(dr[i].ToString().Replace("'", "''"));
¡¡¡¡}
¡¡¡¡if (i != dr.Table.Columns.Count - 1)
¡¡¡¡{
¡¡¡¡sb.Append(",");
¡¡¡¡}
¡¡¡¡}
¡¡¡¡sb.Append(")");
¡¡¡¡return sb.ToString();
¡¡¡¡}
¡¡¡¡/// <summary>
¡¡¡¡/// Dispose [ʵÏÖIDispose½Ó¿Ú]
¡¡¡¡/// </summary>
¡¡¡¡public void Dispose()
¡¡¡¡{
¡¡¡¡if (this._con != null && this._con.State == ConnectionState.Open)
¡¡¡¡this._con.Close();
¡¡¡¡if (this._con != null)
¡¡¡¡this._con.Dispose();
¡¡¡¡this._con = null;
¡¡¡¡this._filepath = string.Empty;
¡¡¡¡}
¡¡¡¡#endregion
¡¡¡¡}