ExcelHelper導入類

拿來主義,上手就用

using System;  

using System.IO;  

using System.Data;  

using System.Collections;  

using System.Data.OleDb;  

using System.Web;  

using System.Web.UI;  

using System.Web.UI.WebControls;  

  

namespace DotNet.Utilities  

{  

    /// <summary>  

    /// Excel操作類  

    /// </summary>  

    /// Microsoft Excel 11.0 Object Library  

    public class ExcelHelper  

    {  

        #region 數據導出至Excel文件  

        /// </summary>   

        /// 導出Excel文件,自動返回可下載的文件流   

        /// </summary>   

        public static void DataTable1Excel(System.Data.DataTable dtData)  

        {  

            GridView gvExport = null;  

            HttpContext curContext = HttpContext.Current;  

            StringWriter strWriter = null;  

            HtmlTextWriter htmlWriter = null;  

            if (dtData != null)  

            {  

                curContext.Response.ContentType = "application/vnd.ms-excel";  

                curContext.Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");  

                curContext.Response.Charset = "utf-8";  

                strWriter = new StringWriter();  

                htmlWriter = new HtmlTextWriter(strWriter);  

                gvExport = new GridView();  

                gvExport.DataSource = dtData.DefaultView;  

                gvExport.AllowPaging = false;  

                gvExport.DataBind();  

                gvExport.RenderControl(htmlWriter);  

                curContext.Response.Write("<meta http-equiv=\"Content-Type\" content=\"text/html;charset=gb2312\"/>" + strWriter.ToString());  

                curContext.Response.End();  

            }  

        }  

  

        /// <summary>  

        /// 導出Excel文件,轉換爲可讀模式  

        /// </summary>  

        public static void DataTable2Excel(System.Data.DataTable dtData)  

        {  

            DataGrid dgExport = null;  

            HttpContext curContext = HttpContext.Current;  

            StringWriter strWriter = null;  

            HtmlTextWriter htmlWriter = null;  

  

            if (dtData != null)  

            {  

                curContext.Response.ContentType = "application/vnd.ms-excel";  

                curContext.Response.ContentEncoding = System.Text.Encoding.UTF8;  

                curContext.Response.Charset = "";  

                strWriter = new StringWriter();  

                htmlWriter = new HtmlTextWriter(strWriter);  

                dgExport = new DataGrid();  

                dgExport.DataSource = dtData.DefaultView;  

                dgExport.AllowPaging = false;  

                dgExport.DataBind();  

                dgExport.RenderControl(htmlWriter);  

                curContext.Response.Write(strWriter.ToString());  

                curContext.Response.End();  

            }  

        }  

  

        /// <summary>  

        /// 導出Excel文件,並自定義文件名  

        /// </summary>  

        public static void DataTable3Excel(System.Data.DataTable dtData, String FileName)  

        {  

            GridView dgExport = null;  

            HttpContext curContext = HttpContext.Current;  

            StringWriter strWriter = null;  

            HtmlTextWriter htmlWriter = null;  

  

            if (dtData != null)  

            {  

                HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8);  

                curContext.Response.AddHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8) + ".xls");  

                curContext.Response.ContentType = "application nd.ms-excel";  

                curContext.Response.ContentEncoding = System.Text.Encoding.UTF8;  

                curContext.Response.Charset = "GB2312";  

                strWriter = new StringWriter();  

                htmlWriter = new HtmlTextWriter(strWriter);  

                dgExport = new GridView();  

                dgExport.DataSource = dtData.DefaultView;  

                dgExport.AllowPaging = false;  

                dgExport.DataBind();  

                dgExport.RenderControl(htmlWriter);  

                curContext.Response.Write(strWriter.ToString());  

