colunas ignorados usando VB6 para extrair a partir do Excel
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.
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.