none
如何使用讀取Excel的第一個工作表? RRS feed

  • 問題

  • 大家好~

    由於使用者的工作表都會自行定義名子.

    所以我需要設定固定由第一張工作表讀入資料.

    請問在sql_select = "select * from [Sheet1$]";要怎麼改成固定由第一張工作表讀入呢?

    或用什麼方法可以達到我想要的功能.

    謝謝大家幫忙~

    目前程式如下:

    string sql_select;
    __sPath += filetable;
    string str = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + __sPath + ";Extended Properties='Excel 8.0;HDR=Yes';";
    System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(str);
    conn.Open();

    sql_select = "select * from [Sheet1$]";
    obj_oledb_da = new System.Data.OleDb.OleDbDataAdapter(sql_select, conn);

    obj_oledb_da.Fill(ds, "dsExcel");

    2010年5月13日 上午 03:57

解答

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

    這段Code的用意是在取得所有的SheetName,而裡面的object[]跟你的object並沒有關係.

    FYI : http://support.microsoft.com/kb/318452/zh-tw

     

    if (dt.Rows[0]["TABLE_Name"].ToString().IndexOf("$") < 0)
    {
        dt.Rows[0]["TABLE_Name"] += "$";
    }

    這段Code是在檢查第一個sheet的名字後面有沒有加上$,沒有的話,就補上.

     

    "Select * From [" + dt.Rows[0]["TABLE_Name"].ToString() + "] ";

    因為指定dt.Row[0],所以會是第一個sheet.

     

    我這試了一下中/英文sheetname混合的情況,並沒有發生英文會移到前面,中文往後移的情況,都是依xls裡的順序.

    • 已提議為解答 Lolota Lee 2010年5月19日 上午 02:18
    • 已標示為解答 Lolota Lee 2010年5月20日 上午 06:26
    2010年5月14日 上午 09:44

所有回覆

  • DataTable dt = Conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
    if (dt.Rows[0]["TABLE_Name"].ToString().IndexOf("$") < 0)
    {
        dt.Rows[0]["TABLE_Name"] += "$";
    }
    //這樣應該就可以取得Table名稱
    string strSelect = "Select * From [" + dt.Rows[0]["TABLE_Name"].ToString() + "] ";
    2010年5月13日 上午 06:38
  • 您好~先謝謝您的回答.

    您的答覆是可以運作的.

    但因為我在該類別內,己經有定義Object ,所以,前面己經有一堆的名稱在了.

    所以dt.Rows[0]所取得的table name 也是不正確的.

    目前有想到利用下面的方法取得.

    string strSelect = "Select * From [" + dt.Rows[dt.Rows.Count-1]["TABLE_Name"].ToString() + "] ";

    但問題來了!

    由於本身己經有定義該物件,如果使用者的名子是命名為中文,會插入最後一筆,另為英名,資料會插入第一筆.

    我要如何正確的讀取到資料呢?或在某一物件內就只有該名稱呢?

     

     

    2010年5月13日 上午 07:12
  • 您好~

    針對您的方法,若Excel中有2個或多個工作表時.

    它還是無法只讀到第一張工作表.

    而且我該類別中己經有宣告object的型態如下~

    object[,] colStr = { {"[aaaaa]","char(4)",""},
                         {"[bbbbb]","nvarchar(5)",""},
                         {"[ccccc]","varchar(20)",""},
                         {"[ddddd]","nvarchar(20)",""},
                         {"[eeeee]","nvarchar(5)",""},
                       };

    變成工作表的名子會穿差在其中~

    是否有其他能直接取得第一張工作表的方法呢?

     

    2010年5月13日 上午 07:40
  • 完全看不懂......

    GetOleDbSchemaTable跟類別內宣告變數有什麼關係?

    2010年5月13日 上午 11:39
  • 您好,由於我有宣告object的變數,所以該object的變數也會出現在GetOleDbSchemaTable的回傳值DataTabel裡面.

    而且如果我的Excel的工作表名稱,有中英文之分.

    那英文會插入第一筆,中文會差入第二筆.

    您可以實際測看看~

    謝謝~

    2010年5月14日 上午 12:40
  • 您好,由於我有宣告object的變數,所以該object的變數也會出現在GetOleDbSchemaTable的回傳值DataTabel裡面.

    這句我還是不懂......這兩者是無關的吧

     

    而且如果我的Excel的工作表名稱,有中英文之分.

    那英文會插入第一筆,中文會差入第二筆.

    這個就真的找不到解法了,不如用看看NPOI

    http://msdn.microsoft.com/zh-tw/ee818993.aspx

     

    2010年5月14日 上午 06:59
  • DataTable dt = Conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

    這段Code的用意是在取得所有的SheetName,而裡面的object[]跟你的object並沒有關係.

    FYI : http://support.microsoft.com/kb/318452/zh-tw

     

    if (dt.Rows[0]["TABLE_Name"].ToString().IndexOf("$") < 0)
    {
        dt.Rows[0]["TABLE_Name"] += "$";
    }

    這段Code是在檢查第一個sheet的名字後面有沒有加上$,沒有的話,就補上.

     

    "Select * From [" + dt.Rows[0]["TABLE_Name"].ToString() + "] ";

    因為指定dt.Row[0],所以會是第一個sheet.

     

    我這試了一下中/英文sheetname混合的情況,並沒有發生英文會移到前面,中文往後移的情況,都是依xls裡的順序.

    • 已提議為解答 Lolota Lee 2010年5月19日 上午 02:18
    • 已標示為解答 Lolota Lee 2010年5月20日 上午 06:26
    2010年5月14日 上午 09:44
  • 請問如果是以數字為開頭的話,似乎會將數字放到前面,有試過混入數字為開頭的sheet名稱嗎?
    2012年2月15日 上午 08:51
  • 資料庫的相關函數並不保證順序。

    因此請使用 Automation 來確保順序。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年2月15日 下午 03:16