namespace HW.Utility { using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Data.OleDb; using System.IO; using System.Runtime.CompilerServices; using System.Text; public sealed class ExcelOle : IDisposable { public const int EXCEL_MAXROW = 0x10000; private string excelPath; private string specifyTableName; public event RenderDataFromDataRowHandler OnFillDataRowRender; public ExcelOle() : this("") { } public ExcelOle(string excelPath) { this.excelPath = excelPath; } private string CleanStringForSql(object obj) { return this.CleanStringForSql(obj.ToString()); } private string CleanStringForSql(string str) { return str.Replace("'", "''"); } public void Dispose() { this.excelPath = null; } public void FillDataByList(DataTable dt) { List list = new List(); for (int i = 0; i < dt.Columns.Count; i++) { list.Add(dt.Columns[i].ColumnName); } this.FillDataByList(dt, list.ToArray()); } public void FillDataByList(DataTable dt, string[] columns) { if ((columns == null) || (columns.Length == 0)) { this.FillDataByList(dt); } if (dt.Rows.Count > 0x10000) { while (dt.Rows.Count >= 0x10000) { dt.Rows.RemoveAt(dt.Rows.Count - 1); } } ArrayList alSql = new ArrayList(); int length = columns.Length; foreach (DataRow row in dt.Rows) { StringBuilder builder = new StringBuilder(); builder.Append("INSERT INTO {0} ({1}) VALUES ("); for (int i = 0; i < length; i++) { string str = ""; string columnName = columns[i]; if (this.OnFillDataRowRender != null) { str = this.OnFillDataRowRender(row, row[columnName], columnName, row.Table.Columns[columnName].DataType); } else if ((row[columnName] == null) || (row[columnName] is DBNull)) { str = ""; } else { str = row[columns[i]].ToString(); } builder.Append("'" + str + "',"); } builder.Remove(builder.Length - 1, 1); builder.Append(");"); alSql.Add(builder.ToString()); } this.RunSqlArray(alSql); } private void RunSqlArray(ArrayList alSql) { using (OleDbConnection connection = new OleDbConnection(this.ExcelConnString)) { DataTable schemaTable; connection.Open(); string specifyTableName = ""; if (string.IsNullOrEmpty(this.specifyTableName)) { specifyTableName = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[0][2].ToString().Trim(); } else { specifyTableName = this.specifyTableName; } specifyTableName = "[" + specifyTableName + "]"; string str3 = ""; OleDbCommand command = null; command = new OleDbCommand(string.Format("SELECT TOP 1 * FROM {0}", specifyTableName), connection); using (OleDbDataReader reader = command.ExecuteReader(CommandBehavior.KeyInfo)) { schemaTable = reader.GetSchemaTable(); } foreach (DataRow row in schemaTable.Rows) { str3 = str3 + "[" + row["ColumnName"].ToString() + "],"; } str3 = str3.TrimEnd(new char[] { ',' }); foreach (string str4 in alSql) { new OleDbCommand(string.Format(str4, specifyTableName, str3), connection).ExecuteNonQuery(); } } } public string SetSpecifyTableName(string specifyTableName) { this.specifyTableName = specifyTableName + "$"; return this.specifyTableName; } private string ExcelConnString { get { return string.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source ={0};Extended Properties='Excel 8.0;'", this.ExcelPath); } } public string ExcelPath { get { if (!(!string.IsNullOrEmpty(this.excelPath) && File.Exists(this.excelPath))) { throw new Exception("Excel为空"); } return this.excelPath; } set { this.excelPath = value; } } } }