ASP.NET實現Excel導入SQL數據庫以及各種出現的問題解決方案


這兩天想實現Excel導入數據庫的功能,於是自己百度,簡單做了個小Demo,環境:office2010,VS2008,win7,SQL2005;大體思路是如下這種方式:

1.利用操作Excel語句,取得Excel的數據。
2.將取得的數據封裝在DataSet中
3.循環上面的DataSet,然后將表中的內容,依次插入到對應表中。

下面是代碼的基本實現方式:

前台實現:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ImportDemo._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        選擇導入文件:<asp:FileUpload ID="FileUpload1" runat="server" />
        <asp:Button runat = "server" ID = "btnImpot" Text = "導入" onclick="btnImpot_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;

namespace ImportDemo
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
        /// <summary>
        /// 導入
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnImpot_Click(object sender, EventArgs e)
        {
            //是否含有文件
            if (!this.FileUpload1.HasFile)
            {
                Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "", "<script>alert('請選擇導入的Excel表!');</script>");
                return;
            }
            //判斷導入文件是否正確
            string Extension = System.IO.Path.GetExtension(this.FileUpload1.FileName).ToString().ToLower();
            if (Extension != ".xls" && Extension !=".xlsx")
            {
                Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "", "<script>alert('您導入的Excel文件不正確,請確認后重試!');</script>");
                return;
            }
            //拼接服務器文件名
            string FileName = DateTime.Now.ToString("yyyyMMddhhmmssmmmm") + this.FileUpload1.FileName;
            //保存路徑
            string savePath = Server.MapPath("Excel/") + FileName;
            //將文件保存到服務器上
            FileUpload1.SaveAs(savePath);

            //將Excel中的數據放到DataTable中
            DataTable dt = GetExcelSheet(savePath, FileName);
            //向數據庫中插入數據
            int i =  InsetData(dt);

            //提示導入成功數據
            Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "", "<script>alert('成功導入"+i+"條數據!');</script>");
        }
        /// <summary>
        /// 將Excel中的數據放到DataTable中
        /// </summary>
        /// <param name="strFileName">路徑</param>
        /// <param name="strFileName">表名</param>
        /// <returns>DataTable數據</returns>
        public DataTable GetExcelSheet(string fileUrl,string table)
        {
            //office2007之前 僅支持.xls
            //const string cmdText = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;IMEX=1';";
            //支持.xls和.xlsx,即包括office2010等版本的   HDR=Yes代表第一行是標題,不是數據;
            const string cmdText = "Provider=Microsoft.Ace.OleDb.12.0;Data Source={0};Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'";
            
            DataTable dt = null;
            //建立連接
            OleDbConnection conn = new OleDbConnection(string.Format(cmdText, fileUrl));
            try
            {
                //打開連接
                if (conn.State == ConnectionState.Broken || conn.State == ConnectionState.Closed)
                {
                    conn.Open();
                }

                
                DataTable schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                //獲取Excel的第一個Sheet名稱
                string sheetName = schemaTable.Rows[0]["TABLE_NAME"].ToString().Trim();

                //查詢sheet中的數據
                string strSql = "select * from [" + sheetName + "]";
                OleDbDataAdapter da = new OleDbDataAdapter(strSql, conn);
                DataSet ds = new DataSet();
                da.Fill(ds,table);
                dt = ds.Tables[0];

                return dt;
            }
            catch (Exception exc)
            {
                throw exc;
            }
            finally
            {
                conn.Close();
                conn.Dispose();
            }
        }
        /// <summary>
        /// 向數據庫插入數據
        /// </summary>
        /// <param name="dt">Excel中的DataTable數據</param>
        public int InsetData(DataTable dt)
        {
            int i =0;
            foreach (DataRow item in dt.Rows)
            {
                Person per = new Person();
                per.Name = item["Name"].ToString();
                per.Age = Convert.ToInt32( item["Age"].ToString());
                per.Address = item["Address"].ToString();
                per.Phone = item["Phone"].ToString();

                if (DBHelper.Add(per) == 1)
                {
                    i++;
                }
            }
            return i;
        }
    }

    public class Person
    {
        /// <summary>
        /// 姓名
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 年齡
        /// </summary>
        public int Age { get; set; }
        /// <summary>
        /// 地址
        /// </summary>
        public string Address { get; set; }
        /// <summary>
        /// 電話
        /// </summary>
        public string Phone { get; set; }
    }
}

之間新建了兩個類:DBHelper 類(用於操作數據庫的增刪查改) 和 SqlConn 類(獲得數據庫連接字符串)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace ImportDemo
{
    public class SqlConn
    {
        /// <summary>
        /// 獲得連接字符串
        /// </summary>
        public static string ConnText
        {
            get { return System.Configuration.ConfigurationManager.ConnectionStrings["DbLink"].ConnectionString; ; }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Data;

namespace ImportDemo
{
    public class DBHelper
    {
        /// <summary>
        /// 增加
        /// </summary>
        /// <param name="per">人員類</param>
        /// <returns>成功返回1,否則返回0</returns>
        public static int Add(Person per)
        {
            int count = 0;
            string cmdText = "insert into Person(Name,Age,Address,Phone) values(@Name,@Age,@Address,@Phone)";
            SqlConnection conn = new SqlConnection(SqlConn.ConnText);
            try
            {
                //打開連接
                if (conn.State == ConnectionState.Broken || conn.State == ConnectionState.Closed)
                {
                    conn.Open();
                }

                SqlCommand cmd = new SqlCommand(cmdText, conn);
                SqlParameter[] sqlparas = { new SqlParameter("@Name",per.Name),
                                          new  SqlParameter("@Age",per.Age),
                                          new SqlParameter("@Address",per.Address),
                                          new SqlParameter("@Phone",per.Phone)
                                          };
                cmd.Parameters.AddRange(sqlparas);

                count =  cmd.ExecuteNonQuery();
                
            }
            catch (Exception exc)
            {
                throw exc;
            }
            finally
            {
                conn.Close();
            }
            return count;
        }
    }
}

在Web.config中添加連接數據庫的字符串:

<connectionStrings>
        <add name="DbLink" connectionString="Data Source=.\SQL2005;Initial Catalog=ceshi;User Id=sa;Password=123; "/>
    </connectionStrings>

以上就是全部的代碼。

當然在這之中也有幾點需要注意的地方:

1.導入時,報錯:導入的表不是預期格式。
   原因:① Excel表的數據格式不正確。
      解決:修改Excel表的數據格式。
    
     ②.獲得Excel數據的語句不正確。
      解決:如果是office2007之前,可以用這種方式:     
//office2007之前 僅支持.xls     const string cmdText = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;IMEX=1';";       如果是2010的,用如下這種方式:     //支持.xls和.xlsx,即包括office2010等版本的 HDR=Yes代表第一行是標題,不是數據; const string cmdText = "Provider=Microsoft.Ace.OleDb.12.0;Data Source={0};Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'";
2.打開某某數據庫失敗。
  原因:數據庫鏈接字符串出現錯誤。
    解決:修改Web.config文件中的連接字符串,將數據庫對象改成自己的對應數據庫名,用戶名和密碼。

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM