Excel导入MS Access时混合数据列仅导入数值,如何设为文本?
Access导入Excel时强制识别文本字段的解决方法
问题根源是Access的TransferSpreadsheet默认会根据前8行数据判断字段类型,若前8行都是数值,就会把该列识别为数值类型——哪怕目标表字段是短文本,也会忽略非数值条目。可以用以下几种方法解决:
方法一:用Schema.ini文件强制指定字段类型
在Excel文件的同一目录下新建一个名为Schema.ini的文本文件,写入以下内容(替换对应参数):
[Sheet1$] ColNameHeader=True Col2=你的第二列表头名称 Text Width 255
[Sheet1$]对应你要导入的工作表名称Col2表示第二列,根据实际列数调整Text指定该列类型为文本,Width 255对应Access短文本的最大长度
Access导入时会严格按照这个配置识别字段类型,不再自动嗅探。
方法二:改用ADO连接导入(无需额外文件)
替换原函数中的DoCmd.TransferSpreadsheet部分,用ADO连接Excel并通过IMEX=1参数强制读取混合类型为文本,修改后的函数如下:
Public Function Import_Excel(strIMPORTTABLE As String, strFILE As String, strRANGE As String) As Boolean On Error GoTo ErrorHandler Dim conn As Object Dim strSQL As String ' 清空目标表 Run_SQL "Delete * From " & strIMPORTTABLE ' 用ADO连接Excel,指定IMEX=1强制读取混合类型为文本 Set conn = CreateObject("ADODB.Connection") conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strFILE & _ ";Extended Properties=""Excel 12.0 Xml;HDR=YES;IMEX=1;""" ' 直接将Excel数据插入目标表 strSQL = "INSERT INTO " & strIMPORTTABLE & " SELECT * FROM [" & strRANGE & "]" conn.Execute strSQL ' 清理资源 conn.Close Set conn = Nothing Import_Excel = True EndRoutine: Exit Function ErrorHandler: MsgBox Err.Number & " - " & Err.Description Import_Excel = False Resume EndRoutine End Function
IMEX=1参数会让OLEDB驱动将包含混合数据类型的列统一视为文本,彻底解决类型嗅探导致的问题。
方法三:修改Excel源文件列格式(可选)
如果允许修改源Excel文件,直接将第二列的单元格格式设置为文本,保存后再用原函数导入即可。如果需要批量处理,也可以在VBA中先打开Excel文件自动修改格式,但这种方法依赖对源文件的操作,灵活性不如前两种。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

