Jump to content
Jonathan Cardozo

Lendo XLS dinâmico para visualização em tela

Recommended Posts

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

Share this post


Link to post
Share on other sites

Cara muito bom este script..... era exatamente o que eu estava procurando... vou testar....

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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 if
next

objConn.Close
Set objConn = Nothing
Set objTable = Nothing
%>
Edited by Ted k'
Adicionado o BBCode CODE

Share this post


Link to post
Share on other sites

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!

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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!

Share this post


Link to post
Share on other sites

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!!!

Share this post


Link to post
Share on other sites

Testei e funcionou bem, mas estou com problema ao tentar ler celulas mescladas. Alguem conseguiu solicionar esse problema ??

 

Att

 

Tiney

Share this post


Link to post
Share on other sites

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!

Share this post


Link to post
Share on other sites

eu faço direto na sql

SQL"=SELECT * FROM [Plan1$] WHERE tabela_codigo ="& VarUserId &" )

Share this post


Link to post
Share on other sites

 

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 Then
Do While Not objRs.Eof

For 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

 

Edited by gilbertojr

Share this post


Link to post
Share on other sites

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
%>
Edited by gilbertojr

Share this post


Link to post
Share on other sites

Isso como citei acima, passando a planilha [Plan1$] na SQL

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.