导入excel文件返回null为现有的数据

我试图导入Excel文件Excel97-2003(仅第一张)到Access数据库。 为此我使用下面的代码:

Dim cnnExcel As New ADODB.Connection Dim rsExcel As New ADODB.Recordset With cnnExcel .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=" & strFileSelected & ";" & "Extended Properties=Excel 8.0" .CursorLocation = adUseClient .Open End With rsExcel.Open "SELECT * FROM [Sheet1]", cnnExcel 

Excel文件中的所有列都是string,当您使用Excel2003打开时,其types为“常规”(无特殊格式),另外3列是date。 我的问题是,我得到空的单元格中存在的值为空。例如,如果第一个值是string比如果有列中的整数它将返回为空,反之亦然有没有解决scheme呢?

谢谢

解决scheme1

使用您的代码,我可以正确加载数据从一个Excel工作表没有问题。
但是,请检查您的SQL查询,它应该是这样的:

 rsExcel.Open "SELECT * FROM [Sheet 1$]", cnnExcel 

FROM部分的规则如下:

  • 查询整个工作表: SELECT * FROM [SheetName$] ,注意$
  • 从一个范围查询:
    SELECT * FROM [SheetName$A1:C5]
  • 来自命名范围的查询:
    SELECT * FROM NameRange
  • 从具有非字母数字字符的工作表中查询:
    SELECT * FROM ['This;is.My SheetName$']

在我的机器上工作的代码:

 Dim cnnExcel As Object Dim rsExcel As Object Set cnnExcel = CreateObject("ADODB.Connection") Set rsExcel = CreateObject("ADODB.RecordSet") With cnnExcel .Provider = "Microsoft.Jet.OLEDB.4.0" .ConnectionString = "Data Source=D:\Query1.xls;Extended Properties=Excel 8.0" .CursorLocation = 3 .Open End With rsExcel.Open "SELECT * FROM [Sheet 1$]", cnnExcel Debug.Print rsExcel.RecordCount ' Prints the number of rows containing data ' Do Debug.Print "Col1: " & rsExcel.Fields(0) & " - Col2: " & rsExcel.Fields(1) rsExcel.MoveNext Loop While Not rsExcel.EOF rsExcel.Close 

解决scheme2

您可能有更好的运气直接操作Excel工作簿。
假设您的Access数据库中有一个表MyTable ,您希望在myAmyBmyC (具有您期望的正确数据types)字段中导入您的Excel Sheet 1中具有相应列的内容。

简化的VBA代码如下所示:

 Sub ImportData(fname As String) Dim xlo As Object Dim xlWb As Object Dim xlWs As Object Dim colA, colB, ColC As Variant Dim db As DAO.Database Dim rs As DAO.Recordset Dim thereIsData As Boolean Dim row As Integer ' Open Excel sheet, try to re-use Excel if it is open ' On Error Resume Next Set xlo = GetObject("Excel.Application") If xlo Is Nothing Then Set xlo = CreateObject("Excel.Application") On Error Goto 0 Set xlWb = xla.Workbooks.Open(fname) Set xlWs = xlWb.Worksheets(1) ' Sheet 1' ' Open table where the results will be stored ' Set db = CurrentDb() Set rs = db.OpenRecordset("MyTable", dbOpenDynaset) Do colA = xlWs.Cells(row, 1).Value colB = xlWs.Cells(row, 2).Value colC = xlWs.Cells(row, 3).Value ' We will stop at the first empty row ' thereIsData = Not (IsBlank(colA) And IsBlank(colB) And IsBlank(colC)) If thereIsData Then ' Add the Excel data to the table ' rs.AddNew rs!myA = colA rs!myA = colB rs!myA = colC rs.Update End If row = row + 1 Loop While thereIsData rs.Close ' Cleanup ' Set rs = Nothing Set db = Nothing Set xlWs = Nothing Set xlWb = Nothing xla.DisplayAlerts = False xla.Quit Set xls = Nothing End Sub '----------------------------------------------------------------------------- ' True if the argument is Nothing, Null, Empty, Missing or an empty string . '----------------------------------------------------------------------------- Public Function IsBlank(arg As Variant) As Boolean Select Case VarType(arg) Case vbEmpty IsBlank = True Case vbNull IsBlank = True Case vbString IsBlank = (arg = vbNullString) Case vbObject IsBlank = (arg Is Nothing) Case Else IsBlank = IsMissing(arg) End Select End Function 

我认为你首先需要将你的Excel数据中的任何数字转换为文本格式(数字格式为文本在angular落中有一个绿色的三angular形默认情况下,可以使用错误检查选项来抑制)。 有两种方法可以做到这一点,一个用于单列,另一个用于较大的范围:

方法1)select一个列,然后select数据选项卡>文本到列点击下两次,在第三步select文本选项,然后单击完成。

方法2)复制整个表格或表格,然后select格式化单元格,然后单击数字格式的文本。 现在,您可以通过单击办公室剪贴板上的图标或将表格粘贴到记事本并复制粘贴回Excel来粘贴为文本。 (可以通过单击主页选项卡上剪贴板部分右下方的箭头来激活办公剪贴板)