odbc 写excel

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=1tells 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


 
 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值