ODBC怎麼樣擷取Excel表中地所有工作表名
exit(1)表示發生錯誤後退出程式, exit(0)表示正常退出。
問題描述:我們要匯入的excel資料檔案中有一列叫做“中標價格”的,這個列裡的資料有那種僅包含數位,也有只有中文的,也有中文和數字混合的,
| 600 |
| 1882 |
| 1124 |
| 16.5元/㎡ |
| 17.5元/m3 |
| 勞務費104元/㎡,擴大分包費13元/㎡ |
| 勞務費104元/㎡,擴大分包費13元/㎡ |
對這樣的資料在查詢分析器裡面執行
SELECT 中標人,[中標價格]
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="D:/招標檔案台帳(全).xls";User ID=;Password=;Extended properties="Excel 5.0"')...[招標檔案$]
會發現只有那些純數位值可以被查出來,其他帶漢字顯示的都是NULL。查看Excel裡的儲存格屬性,發現本來就是常規的文字格式設定,沒有什麼異常;嘗試用SQLSERVER管理器把excel裡的表導到庫裡,發現這個欄位的預設轉換欄位類型為float,這顯然不是我們想要的。當Excel作為資料來源的時候,資料讀取程式(如OLEDB等)是如何判斷其列屬性的呢?下面這段文字給出了答案:
Excel 驅動程式讀取指定源中一定數量的行(預設情況下為 8 行)以推測每列的資料類型。如果推測出列可能包含混合資料類型(尤其是混合了文本資料的數值資料時),驅動程式將決定採用佔多數的資料類型,並對包含其他類型資料的單元返回空值。(如果各種資料類型的數量相當,則採用數實值型別。)
Excel 工作表中大部分儲存格格式設定選項不會影響此資料類型判斷。可以通過指定匯入模式來修改 Excel 驅動程式的此行為。若要指定匯入模式,請在“屬性”視窗中將 IMEX=1 添加到 Excel 連線管理員的連接字串內的擴充屬性值中。
按這段文字所說,我把連接字串調整為下面兩種方式,都可以順利讀出資料:
1.select * from openrowset('Microsoft.Jet.OLEDB.4.0','EXCEL 8.0;HDR=YES;User id=admin;Password=;IMEX=1;
DATABASE=D:/招標檔案台帳(全).xls', [招標檔案$])
2.SELECT [中標價格] FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="D:/招標檔案台帳(全).xls";User ID=;Password=;Extended properties="Excel 5.0;IMEX=1"')...[招標檔案$]
SheetName = "Sheet1";
OleDbConnection ExcelConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + FilePath + "; Extended Properties='Excel 8.0;HDR=YES;IMEX=1'");
ExcelConn.Open();
OleDbCommand Cmd = new OleDbCommand("Select * from [" + SheetName + "$]", ExcelConn);
還有一個哥們兒提出更改Excel宏的方式,雖然並不實用(我們不可能讓所有使用者去做這樣的更改),但卻是一個很“徹底”的方法,這裡也不妨摘錄一下:
問題不在sqlserver ,要在excel中將社會安全號碼欄位強制轉換為文字格式設定,如下:
在包含資料的excel檔案中加入以下宏:
Sub 將所選儲存格內容轉換為字串格式()
ActiveCell.FormulaR1C1 = "'" + ActiveCell.Text
Dim iCol, iRow
For iRow = 1 To Selection.Cells.Rows.Count
For iCol = 1 To Selection.Cells.Columns.Count
Selection.Cells(iRow, iCol).FormulaR1C1 = "'" + Selection.Cells(iRow, iCol).Text
Next iCol
Next iRow
End Sub
加入宏的方法:
1:開啟Excel檔案
2:進入“工具”-“宏”-“Visual Basic 編輯器”
3:選擇菜單“插入”--“模組”,將上面的代碼copy到裡面
4:關閉“Visual Basic 編輯器”,選擇儲存
運行宏的方法:
1:進入“工具”-“宏”-“宏”
2:在“宏”介面中選中要執行的宏
3:點擊“執行”按鈕
選定社會安全號碼那一列,執行該宏,之後再進行匯入操作。
接下來的問題是,IMEX=1等擴充屬性究竟是什麼意思?查到的下面兩句解釋應該是足夠清楚了:
1.IMEX=1:tells the driver to always read "intermixed" data columns as text
2.HDR=Yes; to indicate that I have a header row in my sheets
IMEX是用來告訴驅動程式使用Excel檔案的模式,其值有0、1、2三種,分別代表匯出、匯入、混合模式。當我們設定IMEX=1時將強制混合資料轉換為文本,但僅僅這種設定並不可靠,IMEX=1隻確保在某列前8行資料至少有一個是文本項的時候才起作用,它只是把尋找前8行資料中資料類型佔優選擇的行為作了略微的改變。例如某列前8行資料全為純數字,那麼它仍然以數字類型作為該列的資料類型,隨後行裡的含有文本的資料仍然變空。
另一個改進的措施是IMEX=1與註冊表值TypeGuessRows配合使用,TypeGuessRows 值決定了ISAM 驅動程式從前幾條資料採樣確定資料類型,預設為“8”。可以通過修改“HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Jet/4.0/Engines/Excel”下的該註冊表值來更改採樣行數。但是這種改進還是沒有根本上解決問題,即使我們把IMEX設為“1”, TypeGuessRows設得再大,例如1000,假設資料表有1001行,某列前1000行全為純數字,該列的第1001行又是一個文本,ISAM驅動的這種機制還是讓這列的資料變成空。
1.IMEX=1:tells the driver to always read "intermixed" data columns as text
2.HDR=Yes; to indicate that I have a header row in my sheets
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Jet/4.0/Engines/Excel
從剪下板讀取映像
if(OpenClipboard());
{
EmptyClipboard();
//建立圖元檔案DC
CMetaFileDC * cDC = new CMetaFileDC();
cDC->CreateEnhanced(GetDC(),NULL,NULL,"the_name");
//調用繪圖常式
//關閉CMetafileDC並獲得它的控制代碼
HENHMETAFILE handle = cDC->CloseEnhanced();
//複製到剪貼簿
SetClipBoardData(CF_ENHMETAFILE,handle);
CloseClipboard();
//刪除dc
delete cDC;
}
下面的代碼示範了從剪貼簿獲得圖元檔案並將其繪製到client DC上:
if(OpenClipboard())
{
//獲得剪貼簿資料
HENMETAFILE handle = (HENMETAFILE)GetClipboardData(CF_ENHMETAFILE);
//顯示
CClientDC dc(this);
CRect client(0,0,200,200);
dc.PlayMetaFile(handle,client);
//關閉剪貼簿
CloseClipboard();
}
……Excel 不會像關聯式資料庫那樣為 ADO 提供有關其資料的詳細架構資訊。因此,驅動程式必須至少掃描幾行現有資料,才能有根據地猜測各列的資料類型。“要掃描的行數”的預設值為八 (8) 行。可以指定從一 (1) 行到十六 (16) 行的整數值,或指定零 (0),掃描所有現有行。這可通過向連接字串添加可選的 MaxScanRows= 設定,或在 DSN 配置對話方塊中更改要掃描的行數設定來完成。
但是,由於 ODBC 驅動程式中存在一個錯誤,所以目前指定“要掃描的行數”(MaxScanRows) 設定不起作用。換句話說,Excel ODBC 驅動程式(MDAC 2.1 和更高版本)始終掃描指定資料來源中的前 8 行,以確定各列的資料類型。
……
使用這兩種 OLE DB 提供者時都應考慮的問題
混用資料類型時應注意的事項
如上文所述,ADO 必須猜測 Excel 工作表或範圍中各列的資料類型。(這不受 Excel 儲存格格式設定的影響。)如果同一列中既有數字值,也有文本值,會出現嚴重的問題。Jet 和 ODBC 提供者將返回佔多數的類型的資料,但對於佔少數的資料類型,則會返回 NULL(空)值。如果該列中兩種類型資料的數量相等,提供者將優先選擇數字型資料,放棄文本型資料。
例如: ? 在被掃描的八 (8) 行中,如果該列包含五 (5) 個數字值和三 (3) 個文本值,則提供者將返回五 (5) 個數字和三 (3) 個空值。
? 在被掃描的八 (8) 行中,如果該列包含三 (3) 個數字值和五 (5) 個文本值,則提供者將返回三 (3) 個空值和五 (5) 個文本值。
? 在被掃描的八 (8) 行中,如果該列包含四 (4) 個數字值和四 (4) 個文本值,則提供者將返回四 (4) 個數字和四 (4) 個空值。
因此,如果列中包含不同類型的值,唯一的解決方案是將該列中的數字值儲存為文本,然後在需要時使用 Visual Basic VAL 函數或同等功能的函數將其還原為數字。
作為解決唯讀資料問題的一種替代方法,可在連接字串的“擴充屬性”部分中使用“IMEX=1”這一設定來啟用匯入模式。這可強制執行 ImportMixedTypes=Text 註冊表設定。但在此模式下,執行更新操作時可能會出現意外的結果。
資料--分列--分列
office xp menu
http://www.builder.com.cn/2007/1002/533680.shtml
http://www.codeproject.com/KB/menus/menuxp2.aspx
combox tree check
http://www.codeproject.com/KB/combobox/checkcmb.aspx