博客园  :: 联系 :: 管理

【转】把Excel文件的数据导入到DataSet数据集中

Posted on 2011-01-25 12:28  独孤雁  阅读(378)  评论(0编辑  收藏  举报

前几天做了这样的导入,当时在网上找了很多例子,都不错。但是由于本机的一些设置原因,有一些代码不能执行,最后找到一个可行性的方法来实现这个功能;

看了一些Excel.Appliction方法导入,但是好像是需要一些配置,我照样配置了一下,可是还是不能用,无奈之下又换了种方法;

filePath为文件的路径

public static DataTable Import(string filePath)
    {
        DataTable rs = new DataTable();

        bool canOpen = false;

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

        try//尝试数据连接是否可用
        {
            conn.Open();
            conn.Close();
            canOpen = true;
        }
        catch { }

        if (canOpen)
        {

            //得到工作表的名称
            DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

            string tablename = dt.Rows[0][2].ToString().Trim();

            if (tablename.Length > 0)
            {
                OleDbCommand myOleDbCommand = new OleDbCommand("SELECT * FROM [" + tablename + "]", conn);
                OleDbDataAdapter myData = new OleDbDataAdapter(myOleDbCommand);
                myData.Fill(rs);
                conn.Close();
            }
                    }
        else//如何Excel的格式不是标准的需要转换一下( 只针对<table><tr><td></td></tr>)
        {
            System.IO.StreamReader tmpStream = File.OpenText(filePath);
            string tmpStr = tmpStream.ReadToEnd();
            tmpStream.Close();
            rs = GetDataTableFromString(tmpStr);
            tmpStr = "";
        }
        return rs;
    }

  //此方法来处理Excel的格式为表格(有tr、td)
    private static DataTable GetDataTableFromString(string tmpHtml)
    {
        string tmpStr=tmpHtml;
        DataTable TB=new DataTable();
        //先处理一下这个字符串,删除第一个<tr>之前合最后一个</tr>之后的部分
        int index=tmpStr.IndexOf("<tr");
        if(index>-1)
            tmpStr=tmpStr.Substring(index);
        else
            return TB;

        index=tmpStr.LastIndexOf("</tr>");
        if(index>-1)
            tmpStr=tmpStr.Substring(0,index+5);
        else
            return TB;

        bool existsSparator=false;
        char Separator=Convert.ToChar("^");

        //如果原字符串中包含分隔符“^”则先把它替换掉
        if(tmpStr.IndexOf(Separator.ToString())>-1)
        {
            existsSparator=true;
            tmpStr=tmpStr.Replace("^","^$&^");
        }

        //先根据“</tr>”分拆
        string[] tmpRow=tmpStr.Replace("</tr>","^").Split(Separator);
      
        for(int i=0;i<tmpRow.Length-1;i++)
        {
            DataRow newRow=TB.NewRow();

            string tmpStrI=tmpRow[i];
            if(tmpStrI.IndexOf("<tr")>-1)
            {
                tmpStrI=tmpStrI.Substring(tmpStrI.IndexOf("<tr"));
                if(tmpStrI.IndexOf("display:none")<0||tmpStrI.IndexOf("display:none")>tmpStrI.IndexOf(">"))
                {
                    if (i == 0)
                        tmpStrI = tmpStrI.Replace("</th>", "^");//取表头
                    else
                        tmpStrI=tmpStrI.Replace("</td>","^");
                    string[] tmpField=tmpStrI.Split(Separator);

                    for(int j=0;j<tmpField.Length-1;j++)
                    {
                        tmpField[j]=RemoveString(tmpField[j],"<font>");
                        index=tmpField[j].LastIndexOf(">")+1;
                        if(index>0)
                        {
                            string field=tmpField[j].Substring(index,tmpField[j].Length-index);
                            if(existsSparator)
                                field=field.Replace("^$&^","^");
                            if(i==0)
                            {
                                string tmpFieldName=field;
                                int sn=1;
                                while(TB.Columns.Contains(tmpFieldName))
                                {
                                    tmpFieldName=field+sn.ToString();
                                    sn+=1;
                                }
                                TB.Columns.Add(tmpFieldName);
                            }
                            else
                            {
                                newRow[j]=field;
                            }
                        }//end of if(index>0)
                    }

                    if(i>0)
                    TB.Rows.Add(newRow);
                }
            }
        }

        TB.AcceptChanges();
        return TB;
        }

        /// <summary>
        /// 从指定Html字符串中剔除指定的对象
        /// </summary>
        /// <param name="tmpHtml">Html字符串</param>
        /// <param name="remove">需要剔除的对象--例如输入"<font>"则剔除"<font ???????>"和"</font>>"</param>
        /// <returns></returns>
        public static string RemoveString(string tmpHtml, string remove)
        {
            tmpHtml = tmpHtml.Replace(remove.Replace("<", "</"), "");
            tmpHtml = RemoveStringHead(tmpHtml, remove);
            return tmpHtml;
        }

        /// <summary>
        /// 只供方法RemoveString()使用
        /// </summary>
        /// <returns></returns>
        private static string RemoveStringHead(string tmpHtml, string remove)
        {
            //为了方便注释,假设输入参数remove="<font>"
            if (remove.Length < 1) return tmpHtml;//参数remove为空:不处理返回
            if ((remove.Substring(0, 1) != "<") || (remove.Substring(remove.Length - 1) != ">")) return tmpHtml;//参数remove不是<?????>:不处理返回

            int IndexS = tmpHtml.IndexOf(remove.Replace(">", ""));//查找“<font”的位置
            int IndexE = -1;
            if (IndexS > -1)
            {
                string tmpRight = tmpHtml.Substring(IndexS, tmpHtml.Length - IndexS);
                IndexE = tmpRight.IndexOf(">");
                if (IndexE > -1)
                    tmpHtml = tmpHtml.Substring(0, IndexS) + tmpHtml.Substring(IndexS + IndexE + 1);
                if (tmpHtml.IndexOf(remove.Replace(">", "")) > -1)
                    tmpHtml = RemoveStringHead(tmpHtml, remove);
            }
            return tmpHtml;
        }

private static int GetSheetIndex(byte[] FindTarget, byte[] FindItem)
        {
            int index = -1;

            int FindItemLength = FindItem.Length;
            if (FindItemLength < 1) return -1;
            int FindTargetLength = FindTarget.Length;
            if ((FindTargetLength - 1) < FindItemLength) return -1;

            for (int i = FindTargetLength - FindItemLength - 1; i > -1; i--)
            {
                System.Collections.ArrayList tmpList = new System.Collections.ArrayList();
                int find = 0;
                for (int j = 0; j < FindItemLength; j++)
                {
                    if (FindTarget[i + j] == FindItem[j]) find += 1;
                }
                if (find == FindItemLength)
                {
                    index = i;
                    break;
                }
            }
            return index;
        }

注:需要导出格式为表格的Excel的,请查阅前面一篇文章便知