Página 1 de 2

Importando de planilha Excel - nome da planilha

Enviado: 20 Set 2011 14:39
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

Importando de planilha Excel - nome da planilha

Enviado: 20 Set 2011 22:01
por alxsts
Olá!

As informações do Toledo neste tópico são bastante úteis. Veja se te ajuda.

Importando de planilha Excel - nome da planilha

Enviado: 21 Set 2011 08:21
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.

Importando de planilha Excel - nome da planilha

Enviado: 21 Set 2011 08:40
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.

Importando de planilha Excel - nome da planilha

Enviado: 21 Set 2011 10:17
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.

Importando de planilha Excel - nome da planilha

Enviado: 21 Set 2011 12:01
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.

Importando de planilha Excel - nome da planilha

Enviado: 21 Set 2011 20:32
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.

Importando de planilha Excel - nome da planilha

Enviado: 22 Set 2011 08:30
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.

Importando de planilha Excel - nome da planilha

Enviado: 22 Set 2011 08:34
por Itamar M. Lins Jr.
Qual é a função que retorna o nome da planilha ?

Saudações,
Itamar M. Lins Jr.

Importando de planilha Excel - nome da planilha

Enviado: 22 Set 2011 10:40
por JoséQuintas
É nesta parte
rsExcel := CreateObject("ADODB.Recordset")
rsExcel := cnExcel:OpenSchema(20) // adSchemaTables
cSheetName := cnExcel:Fields("table_name"):Value
rsExcel:Close()

Importando de planilha Excel - nome da planilha

Enviado: 22 Set 2011 20:46
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.

Importando de planilha Excel - nome da planilha

Enviado: 22 Set 2011 20:51
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.

Importando de planilha Excel - nome da planilha

Enviado: 22 Set 2011 23:05
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.

Importando de planilha Excel - nome da planilha

Enviado: 15 Out 2011 20:12
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

Importando de planilha Excel - nome da planilha

Enviado: 26 Mai 2012 00:05
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