Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Quem já se quebrou pra ler um xls??
E quem ai precisa ler o xls sem saber a quantidade nem o nome das planilhas, linhas e colunas de cada planilha do arquivo??
Quer mais? Não precisa definir uma área (name) das células
Segue a solução que criei adaptada de códigos retirados aqui do fórum com uma pitada de meu modesto conhecimento em Asp:
ASP
<%@Language="VBScript"%><%
'Autor : Jonathan R. Cardozo (jonathandj)
'Data criação : 14/08/2007
'Finalidade : Leitura de arquivo XLS (Excel 8.0) de forma dinâmica
Dim intColunas, intLinhas
Dim objConn, objRs, objTable
Set objConn = Server.CreateObject("ADODB.Connection")
With objConn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source="& Server.MapPath("pasta.xls") &";Extended Properties=Excel 8.0;"
.Open
End With
Set objTable = Server.CreateObject("ADOX.Catalog")
objTable.ActiveConnection = objConn
for j = 0 to objTable.tables.count - 1
if lcase(objTable.tables(j).Type) = "table" Then
set objRs = Server.CreateObject("ADODB.Recordset")
objRs.CursorLocation = 3
objRs.Open "SELECT * FROM ["&Cstr(Ucase(objTable.tables(j).Name))&"] ",objConn
intCount = 0
if Not objRs.Eof Then
intColunas = objRs.Fields.Count
Response.Write ("<table border=""1"">" & vbNewline)
If intCount = 0 Then
Response.Write ("<tr>" & vbNewline)
For i = 0 To (intColunas-1)
Response.Write ("<td><font size=""1"" face=""verdana""> " & objRs.Fields(i).Name & "</td>" & vbNewline)
next
Response.Write ("</tr>" & vbNewline)
End If
Do While Not objRs.Eof
Response.Write ("<tr>" & vbNewline)
For i = 0 To (intColunas-1)
Response.Write ("<td><font size=""1"" face=""verdana""> " & objRs.Fields(i).Value & "</td>" & vbNewline)
Next
response.write ("</tr>" & vbNewline)
objRs.MoveNext
Loop
Response.Write ("</table>" & vbNewline)
Response.Write ("Nome da Tabela(Planilha):" & Cstr(Ucase(objTable.tables(j).Name)) & vbNewline)
Response.Write ("<br/>" & vbNewline)
Response.Write ("Total Colunas: " & intColunas & vbNewline)
Response.Write ("<br/>" & vbNewline)
Response.Write ("Total Linhas: " & objRs.RecordCount +1 & vbNewline) ' o +1 é por causa da primeira linha que é o name da coluna
End If
objRs.Close
Set objRs = Nothing
Response.Write ("<br/>")
Response.Write ("<br/>")
end if
next
objConn.Close
Set objConn = Nothing
Set objTable = Nothing
%>
Lembrando que esse código não insere no banco, se tiver tempo faço e posto aqui a versão para gravar no DB
Espero que seja útil para alguem
Rapaz, testei de boa, muito bom brother, cara isso vai me ajudar muito, parabéns pelo trabalho, continue assim man!!!
Testei e rodou perfeito agora só uma pergunta
Por que você não colocar tbm como está o arquivo do EXCEL?
Ae Ted, pra quem quiser baixa o arquivo usado nos testes
http://www.allmarketweb.com/pasta.xls
apenas uma correção
trocar for j = 0 to objTable.tables.count - 2 para
for j = 0 to objTable.tables.count - 1
vlw jonathandj, garanto que para quem for entender o script, o arquivo irá ajudar muito!!!!
já baixei o meu (hehe)
beleza cara....lembrando que podem ocorrer erros, mas acho que é uma boa base pra galera
Galera,
estou com um problema e não acho resposta aqui no iMasters.
Pelo q já li, tocaram no assunto anteriormente, porém, sem respostas.
Estou com um arquivo modelo do excel (.xlt) onde preciso inserir as informações do banco de dados (SQL Server 2005).
Meu sistema está em ASP.
Nos terste q realizei na minha máquina (local), rodou perfeitamente, uma maravilha!
Porém, qdo fui jogar pro servidor para homologar o sistema, deu pau e não apresenta qual é o erro.
Apenas fica tentando ler e nada acontece... não estoura nem o tempo do servidor.
É o inverso desse tópico mas, como já postei no outro e não obtive resposta (nem o colega q abriu o tópico obteve), resolvi postar aqui pra ver se alguém tem alguma idéia do q esteja ocorrendo.
Grato.
>
Ae Ted, pra quem quiser baixa o arquivo usado nos testes
http://www.allmarketweb.com/pasta.xls
apenas uma correção
trocar for j = 0 to objTable.tables.count - 2 para
for j = 0 to objTable.tables.count - 1
Eu dei uma modificada para mostrar os inserts como você queria, espero q seja util
Ele pega o titulo da tabela para inserir
<%@Language="VBScript"%>
<%
'Autor : Jonathan R. Cardozo (jonathandj)
'Data criação : 14/08/2007
'Modificado : Adriano Ribeiro de Almeida Gomes
'Data modificação : 14/01/2008
'Finalidade : Leitura de arquivo XLS (Excel 8.0) de forma dinâmica
Dim intColunas, intLinhas
Dim objConn, objRs, objTable
'Modificando
dim tabela : tabela = ""
dim query : query = "INSERT INTO banco ("
dim valores, valorAspa
dim queryfinal
Set objConn = Server.CreateObject("ADODB.Connection")
With objConn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source="& Server.MapPath("pasta.xls") &";Extended Properties=Excel 8.0;"
.Open
End With
Set objTable = Server.CreateObject("ADOX.Catalog")
objTable.ActiveConnection = objConn
for j = 0 to objTable.tables.count - 3
if lcase(objTable.tables(j).Type) = "table" Then
set objRs = Server.CreateObject("ADODB.Recordset")
objRs.CursorLocation = 3
objRs.Open "SELECT * FROM ["&Cstr(Ucase(objTable.tables(j).Name))&"] ",objConn
intCount = 0
if Not objRs.Eof Then
intColunas = objRs.Fields.Count
Response.Write ("<table border=""0"">" & vbNewline)
If intCount = 0 Then
Response.Write ("<tr>" & vbNewline)
For i = 0 To (intColunas-1)
if i <> 0 then tabela = tabela&", "
Response.Write ("<td><font size=""1"" face=""verdana""> " & objRs.Fields(i).Name & "</td>" & vbNewline)
tabela = tabela&objRs.Fields(i).Name
next
query = query & tabela & ") VALUES ("
Response.Write ("</tr>" & vbNewline)
End If
Do While Not objRs.Eof
Response.Write ("<tr>" & vbNewline)
valores = ""
For i = 0 To (intColunas-1)
if i <> 0 then valores = valores&", "
Response.Write ("<td><font size=""1"" face=""verdana""> " & objRs.Fields(i).Value & "</td>" & vbNewline)
if Isnumeric(objRs.Fields(i).Value) then valorAspa = "" else valorAspa="'"
valores = valores&valorAspa&objRs.Fields(i).Value&valorAspa
Next
Response.Write "<td>"&query&valores&");</td>"
response.write ("</tr>" & vbNewline)
objRs.MoveNext
Loop
Response.Write ("</table>" & vbNewline)
End If
objRs.Close
Set objRs = Nothing
Response.Write ("<br/>")
end ifobjConn.Close
Set objConn = Nothing
Set objTable = Nothing
%>
valeu a contribuição DragonBR, bom saber que o pessoal está usando e adaptando os codigos postados, certamente vão aproveitar a sua dica
Jonathan
Estou usando este codigo, sem insert, somente para exibir ele na tela...
mas você sabe pq em determinadas tabela ele não abre algumas células???
ja refiz as tabelas e nada.
estou precisando resolver este problemas, mas não acho outra maneira de exibir a não ser esta....
obrigado!
>
Jonathan
Estou usando este codigo, sem insert, somente para exibir ele na tela...
mas você sabe pq em determinadas tabela ele não abre algumas células???
ja refiz as tabelas e nada.
estou precisando resolver este problemas, mas não acho outra maneira de exibir a não ser esta....
obrigado!
Possivelmente são células mescladas
Alguem sabe me explicar o motivo de não conseguir importar dados do excel do tipo numero?
a minha planilha possui texto e numeros, mais os campos numericos não retorna nada!
o problema é que eu tenho mais de 2000 planilhas para importar para o Sql Server e fica inviável entrar em cada planilha para mudar os campos tipo numero para texto.
Muito bom o post, parabéns!
Eu sou meio novo em ASP, aí surgiu uma dúvida:
Tenho uma tabela no meu excel, no entanto eu não quero filtrar ela toda. Como faço pra filtrar apenas uma linha. Por exemplo, filtrar a Linha A5.
Obrigado!
Olá, eu já adaptei o código pra pegar apenas os valores que eu desejo, mas ele só pega o da primeira linha (ex: A1, A2, A3...).
Como eu faço pra filtrar a célula B1, B2, B3... depois D1, D2, D3...
****
Eu estou conseguindo apenas filtrar a coluna, como eu filtro a linha?
valeu!!!
Testei e funcionou bem, mas estou com problema ao tentar ler celulas mescladas. Alguem conseguiu solicionar esse problema ??
Att
Tiney
Sei que o Post é antigo, mas poderia me passar este arquivos 'Pasta.xls' o link está fora! E o código está todo misturado também!
preciso ler um arquivo XLSX para ASP. este deve servir!
Obrigado!
eu faço direto na sql
SQL"=SELECT * FROM [Plan1$] WHERE tabela_codigo ="& VarUserId &" )
>
eu faço direto na sql
SQL"=SELECT * FROM [Plan1$] WHERE tabela_codigo ="& VarUserId &" )
cara seguinte, já consegui ler a tabela aqui mas preciso por exemplo pegar um dado na coluna 3 linha '12' exemplo, criei um contador para tentar pegar não estou conseguindo bolar algo pra isso, tenho um 'querystring = 12' e quero parear com a linha do ecxell e imprimir na tela seu valor mas nada funciona.. pode me ajudar?
o cod é esse que peguei aqui mesmo, mas queria entender isso primeiro:
For j = 0 to objTable.tables.count - 1
If lcase(objTable.tables(j).Type) = "table" Then
Set objRs = objConn.execute("SELECT * FROM ["&Cstr(Ucase(objTable.tables(j).Name))&"] ")
intCount = 0
If Not objRs.Eof ThenFor i = 2 To (objRs.Fields.Count - 2)
if request.QueryString("id") = intCount then
if i = 0 then
response.Write( objRs.Fields.Item(i).Value & "-"&intCount&"<br />")
else
response.Write( objRs.Fields.Item(i).Value & "-"&intCount&"<br />")
end if
end if
intCount = intCount+1
Next
objRs.MoveNext
Loop
End If
Set objRs = Nothing
End If
Next
Ops! já resolvi! Pode anular essa pergunta.
ficou assim:
>
<%
Dim objConn, objRS, strSQL
Dim x, curValue
Set objConn = Server.CreateObject("ADODB.Connection")
'if using xslx (Excel 2007) use this instead:
objConn.Open "Driver={Microsoft Excel Driver (.xls, .xlsx, .xlsm, .xlsb)};"& "DBQ=" & Server.MapPath("xlsx\Precos.xlsx") & ";"
strSQL = "SELECT * FROM [Plan1$] WHERE id LIKE ('"& request.QueryString("id") &"')"
Set objRS = objConn.Execute(strSQL)
%>
<input type="text" value="<%=objRS.Fields(3).Value%>" id="valores" name="valores" style="width:100%" onKeyPress: "return(currencyFormat(this,'.',',',event))" />
<%
objRS.Close
objConn.Close
Set objRS = Nothing
Set objConn = Nothing
%>
Isso como citei acima, passando a planilha [Plan1$] na SQL
Estou com o código a baixo e preciso que ele filtre sempre no meu arquivo de excel na coluna 5 (coluna "E" que no meu caso tem o nome de usuário) e retorne só retorne as linhas que tem aquele nome de usuario.
Exemplo:
NUMERO
CONTRATO
NUM
NUM1
USER
1
2002309
''
''
EDA G
2
20792293
''
''
MICH
3
272107
''
''
LUIS
4
204092
''
''
ANA
5
2009579
''
''
ANA
Se eu pedisse para retorna o usuário Ana só apareceria os 2 últimos usuário.
<center>
<%@Language="VBScript"%>
<%
Dim intColunas, intLinhas
Dim objConn, objRs, objTable
Set objConn = Server.CreateObject("ADODB.Connection")
With objConn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source="& Server.MapPath("teste.xls") &";Extended Properties=Excel 8.0;"
.Open
End With
Set objTable = Server.CreateObject("ADOX.Catalog")
objTable.ActiveConnection = objConn
for j = 0 to objTable.tables.count - 1
if lcase(objTable.tables(j).Type) = "table" Then
set objRs = Server.CreateObject("ADODB.Recordset")
objRs.CursorLocation = 3
objRs.Open "SELECT * FROM ["&Cstr(Ucase(objTable.tables(j).Name))&"] ",objConn
intCount = 0
if Not objRs.Eof Then
intColunas = objRs.Fields.Count
Response.Write ("<table border=""1"">" & vbNewline)
If intCount = 0 Then
Response.Write ("<tr>" & vbNewline)
For i = 0 To (intColunas-1)
Response.Write ("<td><font size=""1"" face=""verdana""> " & objRs.Fields(i).Name & "</td>" &
vbNewline)
next
Response.Write ("</tr>" & vbNewline)
End If
Do While Not objRs.Eof
Response.Write ("<tr>" & vbNewline)
For i = 0 To (intColunas-1)
Response.Write ("<td><font size=""1"" face=""verdana""> " & objRs.Fields(i).Value & "</td>" &
vbNewline)
Next
response.write ("</tr>" & vbNewline)
objRs.MoveNext
Loop
Response.Write ("</table>" & vbNewline)
Response.Write ("Nome da Tabela(Planilha):" & Cstr(Ucase(objTable.tables(j).Name)) & vbNewline)
Response.Write ("<br/>" & vbNewline)
Response.Write ("Total Colunas: " & intColunas & vbNewline)
Response.Write ("<br/>" & vbNewline)
Response.Write ("Total Linhas: " & objRs.RecordCount +1 & vbNewline) ' o +1 é por causa da primeira linha
que é o name da coluna
End If
objRs.Close
Set objRs = Nothing
Response.Write ("<br/>")
Response.Write ("<br/>")
end if
next
objConn.Close
Set objConn = Nothing
Set objTable = Nothing
%>está gerando erro ?
Cara muito bom este script..... era exatamente o que eu estava procurando... vou testar....