Импорт файла Excel возвращает ноль для существующих данных - PullRequest
2 голосов
/ 21 марта 2012

Я пытаюсь импортировать файл 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 являются строковыми и имеют тип «Общие» (без специального формата) при открытии его в Excel2003) и 3 другихстолбцы даты.Моя проблема в том, что я получаю значение NULL для значения, которое существует в ячейке. Например, если первое значение является строкой, чем если в этих столбцах есть целое число, оно будет возвращено как NULL, и наоборот. Есть ли какое-либо решение для этого?

Спасибо

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Раствор 1

Используя ваш код, я смог без проблем загрузить данные из листа 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

Раствор 2

Возможно, вам больше повезет с непосредственным управлением книгой Excel.
Предположим, у вас есть таблица MyTable в вашей базе данных Access, куда вы хотите импортировать в поля myA, myB и myC (которые имеют нужный вам тип данных!) Содержимое вашего 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  
0 голосов
/ 21 марта 2012

Я думаю, что сначала вам нужно преобразовать любые числа в данных Excel в текстовый формат (числа, отформатированные как текст, по умолчанию имеют зеленый треугольник в углу, который можно подавить с помощью параметров проверки ошибок).Есть два способа сделать это: один для отдельных столбцов и один для больших диапазонов:

Метод 1) Выберите один столбец, затем выберите вкладку «Данные»> «Текст в столбцы», дважды нажмите «Далее», выберите «Текст»на третьем шаге выберите «Готово».

Метод 2) Скопируйте всю таблицу или лист, затем выберите «Формат ячеек» и нажмите «Текст» для числового формата.Теперь вы можете вставить текст, нажав на значок в буфере обмена Office или вставив таблицу в блокнот, а затем скопировав и вставив обратно в Excel.(Офисный буфер обмена можно активировать, нажав стрелку в правом нижнем углу раздела буфера обмена на вкладке "Главная")

...