odbc 寫excel

來源:互聯網
上載者:User

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

 
 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.