.net中excel程序导入数据库

来源:互联网 发布:网络赌钱输了好多 编辑:程序博客网 时间:2024/06/05 19:23
(1)如果遇到“未在本地计算机上注册Microsoft.ACE.OLEDB.12.0提供程序”这种异常:
解决办法:
在对应的 IIS 应用程序池中,“设置应用程序池默认属性”右击/“高级设置”/"启用32位应用程序",设置为 true。
(2)如果遇到“导入excel错误:外部表不是预期的格式“ 解决方案:

在asp.net网站中导出Excel文件后,再把文件导入到数据库中。 读取Excel文件时,打开连接出错。

错误为:外部表不是预期的格式

解决:检查了一下,导出的Excel是标准文件不是html,没错,Excel文件正常。 

  调试代码,创建连接对象oleDbConnection也正常,但在conn.Open()打开链接时出错。 

仔细看了下链接字符串,检查出了错误,Excel版本问题,Exce连接字符串版本是office2003的 ,更改为Excel2007版本则正常导入。 

(3).csv格式数据文件导入数据库出现问题:

这段出错,'G:\zxb\test\Test\create20091225.csv'不是一个有效的路径。 确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。

解决办法:

将filepath改为:
Directory.GetParent(filepath)

          


总结规则如下:

using System.Data.OleDb;

using System.Data;


 public void ReadExcelFiless()

        {

            //string strConn = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + Server.MapPath("ExcelFiles/MyExcelFile.xls") + ";Extended Properties='Excel 8.0; HDR=Yes; IMEX=1'"; //此连接只能操作Excel2007之前(.xls)文件

            string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + Server.MapPath("ExcelFiles/Mydata2007.xlsx") + ";Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'"; //此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串)

//备注: "HDR=yes;"是说Excel文件的第一行是列名而不是数据,"HDR=No;"正好与前面的相反。

//      "IMEX=1 "如果列中的数据类型不一致,使用"IMEX=1"可必免数据类型冲突。 


            OleDbConnection conn = new OleDbConnection(strConn);

            OleDbDataAdapter adp = new OleDbDataAdapter("Select * from [Sheet1$]", conn);

            DataSet ds = new DataSet();

            adp.Fill(ds, "Book1");

            this.GridView1.DataSource = ds.Tables["Book1"].DefaultView;

            this.GridView1.DataBind(); 

        }


具体代码:
   public void BtnImport_Click(object sender, System.EventArgs e)
        {
            string filename = string.Empty;
            try
            {
                filename = UpLoadXls(FileExcel);//上传XLS文件
                ImportXlsToData(filename);//将XLS文件的数据导入数据库                
                if (filename != string.Empty && System.IO.File.Exists(filename))
                {
                    System.IO.File.Delete(filename);//删除上传的XLS文件
                }
                EventMessage.MessageBox(1, "操作成功", "保存成功!", Icon_Type.OK, "parent.location.reload();", UrlType.JavaScript);
                return;
            }
            catch (Exception ex)// + ex.ToString()
            {
                EventMessage.MessageBox(1, "操作失败", "保存失败!", Icon_Type.Error, "history.back();", UrlType.JavaScript);
                return;
            }
        }

    //// <summary>
        /// 从Excel提取数据--》Dataset
        /// </summary>
        /// <param name="filename">Excel文件路径名</param>
        private void ImportXlsToData(string fileName)
        {
            if (fileName == string.Empty)
            {
                throw new ArgumentNullException("Excel文件上传失败!");
            }
            string oleDBConnString = "";
            //string oleDBConnString = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" + fileName + ";Extended Properties='Excel 8.0; HDR=YES; IMEX=1'";
            if (fileName.Contains("xls") || fileName.Contains("xlsx"))
            {
                oleDBConnString = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + fileName + ";Extended Properties='Excel 12.0; HDR=YES; IMEX=1'";
                OleDbConnection oleDBConn = null;
                OleDbDataAdapter oleAdMaster = null;
                DataTable m_tableName = new DataTable();
                DataSet ds = new DataSet();
                oleDBConn = new OleDbConnection(oleDBConnString);
                oleDBConn.Open();
                m_tableName = oleDBConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });

                if (m_tableName != null && m_tableName.Rows.Count > 0)
                {
                    m_tableName.TableName = m_tableName.Rows[0]["TABLE_NAME"].ToString();
                }
                string sqlMaster;
                sqlMaster = " SELECT *  FROM [" + m_tableName.TableName + "]";
                oleAdMaster = new OleDbDataAdapter(sqlMaster, oleDBConn);
                oleAdMaster.Fill(ds, "m_tableName");
                oleAdMaster.Dispose();
                oleDBConn.Close();
                oleDBConn.Dispose();
                AddDatasetToSQL(ds, 15);
            }
            else if (fileName.Contains("csv"))
            {
                //string mystring = @"Provider=Microsoft.Jet.OLEDB.12.0;" + "Data Source=" + fileName + ";" + @"Extended Properties=""text;HDR=YES; IMEX=1;FMT=Delimited""";
               // oleDBConnString = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + fileName + ";Extended Properties='text; HDR=YES; IMEX=1;FMT=Delimited'";
              
                    string sql = "select * from " + fileName;//查询语句
                    DataTable dt = new DataTable();
                    oleDBConnString = @"Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Directory.GetParent(fileName) + ";" + @"Extended Properties=""text;HDR=Yes;FMT=Delimited""";
                    OleDbConnection cnnxls = new OleDbConnection(oleDBConnString);
                    OleDbDataAdapter myda = new OleDbDataAdapter(sql, cnnxls);
                        myda.Fill(dt);
                        cnnxls.Close();
              
            }
        }
  /// <summary>
        /// 将Dataset的数据导入数据库
        /// </summary>
        /// <param name="pds">数据集</param>
        /// <param name="Cols">数据集列数</param>
        /// <returns></returns>
        private bool AddDatasetToSQL(DataSet pds, int Cols)
        {
            int ic, ir;
            ic = pds.Tables[0].Columns.Count;
            if (pds.Tables[0].Columns.Count < Cols)
            {
                throw new Exception("导入Excel格式错误!Excel只有" + ic.ToString() + "列");
            }
            ir = pds.Tables[0].Rows.Count;
            if (pds != null && pds.Tables[0].Rows.Count > 0)
            {
                for (int i = 0; i < pds.Tables[0].Rows.Count; i++)
                {
                    try
                    {
                        string PartnerOrderNo = pds.Tables[0].Rows[i][9].ToString();//微店订单号
                        string DateId = Convert.ToDateTime(pds.Tables[0].Rows[i][1].ToString()).ToString("yyyyMMdd");//日期2014/12/1
                        string PayFrom = "";
                        if (pds.Tables[0].Rows[i][12].ToString().Contains("货到付款"))
                        {
                            PayFrom = "1";
                        }
                        else if (pds.Tables[0].Rows[i][12].ToString().Contains("支付宝"))
                        {
                            PayFrom = "3";
                        }
                        else if (pds.Tables[0].Rows[i][12].ToString().Contains("银行卡"))
                        {
                            PayFrom = "2";
                        }
                        else
                        {
                            PayFrom = "1";
                        }
                        string Title = "";//商品名
                        string RealName = pds.Tables[0].Rows[i][2].ToString();//姓名
                        string ShippingAddress = pds.Tables[0].Rows[i][3].ToString();//收货地址
                        string province = "-1";
                        string city = "-1";
                        #region
                        if (ShippingAddress.Contains("省") && ShippingAddress.Contains("市"))
                        {
                            int proindex = ShippingAddress.IndexOf("省");
                            int cityindex = ShippingAddress.IndexOf("市");
                            string provincename = ShippingAddress.Substring(0, proindex);
                            object objprovid = Global.LiveDB.ExecuteScalar("select provincialID from provincial where countryid=1 and provincialName='" + provincename + "'");
                            if (objprovid != null && !String.IsNullOrEmpty(objprovid.ToString()))
                            {
                                province = objprovid.ToString();
                            }
                            string cityname = ShippingAddress.Trim().Substring(proindex + 1, cityindex - 3).Trim();
                            object objcityid = Global.LiveDB.ExecuteScalar("select cityID from city where cityName='" + cityname + "'");
                            if (objcityid != null && !String.IsNullOrEmpty(objcityid.ToString()))
                            {
                                city = objcityid.ToString();
                            }
                        }
                        else if (!ShippingAddress.Contains("省") && ShippingAddress.Contains("市"))
                        {
                            int cityindex = ShippingAddress.IndexOf("市");
                            string provincename = ShippingAddress.Substring(0, cityindex);
                            object objprovid = Global.LiveDB.ExecuteScalar("select provincialID from provincial where countryid=1 and provincialName='" + provincename + "'");
                            if (objprovid != null && !String.IsNullOrEmpty(objprovid.ToString()))
                            {
                                province = objprovid.ToString();
                            }
                        }
                        #endregion
                        string Mobile = pds.Tables[0].Rows[i][4].ToString();//手机号
                        string SellerRemark = pds.Tables[0].Rows[i][11].ToString();//卖家备注
                        string Fare = pds.Tables[0].Rows[i][8].ToString();//运费
                        string Status = "";//状态(1-未支付  2-支付中  3-支付成功  4-支付失败 5-已发货 6-已退货 7-交易完成  8:交易关闭)
                        string IsConfirmOrder = "";//电话状态  0或者1:等待电话确认 2:电话已确认 3:已发货 4:交易成功 5:交易已经关闭  6:已退货
                        string confirmstate = pds.Tables[0].Rows[i][13].ToString();
                        #region
                        if (confirmstate.Contains("已发货"))
                        {
                            IsConfirmOrder = "3";
                            Status = "3";
                        }
                        else if (confirmstate.Contains("等待电话确认"))
                        {
                            IsConfirmOrder = "1";
                            Status = "3";
                        }
                        else if (confirmstate.Contains("电话已确认"))
                        {
                            IsConfirmOrder = "2";
                            Status = "3";
                        }
                        else if (confirmstate.Contains("交易成功"))
                        {
                            IsConfirmOrder = "4";
                            Status = "3";
                        }
                        else if (confirmstate.Contains("交易已经关闭"))
                        {
                            IsConfirmOrder = "5";
                            Status = "1";
                        }
                        else if (confirmstate.Contains("已退货"))
                        {
                            IsConfirmOrder = "6";
                            Status = "1";
                        }
                        else
                        {
                            IsConfirmOrder = "1";
                            Status = "3";
                        }
                        #endregion
                        string ShippingId = "1";//1:圆通快递
                        string WaybillCode = pds.Tables[0].Rows[i][10].ToString();//快递单号
                        string TotalFee = pds.Tables[0].Rows[i][6].ToString();//总金额
                        string OrderTime = Convert.ToDateTime(pds.Tables[0].Rows[i][1].ToString()).ToString("yyyy-MM-dd HH:mm:ss");
                        string DealTime = Convert.ToDateTime(pds.Tables[0].Rows[i][1].ToString()).ToString("yyyy-MM-dd HH:mm:ss");
                        string Source = "wx";//微信
                        string IsWXFans = "0";//是否微信粉丝
                        if (pds.Tables[0].Rows[i][14].ToString().Trim() == "粉丝")
                        {
                            IsWXFans = "1";
                        }
                        string PlatCode = "shl";
                        string ItemIdStr = pds.Tables[0].Rows[i][5].ToString();//商品id字符串
                        string ItemPrice = pds.Tables[0].Rows[i][7].ToString();//商品价格
                        if (!String.IsNullOrEmpty(ItemIdStr))
                        {
                            Add(ItemIdStr, ItemPrice, PartnerOrderNo, DateId, PayFrom, Title, RealName, ShippingAddress, province, city, Mobile, SellerRemark,
                                Fare, Status, ShippingId, WaybillCode, TotalFee, OrderTime, DealTime, Source, IsConfirmOrder, IsWXFans, PlatCode);
                        }
                    }
                    catch
                    {
                        continue;
                    }
                }
            }
            else
            {
                throw new Exception("导入数据为空!");
            }
            return true;
        }
        /// <summary>
        /// 插入数据到数据库
        /// </summary>
        public void Add(string ItemIdStr, string ItemPrice, string PartnerOrderNo, string DateId, string PayFrom, string Title, string RealName,
            string ShippingAddress, string Province, string City, string Mobile, string SellerRemark,
            string Fare, string Status, string ShippingId, string WaybillCode, string TotalFee, string OrderTime, string DealTime, string Source, string IsConfirmOrder, string IsWXFans, string PlatCode)
        {
            string sql = "select OrderNo from pmhmobilemalltrade where PartnerOrderNo='" + PartnerOrderNo + "'";
            DataTable dt = Global.LiveDB.ExecuteDataset(sql).Tables[0];
            if (dt.Rows.Count == 0)
            {
                long orderNo = Convert.ToInt64(DateTime.Now.ToString("yyyyMMddHHmmssfff"));
                StringBuilder strSql = new StringBuilder();
                strSql.Append("insert into pmhmobilemalltrade(");
                strSql.Append("orderNo,userid,PartnerOrderNo,DateId,PayFrom,Title,RealName,ShippingAddress,Province,City,Mobile,SellerRemark,Fare,Status,ShippingId,WaybillCode,TotalFee,OrderTime,DealTime,Source,IsConfirmOrder,IsWXFans,PlatCode");
                strSql.Append(")");
                strSql.Append(" values (");
                strSql.Append("'" + orderNo + "',");
                strSql.Append("'0',");
                strSql.Append("'" + PartnerOrderNo + "',");
                strSql.Append("'" + DateId + "',");
                strSql.Append("'" + PayFrom + "',");
                strSql.Append("'" + Title + "',");
                strSql.Append("'" + RealName + "',");
                strSql.Append("'" + ShippingAddress + "',");
                strSql.Append("'" + Province + "',");
                strSql.Append("'" + City + "',");
                strSql.Append("'" + Mobile + "',");
                strSql.Append("'" + SellerRemark + "',");
                strSql.Append("'" + Fare + "',");
                strSql.Append("'" + Status + "',");
                strSql.Append("'" + ShippingId + "',");
                strSql.Append("'" + WaybillCode + "',");
                strSql.Append("'" + ItemPrice + "',");
                strSql.Append("'" + OrderTime + "',");
                strSql.Append("'" + DealTime + "',");
                strSql.Append("'" + Source + "',");
                strSql.Append("'" + IsConfirmOrder + "',");
                strSql.Append("'" + IsWXFans + "',");
                strSql.Append("'" + PlatCode + "'");
                strSql.Append(")");
                Global.LiveDB.ExecuteNonQuery(strSql.ToString());//添加订单记录
                if (!String.IsNullOrEmpty(orderNo.ToString()))
                {
                    if (!String.IsNullOrEmpty(ItemIdStr))
                    {
                        string num = "0";
                        if (ItemIdStr.Contains("+"))//多个商品
                        {
                            string[] arritem = ItemIdStr.Split('+');
                            foreach (var i in arritem)
                            {
                                string itemid = "";
                                if (i.Contains("x"))//包含数量
                                {
                                    int numindex = i.IndexOf("x");
                                    num = i.Trim().Substring(numindex + 1);
                                    itemid = i.Trim().Substring(0, numindex);
                                }
                                else
                                {
                                    num = "1";
                                    itemid = i.Trim().ToString();
                                }
                                InsertOrderItem(orderNo.ToString(), itemid, ItemPrice, num);
                            }
                        }
                        else//单个商品
                        {
                            num = "1";
                            InsertOrderItem(orderNo.ToString(), ItemIdStr.ToString().Trim(), ItemPrice, num);
                        }
                    }
                }
            }
        }
        /// <summary>
        /// 插入订单商品记录
        /// </summary>
        /// <param name="orderNo"></param>
        /// <param name="ItemId"></param>
        /// <param name="ItemPrice"></param>
        /// <param name="num"></param>
        /// <returns></returns>
        public int InsertOrderItem(string orderNo, string ItemId, string ItemPrice, string num)
        {
            int ret = 0;
            double totalfee = 0;
            if (!String.IsNullOrEmpty(ItemPrice) && !String.IsNullOrEmpty(num))
            {
                totalfee = Convert.ToDouble(ItemPrice) * Convert.ToInt32(num);
            }
            if (!String.IsNullOrEmpty(ItemId))
            {
                FrameWork.Data.MySqlHelper.connectionString = Common.GetMallConnString;
                string sqlsel = "select SKUID,TITLE,PRICE from mall_sku where itemid=" + ItemId + " order by SKUID limit 1";
                DataTable dtsel = FrameWork.Data.MySqlHelper.ExecuteDataSet(CommandType.Text, sqlsel).Tables[0];
                if (dtsel.Rows.Count > 0)
                {
                    string sqlinset = "insert into PMHMobileMallTradeItems(OrderNo,Title,SkuPropName,ItemId,SkuId,Price,Amount,TotalFee,ItemSource) values(@OrderNo,@Title,@SkuPropName,@ItemId,@SkuId,@Price,@Amount,@TotalFee,@ItemSource)";
                    FrameWork.Data.MySqlHelper.connectionString = Common.GetMallConnString;
                    ret = Global.LiveDB.ExecuteNonQuery(sqlinset,
                         new MySqlParameter("OrderNo", orderNo),
                                new MySqlParameter("Title", dtsel.Rows[0]["title"].ToString()),
                                new MySqlParameter("SkuPropName", dtsel.Rows[0]["title"].ToString()),
                                new MySqlParameter("ItemId", ItemId),
                                new MySqlParameter("SkuId", dtsel.Rows[0]["SKUID"].ToString()),
                                new MySqlParameter("Price", ItemPrice),
                                new MySqlParameter("Amount", num),
                                new MySqlParameter("ItemSource", "shl"),
                                new MySqlParameter("TotalFee", totalfee));
                }
            }
            return ret;
        }
        /// <summary>
        /// 上传Excel文件
        /// </summary>
        /// <param name="inputfile">上传的控件名</param>
        /// <returns></returns>
        private string UpLoadXls(System.Web.UI.HtmlControls.HtmlInputFile inputfile)
        {
            string orifilename = string.Empty;
            string uploadfilepath = string.Empty;
            string modifyfilename = string.Empty;
            string fileExtend = "";//文件扩展名
            int fileSize = 0;//文件大小

            if (inputfile.Value != string.Empty)
            {
                //得到文件的大小
                fileSize = inputfile.PostedFile.ContentLength;
                if (fileSize == 0)
                {
                    throw new Exception("导入的Excel文件大小为0,请检查是否正确!");
                }
                //得到扩展名
                fileExtend = inputfile.Value.Substring(inputfile.Value.LastIndexOf(".") + 1);
                if (fileExtend.ToLower() != "xls")
                {
                    throw new Exception("你选择的文件格式不正确,只能导入EXCEL文件!");
                }

                //新文件名
                modifyfilename = DateTime.Now.ToString("yyyyMMddHHmmss");
                modifyfilename += "." + inputfile.Value.Substring(inputfile.Value.LastIndexOf(".") + 1);
                string apath = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
                //路径
                uploadfilepath = apath+"OrderExel\\";
                //判断是否有该目录
                System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(uploadfilepath);
                if (!dir.Exists)
                {
                    dir.Create();
                }
                orifilename = uploadfilepath + "\\" + modifyfilename;
                //如果存在,删除文件
                if (File.Exists(orifilename))
                {
                    File.Delete(orifilename);
                }
                // 上传文件
                inputfile.PostedFile.SaveAs(orifilename);
            }
            else
            {
                throw new Exception("请选择要导入的Excel文件!");
            }
            return orifilename;
        }







原创粉丝点击