Importando de planilha Excel - nome da planilha

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Importando de planilha Excel - nome da planilha

Mensagem por JoséQuintas »

Eu uso esta rotina no VB e funciona normalmente.
No Harbour, a parte pra pegar o nome da planilha não funciona. (está com //)
Há alguma outra forma de pegar o nome da planilha, ou existe algum nome default?
Obs. Só a parte de pegar nome é que não funciona.

Código: Selecionar todos

cnExcel := ConexaoExcel(mFileExcel)
cnExcel:Open()
// rsExcel := CreateObject("ADODB.Recordset")
// rsExcel := cnExcel:OpenSchema(20) // adSchemaTables
// cSheetName := cnExcel:Fields("table_name"):Value
// rsExcel:Close()
// rsExcel := NIL
cSheetName := "[AgenteRegulado$]"
cSql := "SELECT COUNT(*) AS QTD FROM " + cSheetName
rsExcel := cnExcel:Execute(cSql)
nQtdTotal := rsExcel:Fields("QTD"):Value
rsExcel:Close()
cSql := "select * from " + cSheetName
rsExcel := cnExcel:Execute(cSql)
rsExcel:MoveFirst()
Do While .Not. rsExcel:Eof()
    rsExcel:MoveNext()
Enddo
RsExcel:Close()
rsExcel := NIL
cnExcel:Close()
cnExcel := NIL
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Importando de planilha Excel - nome da planilha

Mensagem por alxsts »

Olá!

As informações do Toledo neste tópico são bastante úteis. Veja se te ajuda.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Importando de planilha Excel - nome da planilha

Mensagem por JoséQuintas »

O outro tópico é sobre usar o Excel instalado na máquina, é interessante mas não resolve pra onde não tem Excel.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Importando de planilha Excel - nome da planilha

Mensagem por Itamar M. Lins Jr. »

Não sei se é isso, mas...

Código: Selecionar todos

FUNCTION MAIN()
   LOCAL oExcel, oSheet
   LOCAL nRow
   oExcel = win_oleCreateObject( "Excel.Application" )
   oExcel:WorkBooks:Add()
   oSheet = oExcel:ActiveSheet
   USE TEST
   nRow = 1
   WHILE !EOF()
       oSheet:Cells( nRow, 1 ):Value = FIELD -> last
       oSheet:Cells( nRow, 2 ):Value = FIELD -> first
       nRow++
       SKIP
   ENDDO
   oExcel:Visible = .T.
   RETURN NIL
Exemplo reproduzido no grupo internacional de usuários do Harbour.
Tem outro lá zipado.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Importando de planilha Excel - nome da planilha

Mensagem por JoséQuintas »

Esse exemplo que colocou faz uma conexão COM O EXCEL APLICATIVO. Só funciona se tiver Excel instalado na máquina.
Mas decidi deixar com nome de planilha fixo. Quando houver mudança gero um novo EXE.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Importando de planilha Excel - nome da planilha

Mensagem por Itamar M. Lins Jr. »

Se observar direito verás que a função é WIN_OleCreateObject, para fazer a conexão, não importa o que seja.
Por exemplo:

Código: Selecionar todos

rsExcel := CreateObject("ADODB.Recordset")
//troque por
rsExcel := Win_OleCreateObject("ADODB.Recordset")
Esse código eu não testei.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Importando de planilha Excel - nome da planilha

Mensagem por JoséQuintas »

Estou usando Harbour 3.0.
Nele tem CreateObject() igual xHarbour.
E também tem na hbwin.lib esse outro.
Nenhum dos dois aceitou a função de retornar o nome da planilha.
A importação funciona normal, só a função pra retornar o nome da planilha que não funciona.
Aliás... algumas coisas em OLE parecem não funcionar direito, por causa do tipo de informação que retorna.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Importando de planilha Excel - nome da planilha

Mensagem por Itamar M. Lins Jr. »

Sua versão é depois dessa correção ?
2011-07-23 15:08 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/contrib/hbwin/olecore.c
! fixed to use Harbour STR API instead of hardcoded ANSI CP for
conversions between Harbour and OLE items.
Patch provided by Phil Krylov with some minor modifications.
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Importando de planilha Excel - nome da planilha

Mensagem por Itamar M. Lins Jr. »

Qual é a função que retorna o nome da planilha ?

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Importando de planilha Excel - nome da planilha

Mensagem por JoséQuintas »

É nesta parte
rsExcel := CreateObject("ADODB.Recordset")
rsExcel := cnExcel:OpenSchema(20) // adSchemaTables
cSheetName := cnExcel:Fields("table_name"):Value
rsExcel:Close()
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Importando de planilha Excel - nome da planilha

Mensagem por Itamar M. Lins Jr. »

Qual linha exatamente ?
Se for nessa cSheetName tente algo similar a isto:

Código: Selecionar todos

     oExcel := TOleAuto():New("Excel.Application")
       oExcel:WorkBooks:Open( cFile_Excel)
       If !Empty( cSheet )
           cSheet := Alltrim( cSheet )
             oHoja  := oExcel:ActiveSheet()
           oExcel:Sheets(cSheet):Select()
       Endif

        oHoja := oExcel:ActiveSheet()
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Importando de planilha Excel - nome da planilha

Mensagem por Itamar M. Lins Jr. »

Tem mais esse outro exemplo aqui que pega esse tal Sheet...

Código: Selecionar todos

STATIC PROCEDURE Exm_MSExcel()
   LOCAL oExcel, oWorkBook, oWorkSheet, oAS
   LOCAL nI, nCount

   IF ( oExcel := win_oleCreateObject( "Excel.Application" ) ) != NIL

      oWorkBook := oExcel:WorkBooks:Add()

      // Enumerator test
      FOR EACH oWorkSheet IN oWorkBook:WorkSheets
         ? oWorkSheet:Name
      NEXT

      // oWorkBook:WorkSheets is a collection
      nCount := oWorkBook:WorkSheets:Count()

      // Elements of collection can be accessed using :Item() method
      FOR nI := 1 TO nCount
         ? oWorkBook:WorkSheets:Item( nI ):Name
      NEXT

      // OLE also allows to access collection elements by passing
      // indices to :Worksheets property
      FOR nI := 1 TO nCount
         ? oWorkBook:WorkSheets(nI):Name
      NEXT

      oAS := oExcel:ActiveSheet()

      // Set font for all cells
      oAS:Cells:Font:Name := "Arial"
      oAS:Cells:Font:Size := 12

      oAS:Cells( 1, 1 ):Value := "OLE from Harbour"
      oAS:Cells( 1, 1 ):Font:Size := 16

      // oAS:Cells( 1, 1 ) is object, but oAS:Cells( 1, 1 ):Value has value of the cell
      ? "Object valtype:", ValType( oAS:Cells( 1, 1 ) ), "Value:", oAS:Cells( 1, 1 ):Value

      oAS:Cells( 3, 1 ):Value := "String:"
      oAS:Cells( 3, 2 ):Value := "Hello, World!"

      oAS:Cells( 4, 1 ):Value := "Numeric:"
      oAS:Cells( 4, 2 ):Value := 1234.56
      oAS:Cells( 4, 3 ):Value := oAS:Cells( 4, 2 ):Value
      oAS:Cells( 4, 4 ):Value := oAS:Cells( 4, 2 ):Value
      oAS:Cells( 4, 3 ):Value *= 2
      oAS:Cells( 4, 2 ):Value++

      oAS:Cells( 5, 1 ):Value := "Logical:"
      oAS:Cells( 5, 2 ):Value := .T.

      oAS:Cells( 6, 1 ):Value := "Date:"
      oAS:Cells( 6, 2 ):Value := DATE()

      oAS:Cells( 7, 1 ):Value := "Timestamp:"
      oAS:Cells( 7, 2 ):Value := HB_DATETIME()

      // Some formatting
      oAS:Columns( 1 ):Font:Bold := .T.
      oAS:Columns( 2 ):HorizontalAlignment := -4152  // xlRight

      oAS:Columns( 1 ):AutoFit()
      oAS:Columns( 2 ):AutoFit()
      oAS:Columns( 3 ):AutoFit()
      oAS:Columns( 4 ):AutoFit()

      oAS:Cells( 3, 2 ):Font:ColorIndex := 3  // red

      oAS:Range( "A1:B1" ):HorizontalAlignment := 7
      oAS:Range( "A3:A7" ):Select()

      oExcel:Visible := .T.

      oExcel:Quit()
   ELSE
      ? "Error: MS Excel not available. [" + win_oleErrorText()+ "]"
   ENDIF

   RETURN

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Importando de planilha Excel - nome da planilha

Mensagem por JoséQuintas »

Minha versão é 3.0 oficial.
Até baixei os fontes aqui da 3.1, do CVS, mas ainda não tentei compilar.
O uso de "Excel.Application" só funciona em máquina com Excel instalado.
Trata-se de usar o próprio Excel, ao contrário do ADO, que faz parte de qualquer Windows, sem precisar instalar nada adicional.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Importando de planilha Excel - nome da planilha

Mensagem por JoséQuintas »

Só hoje, mais tranquilo vi meu erro, na linha que pega o resultado

Código: Selecionar todos

cnExcel := Win_OleConexaoExcel(mFileExcel) 
cnExcel:Open() 
rsExcel := Win_OleCreateObject("ADODB.Recordset") 
rsExcel := cnExcel:OpenSchema(20) // adSchemaTables 
cSheetName := rsExcel:Fields("table_name"):Value 
rsExcel:Close() 
rsExcel := NIL 
tinha digitado cnExcel:Fields() ao invés de rsExcel:Fields()
cnExcel = conexão ADO com o banco de dados ou planilha
rsExcel = registros contendo resultado

Agora retorna correto.

Obs.
Troquei CreateObject() por Win_OleCreateObject(), mas isso foi devido a atualização para Harbour 3.1
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

Importando de planilha Excel - nome da planilha

Mensagem por Abel »

ola,
nao consigo usar este comando Win_OleCreateObject()
da erro de undefined reference to hb_fun_win_olecreateobject , estava lendo seus posts e vi que vc disse que este comando esta na include "hbwin.ch", mas mesmo assim nao consegui compilar.

sabe dizer o que pode estar faltando.

uso harbour 3.1 nigthy e hbide

abracos
ABEL
Responder