asp.net C# 實現上傳Excel文件導入數據到SQL Server 數據庫

前臺代碼,有點簡單:


<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
      <div>
      <asp:FileUpload ID="FileUpload1" runat="server" />
      <asp:Button ID="Button1" runat="server"  Text="確定上傳" onclick="Button1_Click" />
     </div>
    </form>
</body>
</html>

後臺完整代碼:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Data.SqlClient;
using System.Configuration;

namespace fileUpLoad
{
    public partial class Index : System.Web.UI.Page
    {
        /// <summary>
        /// time=2018.9.17
        /// </summary>
        /// <param name="fileUrl">文件的完整路徑(包括擴展名)</param>
        /// <returns>DataTabl</returns>
         public static DataTable GetExcelDatatable(string fileUrl)
        {
            //支持.xls和.xlsx,即包括office2010等版本的   HDR=Yes代表第一行是標題,不是數據;
            string cmdText = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+fileUrl+";  Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'";
            System.Data.DataTable dt = null;
            //建立連接
            OleDbConnection conn = new OleDbConnection(cmdText);
            try
            {
                //打開連接
                if (conn.State == ConnectionState.Broken || conn.State == ConnectionState.Closed)
                {
                    conn.Open();
                    //if (conn.State == System.Data.ConnectionState.Open) {  //測試用的
                     //   Response.Write("文件鏈接成功!");
                    //}
                }

                System.Data.DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                string strSql = "select * from [Sheet1$]";   //這裏指定表明爲Sheet1
                OleDbDataAdapter da = new OleDbDataAdapter(strSql, conn);
                DataSet ds = new DataSet();
                da.Fill(ds);
                dt = ds.Tables[0];;
                return dt;
            }
            catch (Exception exc)
            {
                throw exc;
            }
            finally
            {
                conn.Close();
                conn.Dispose();
            }
        }
        /// <summary>
         /// time=2018.9.17
        /// </summary>
        /// <param name="savePath">文件的完整路徑(包括擴展名)</param>
        /// <param name="destinationTableName">目標數據庫表名</param>
        /// <returns>如果成功插入,返回true</returns>
         public static bool SqlBulkCopyToDB(string savePath, string destinationTableName)
        {
            DataTable ds = new DataTable(); 
            string connectionString = ConfigurationManager.ConnectionStrings["connString"].ConnectionString;
            using (System.Data.SqlClient.SqlBulkCopy bcp = new System.Data.SqlClient.SqlBulkCopy(connectionString))// 使用using 該鏈接在最後會自動關閉
            {

                ds = GetExcelDatatable(savePath);           //調用自定義方法
                //bcp.BatchSize = 100;//每次傳輸的行數 
                //bcp.NotifyAfter = 100;//進度提示的行數 
               // bcp.DestinationTableName = "Tb";//需要導入的數據庫表名
                bcp.DestinationTableName = destinationTableName; //需要導入的數據庫表名
                try
                {
                    //excel表頭與數據庫列對應關係 
                    for (int i = 0; i < ds.Columns.Count; ++i)
                    {
                        //string s = ds.Columns[i].ColumnName;
                        bcp.ColumnMappings.Add(ds.Columns[i].ColumnName, sqlTableName[i]);   // 設置cxcel表中列名與數據庫中表列名的映射關係  sqlTableName[i]中存的時數據庫表中的各個字段
                        
                    }
                    bcp.WriteToServer(ds);
                    return true;
                    //Response.Write("<script>alert('Excle表導入成功!')</script>");   //不能成功導入時,對用戶進行提示
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    return false;
                    //Response.Write("<script>alert('Excle表導入失敗!');</script>");
                }
            }
        }
        /// <summary>
        /// time=2018.9.17
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Button1_Click(object sender, EventArgs e)
        {
            if (FileUpload1.HasFile == false)//HasFile用來檢查FileUpload是否有指定文件
            {
                Response.Write("<script>alert('請您選擇Excel文件')</script> ");
                return;//當無文件時,返回
            }
            string IsXls = Path.GetExtension(FileUpload1.FileName).ToString().ToLower();//System.IO.Path.GetExtension獲得文件的擴展名
            if (IsXls != ".xlsx" && IsXls != ".xls")
            {
                Response.Write(FileUpload1.FileName);
                Response.Write("<script>alert('只可以選擇Excel文件')</script>");
                return;//當選擇的不是Excel文件時,返回
            }
            string filename = FileUpload1.FileName;              //獲取Execle文件名  DateTime日期函數
            string savePath = Server.MapPath(("uploadfiles\\") + filename);//Server.MapPath 獲得虛擬服務器相對路徑
            Response.Write(savePath);
            //savePath ="E:\\Visual Studio 2013 Workspace\\fileUpLoad\\fileUpLoad\\uploadfiles\\201842314025658.xls"
            DataTable ds = new DataTable();
            FileUpload1.SaveAs(savePath);                        //SaveAs 將上傳的文件內容保存在服務器上   文件可以成功保存
            bool ok = SqlBulkCopyToDB(savePath, "Tb");   //  用SqlBulkCopy 將表中數據插入數據庫  “Tb”爲要插入數據庫的表名
            if (ok)
            {
                Response.Write("<script>alert('Excle表導入成功!')</script>");   //不能成功導入時,對用戶進行提示
            }
            else
            {
                Response.Write("<script>alert('Excle表導入失敗!');</script>");
            }
        }
    }
}

配置文件:

<connectionStrings>
    <add name="connString" connectionString="Server=.;DataBase=test;uid=sa;pwd=123"/>
  </connectionStrings>
  <appSettings>
    <add key ="conStr" value="Server=.;User Id=sa; pwd=123;database=test"/>
  </appSettings>

 

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