                curContext.Response.End();  

            }  

        }  

  

        /// <summary>  

        /// 將數據導出至Excel文件  

        /// </summary>  

        /// <param name="Table">DataTable對象</param>  

        /// <param name="ExcelFilePath">Excel文件路徑</param>  

        public static bool OutputToExcel(DataTable Table, string ExcelFilePath)  

        {  

            if (File.Exists(ExcelFilePath))  

            {  

                throw new Exception("該文件已經存在!");  

            }  

  

            if ((Table.TableName.Trim().Length == 0) || (Table.TableName.ToLower() == "table"))  

            {  

                Table.TableName = "Sheet1";  

            }  

  

            //數據表的列數  

            int ColCount = Table.Columns.Count;  

  

            //用於記數,實例化參數時的序號  

            int i = 0;  

  

            //創建參數  

            OleDbParameter[] para = new OleDbParameter[ColCount];  

  

            //創建表結構的SQL語句  

            string TableStructStr = @"Create Table " + Table.TableName + "(";  

  

            //連接字符串  

            string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFilePath + ";Extended Properties=Excel 8.0;";  

            OleDbConnection objConn = new OleDbConnection(connString);  

  

            //創建表結構  

            OleDbCommand objCmd = new OleDbCommand();  

  

            //數據類型集合  

            ArrayList DataTypeList = new ArrayList();  

            DataTypeList.Add("System.Decimal");  

            DataTypeList.Add("System.Double");  

            DataTypeList.Add("System.Int16");  

            DataTypeList.Add("System.Int32");  

            DataTypeList.Add("System.Int64");  

            DataTypeList.Add("System.Single");  

  

            //遍歷數據表的所有列,用於創建表結構  

            foreach (DataColumn col in Table.Columns)  

            {  

                //如果列屬於數字列,則設置該列的數據類型爲double  

                if (DataTypeList.IndexOf(col.DataType.ToString()) >= 0)  

                {  

                    para[i] = new OleDbParameter("@" + col.ColumnName, OleDbType.Double);  

                    objCmd.Parameters.Add(para[i]);  

  

                    //如果是最後一列  

                    if (i + 1 == ColCount)  

                    {  

                        TableStructStr += col.ColumnName + " double)";  

                    }  

                    else  

                    {  

                        TableStructStr += col.ColumnName + " double,";  

                    }  

                }  

                else  

                {  

                    para[i] = new OleDbParameter("@" + col.ColumnName, OleDbType.VarChar);  

                    objCmd.Parameters.Add(para[i]);  

  

                    //如果是最後一列  

                    if (i + 1 == ColCount)  

                    {  

                        TableStructStr += col.ColumnName + " varchar)";  

                    }  

                    else  

                    {  

                        TableStructStr += col.ColumnName + " varchar,";  

                    }  

                }  

                i++;  

            }  

  

            //創建Excel文件及文件結構  

            try  

            {  

                objCmd.Connection = objConn;  

                objCmd.CommandText = TableStructStr;  

  

                if (objConn.State == ConnectionState.Closed)  

                {  

                    objConn.Open();  

                }  

                objCmd.ExecuteNonQuery();  

            }  

            catch (Exception exp)  

            {  

                throw exp;  

            }  

  

            //插入記錄的SQL語句  

            string InsertSql_1 = "Insert into " + Table.TableName + " (";  

            string InsertSql_2 = " Values (";  

            string InsertSql = "";  

  

            //遍歷所有列,用於插入記錄,在此創建插入記錄的SQL語句  

            for (int colID = 0; colID < ColCount; colID++)  

            {  

                if (colID + 1 == ColCount)  //最後一列  

                {  

                    InsertSql_1 += Table.Columns[colID].ColumnName + ")";  

                    InsertSql_2 += "@" + Table.Columns[colID].ColumnName + ")";  

                }  

                else  

                {  

                    InsertSql_1 += Table.Columns[colID].ColumnName + ",";  

                    InsertSql_2 += "@" + Table.Columns[colID].ColumnName + ",";  

                }  

            }  

  

            InsertSql = InsertSql_1 + InsertSql_2;  

  

            //遍歷數據表的所有數據行  

            for (int rowID = 0; rowID < Table.Rows.Count; rowID++)  

            {  

                for (int colID = 0; colID < ColCount; colID++)  

                {  

                    if (para[colID].DbType == DbType.Double && Table.Rows[rowID][colID].ToString().Trim() == "")  

                    {  

                        para[colID].Value = 0;  

                    }  

                    else  

                    {  

                        para[colID].Value = Table.Rows[rowID][colID].ToString().Trim();  

                    }  

                }  

                try  

                {  

                    objCmd.CommandText = InsertSql;  

                    objCmd.ExecuteNonQuery();  

                }  

                catch (Exception exp)  

                {  

                    string str = exp.Message;  

                }  

            }  

            try  

            {  

                if (objConn.State == ConnectionState.Open)  

                {  

                    objConn.Close();  

                }  

            }  

            catch (Exception exp)  

            {  

                throw exp;  

            }  

            return true;  

        }  

  

        /// <summary>  

        /// 將數據導出至Excel文件  

        /// </summary>  

        /// <param name="Table">DataTable對象</param>  

        /// <param name="Columns">要導出的數據列集合</param>  

        /// <param name="ExcelFilePath">Excel文件路徑</param>  

        public static bool OutputToExcel(DataTable Table, ArrayList Columns, string ExcelFilePath)  

        {  

            if (File.Exists(ExcelFilePath))  

            {  

                throw new Exception("該文件已經存在!");  

            }  

  

            //如果數據列數大於表的列數,取數據表的所有列  

            if (Columns.Count > Table.Columns.Count)  

            {  

                for (int s = Table.Columns.Count + 1; s <= Columns.Count; s++)  

                {  

                    Columns.RemoveAt(s);   //移除數據表列數後的所有列  

                }  

            }  

  

            //遍歷所有的數據列,如果有數據列的數據類型不是 DataColumn,則將它移除  

            DataColumn column = new DataColumn();  

            for (int j = 0; j < Columns.Count; j++)  

            {  

                try  

                {  

                    column = (DataColumn)Columns[j];  

                }  

                catch (Exception)  

                {  

                    Columns.RemoveAt(j);  

                }  

            }  

            if ((Table.TableName.Trim().Length == 0) || (Table.TableName.ToLower() == "table"))  

            {  

                Table.TableName = "Sheet1";  

            }  

  

            //數據表的列數  

            int ColCount = Columns.Count;  

  

            //創建參數  

            OleDbParameter[] para = new OleDbParameter[ColCount];  

  

            //創建表結構的SQL語句  

            string TableStructStr = @"Create Table " + Table.TableName + "(";  

  

            //連接字符串  

            string connString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFilePath + ";Extended Properties=Excel 8.0;";  

            OleDbConnection objConn = new OleDbConnection(connString);  

  

            //創建表結構  

            OleDbCommand objCmd = new OleDbCommand();  

  

            //數據類型集合  

            ArrayList DataTypeList = new ArrayList();  

            DataTypeList.Add("System.Decimal");  

            DataTypeList.Add("System.Double");  

            DataTypeList.Add("System.Int16");  

            DataTypeList.Add("System.Int32");  

            DataTypeList.Add("System.Int64");  

            DataTypeList.Add("System.Single");  

  

            DataColumn col = new DataColumn();  

  

            //遍歷數據表的所有列,用於創建表結構  

            for (int k = 0; k < ColCount; k++)  

            {  

                col = (DataColumn)Columns[k];  

  

                //列的數據類型是數字型  

                if (DataTypeList.IndexOf(col.DataType.ToString().Trim()) >= 0)  

                {  

                    para[k] = new OleDbParameter("@" + col.Caption.Trim(), OleDbType.Double);  

                    objCmd.Parameters.Add(para[k]);  

  

                    //如果是最後一列  

                    if (k + 1 == ColCount)  

                    {  

                        TableStructStr += col.Caption.Trim() + " Double)";  

                    }  

                    else  

                    {  

                        TableStructStr += col.Caption.Trim() + " Double,";  

                    }  

                }  

                else  

                {  

                    para[k] = new OleDbParameter("@" + col.Caption.Trim(), OleDbType.VarChar);  

                    objCmd.Parameters.Add(para[k]);  

  

                    //如果是最後一列  

                    if (k + 1 == ColCount)  

                    {  

                        TableStructStr += col.Caption.Trim() + " VarChar)";  

                    }  

                    else  

                    {  

                        TableStructStr += col.Caption.Trim() + " VarChar,";  

                    }  

                }  

            }  

  

            //創建Excel文件及文件結構  

            try  

            {  

                objCmd.Connection = objConn;  

                objCmd.CommandText = TableStructStr;  

  

                if (objConn.State == ConnectionState.Closed)  

                {  

                    objConn.Open();  

                }  

                objCmd.ExecuteNonQuery();  

            }  

            catch (Exception exp)  

            {  

                throw exp;  

            }  

  

            //插入記錄的SQL語句  

            string InsertSql_1 = "Insert into " + Table.TableName + " (";  

            string InsertSql_2 = " Values (";  

            string InsertSql = "";  

  

            //遍歷所有列,用於插入記錄,在此創建插入記錄的SQL語句  

            for (int colID = 0; colID < ColCount; colID++)  

            {  

                if (colID + 1 == ColCount)  //最後一列  

                {  

                    InsertSql_1 += Columns[colID].ToString().Trim() + ")";  

                    InsertSql_2 += "@" + Columns[colID].ToString().Trim() + ")";  

                }  

                else  

                {  

                    InsertSql_1 += Columns[colID].ToString().Trim() + ",";  

                    InsertSql_2 += "@" + Columns[colID].ToString().Trim() + ",";  

                }  

            }  

  

            InsertSql = InsertSql_1 + InsertSql_2;  

  

            //遍歷數據表的所有數據行  

            DataColumn DataCol = new DataColumn();  

            for (int rowID = 0; rowID < Table.Rows.Count; rowID++)  

            {  

                for (int colID = 0; colID < ColCount; colID++)  

                {  

                    //因爲列不連續,所以在取得單元格時不能用行列編號,列需得用列的名稱  

                    DataCol = (DataColumn)Columns[colID];  

                    if (para[colID].DbType == DbType.Double && Table.Rows[rowID][DataCol.Caption].ToString().Trim() == "")  

                    {  

                        para[colID].Value = 0;  

                    }  

                    else  

                    {  

                        para[colID].Value = Table.Rows[rowID][DataCol.Caption].ToString().Trim();  

                    }  

                }  

                try  

                {  

                    objCmd.CommandText = InsertSql;  

                    objCmd.ExecuteNonQuery();  

                }  

                catch (Exception exp)  

                {  

                    string str = exp.Message;  

                }  

            }  

            try  

            {  

                if (objConn.State == ConnectionState.Open)  

                {  

                    objConn.Close();  

                }  

            }  

            catch (Exception exp)  

            {  

                throw exp;  

            }  

            return true;  

        }  

        #endregion  

  

        /// <summary>  

        /// 獲取Excel文件數據表列表  

        /// </summary>  

        public static ArrayList GetExcelTables(string ExcelFileName)  

        {  

            DataTable dt = new DataTable();  

            ArrayList TablesList = new ArrayList();  

            if (File.Exists(ExcelFileName))  

            {  

                using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" + ExcelFileName))  

                {  

                    try  

                    {  

                        conn.Open();  

                        dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });  

                    }  

                    catch (Exception exp)  

                    {  

                        throw exp;  

                    }  

  

                    //獲取數據表個數  

                    int tablecount = dt.Rows.Count;  

                    for (int i = 0; i < tablecount; i++)  

                    {  

                        string tablename = dt.Rows[i][2].ToString().Trim().TrimEnd('$');  

                        if (TablesList.IndexOf(tablename) < 0)  

                        {  

                            TablesList.Add(tablename);  

                        }  

                    }  

                }  

            }  

            return TablesList;  

        }  

  

        /// <summary>  

        /// 將Excel文件導出至DataTable(第一行作爲表頭)  

        /// </summary>  

        /// <param name="ExcelFilePath">Excel文件路徑</param>  

        /// <param name="TableName">數據表名,如果數據表名錯誤,默認爲第一個數據表名</param>  

        public static DataTable InputFromExcel(string ExcelFilePath, string TableName)  

        {  

            if (!File.Exists(ExcelFilePath))  

            {  

                throw new Exception("Excel文件不存在!");  

            }  

  

            //如果數據表名不存在,則數據表名爲Excel文件的第一個數據表  

            ArrayList TableList = new ArrayList();  

            TableList = GetExcelTables(ExcelFilePath);  

  

            if (TableList.IndexOf(TableName) < 0)  

            {  

                TableName = TableList[0].ToString().Trim();  

            }  

  

            DataTable table = new DataTable();  

            OleDbConnection dbcon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFilePath + ";Extended Properties=Excel 8.0");  

            OleDbCommand cmd = new OleDbCommand("select * from [" + TableName + "$]", dbcon);  

            OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);  

  

            try  

            {  

                if (dbcon.State == ConnectionState.Closed)  

                {  

                    dbcon.Open();  

                }  

                adapter.Fill(table);  

            }  

            catch (Exception exp)  

            {  

                throw exp;  

            }  

            finally  

            {  

                if (dbcon.State == ConnectionState.Open)  

                {  

                    dbcon.Close();  

                }  

            }  

            return table;  

        }  

  

        /// <summary>  

        /// 獲取Excel文件指定數據表的數據列表  

        /// </summary>  

        /// <param name="ExcelFileName">Excel文件名</param>  

        /// <param name="TableName">數據表名</param>  

        public static ArrayList GetExcelTableColumns(string ExcelFileName, string TableName)  

        {  

            DataTable dt = new DataTable();  

            ArrayList ColsList = new ArrayList();  

            if (File.Exists(ExcelFileName))  

            {  

                using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" + ExcelFileName))  

                {  

                    conn.Open();  

                    dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, TableName, null });  

  

                    //獲取列個數  

                    int colcount = dt.Rows.Count;  

                    for (int i = 0; i < colcount; i++)  

                    {  

                        string colname = dt.Rows[i]["Column_Name"].ToString().Trim();  

                        ColsList.Add(colname);  

                    }  

                }  

            }  

            return ColsList;  

        }  

    }  

}  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章