Pergunta

Eu estou tentando extrair uma tabela de valores de um excel (2003) planilha usando VB6, o resultado de que precisa ser armazenada em um (adodb) registros. Os olhares tabela como esta:

    Name   Option.1  Option.2  Option.3  Option.4  Option.5  Option.6 
    -----------------------------------------------------------------
    Name1         2         3         4
    Name2         2         3         4
    Name3         2         3         4
    Name4         2         3         4
    Name5         2         3         4
    Name6         2         3         4
    Name7         2         3         4
    Name8         2         3         4
    Name9         2         3         4         5         6         7  

Depois de conectar e executar a consulta "SELECT * FROM [Sheet1$]" ou mesmo um específicos de coluna, "SELECT [Option#6] FROM [Sheet1$]" (ver nota 1) e looping através dos resultados, eu sou dado valores Null para a linha Name9, Option.4 -> Option.6 em vez de os valores corretos 5, 6 e 7. parece que a conexão com a planilha está usando uma "melhor estimativa" de decidir quais são os limites da tabela são válidos, e só leva um determinado número de linhas em conta.

Para se conectar à planilha, eu tentei tanto provedores de conexão Microsoft.Jet.OLEDB.4.0 e MSDASQL e obter o mesmo problema.

Aqui estão as configurações de conexão que eu uso:

Set cn = New ADODB.Connection
With cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Data Source=" & filePath & ";Extended Properties=Excel 8.0;"
    - - - - OR - - - - 
    .Provider = "MSDASQL"
    .ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
                        "DBQ=" & filePath & ";MaxScanRows=0;"
    .CursorLocation = adUseClient
    .Open
End With  
Set rsSelects = New ADODB.Recordset
Set rsSelects = cn.Execute("SELECT [Option#5] FROM " & "[" & strTbl & "]")

Este problema só ocorre quando há mais de 8 linhas (excluindo os nomes das colunas), e eu tenho MaxScanRow=0 conjunto para a conexão MSDASQL, mas isso produziu os mesmos resultados.

referências do projeto Notáveis ??Tenho incluídos são:

  • MS ActiveX Data Objects 2.8 Biblioteca
  • MS ActiveX Data Objects registos 2,8 Biblioteca
  • MS Excel 11.0 Object Library
  • MS vinculação de dados Coleção VB 6.0 (SP4)

Qualquer ajuda neste assunto seria muito apreciada!

(1) Por alguma razão, quando incluindo um ponto decimal no nome da coluna, ele é interpretado como um #.


Obrigado a todos! No meio tentando configurar um Schema.ini "programática" do KB155512 onedaywhen 's excelente pós apontou-me para a solução:

.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & filePath & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

Eu encorajaria qualquer pessoa com problemas semelhantes a ler o post e comentários, uma vez que existem pequenas variações para uma solução de uma pessoa para outra.

Foi útil?

Solução

Você está correto: é adivinhar o tipo de dados com base em uma série de linhas. Há chaves de registro máquina de locais que você pode ser capaz de alterar a influenciar o tipo de dados escolhido. Para mais detalhes, consulte esta resposta .

Outras dicas

O controlador ISAM Excel pela aparência padrão para o primeiro punhado de suas linhas e adivinha o seu tipo de dados. Deve haver (mais tarde na tabela) dados que não se encaixam na suposição inicial, ele franze a testa e transforma-lo para NULL.

A configuração MaxScanRows=0 é a chave para este problema. Parece que ele iria fazer a coisa certa (digitalizar toda a tabela para o tipo de dados para uso), mas na verdade isso não acontece.

onedaywhen 's resposta para posterior detalhes, a minha primeira informação sobre KB282263 não era o conselho correto.

O melhor conselho que posso dar é para parar de fazer isso no ambiente de VB6. Abra o Excel, pressione ALT + F11 e carregar o VBA IDE. Colocar o seu código lá. A partir deste ambiente você pode acessar o modelo completo de objeto do Excel.

Eu já vi muitas pessoas tentam e interagir com Excel em muitas maneiras diferentes e todos eles têm problemas. Usando a macro VBA, ou Add-in método é a melhor maneira que eu encontrei de entrar na dados. É como Microsoft Excel obter e projeto de integração com o TFS.

Às vezes, você precisa repensar o processo um pouco para esta abordagem para ser adequado. Por exemplo. Pode ser necessário para obter o usuário que está usando a planilha para executar uma macro que vai empurrar os dados para fora da planilha em vez de você executar um processo de puxar os dados da planilha, mas geralmente é bastante factível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top