Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Servers
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-09-2011
Avatar de juanlaplata
juanlaplata juanlaplata is offline
Miembro
 
Registrado: ene 2007
Ubicación: La Plata, Bs. As. (Argentina)
Posts: 212
Poder: 20
juanlaplata Va por buen camino
Importar Excel:
Código Delphi [-]
procedure TForm80.ExcelClick(Sender: TObject);
var
 Excel, Sheet: OLEVariant;
 CantRow, CantCol, i, j : Integer;
 RangoMatriz: Variant;
 FileName :string ;
begin

      OpenDialog.Title := 'Excel a Importar ...';
      OpenDialog.DefaultExt := 'xls';
      OpenDialog.InitialDir := ExtractFilePath(Application.ExeName);
      OpenDialog.FileName := '';
      OpenDialog.Filter:='Archivos Excel (*.xls)|*.xls';
      OpenDialog.FilterIndex:=1;
      if(OpenDialog.Execute)then
           begin
           if(OpenDialog.FileName <> '')then
              begin  

              FileName := OpenDialog.FileName;
              Excel := CreateOleObject('Excel.Application');
              Excel.Workbooks.Open(FileName);

              Sheet := Excel.Workbooks[ExtractFileName(FileName)].WorkSheets[1];
              Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;

              CantRow := Excel.ActiveCell.Row;
              CantCol := Excel.ActiveCell.Column;

              RangoMatriz := Excel.Range['A1', Excel.Cells.Item[CantRow,CantCol]].Value;

              for i:=1 to CantRow do
                 begin
                      for j:=1 to CantCol do
                       begin

                            Table1.Append;
                            Table1Campo.AsString := trim(RangoMatriz[i,j]);
                            Table1.Post;

                       end; // for j
                 end;//for i
              Excel.quit;
              end;
           end;
end;

Este Codigo, no es de mi autoria, deberia colocar la fuente, que la verdad, no la tengo en este momento.
Lo que hace es recorrer todas las celdas del Excel y cargar en una tabla.
La idea es ver como se hace y q cada uno lo reprograme a gusto y necesidad.
Saludos.
Responder Con Cita
  #2  
Antiguo 03-08-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¡Ah qué caray!

El bucle tiene un error pero supongo que ya lo habrás notado: ¡le falta Table1.Append al principio!

// Saludos
Responder Con Cita
  #3  
Antiguo 03-08-2003
Avatar de DarkSide
DarkSide DarkSide is offline
Miembro
 
Registrado: jun 2003
Ubicación: La Serena - Chile
Posts: 91
Poder: 24
DarkSide Va por buen camino
Thumbs up

De nuevo muchas gracias, realize todos los pasos que me indicaste, y todo funciono a la perfecion. Si bien los pasos una vez descritos son bastante entendibles, ¿como pudiste llegar a ellos?. Mientras me contestabas, trate de una y otra forma de utilizar estos componentes, pero no se me ocurrio hacerlo de esa forma. Ya sé que muchas veces se cuenta el milagro pero no el santo, pero en realidad me interesa investigar mas a fondo los componentes ADO, si me pudieras dar algunas direcciones internet que haben del tema te lo agradeceria mucho.

Consulta: Existe alguna diferencia que sea importante al momento de decidir ocupar, entre las propiedades:

Table1.Fields[0].Value;
y
Table1.FieldByName('campo').AsString;

Reitero mis agradecimientos roman.
Responder Con Cita
  #4  
Antiguo 03-08-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Posteado originalmente por DarkSide
De nuevo muchas gracias, realize todos los pasos que me indicaste, y todo funciono a la perfecion. Si bien los pasos una vez descritos son bastante entendibles, ¿como pudiste llegar a ellos?. Mientras me contestabas, trate de una y otra forma de utilizar estos componentes, pero no se me ocurrio hacerlo de esa forma. Ya sé que muchas veces se cuenta el milagro pero no el santo, pero en realidad me interesa investigar mas a fondo los componentes ADO, si me pudieras dar algunas direcciones internet que haben del tema te lo agradeceria mucho.
Como te mencioné, seguí los pasos del artículo, no creas que se me ocurrieron a mi solito. Por cierto, la suscripción no es muy cara y es muy buena la revista y tienes acceso a un montón de artículos de todos los números pasados.

De cualquier forma debe haber muchos lugares en la Web en dónde consultar. Una búsqueda en Google me dió al menos este artículo del sitio de Borland. Aquí debes registrarte pero es gratuito.

Tanbién seguro que otras personas en estos foros podrán orientarte mejor que yo, una vez que despierten

Cita:
Posteado originalmente por DarkSide

Consulta: Existe alguna diferencia que sea importante al momento de decidir ocupar, entre las propiedades:

Table1.Fields[0].Value;
y
Table1.FieldByName('campo').AsString;
Dado que la primera forma accede a los campos mediante "variants" quizá sea más lento, prueba usando FieldByName().AsXXX a ver si se agiliza un poco.

// Saludos
Responder Con Cita
  #5  
Antiguo 03-08-2003
Avatar de DarkSide
DarkSide DarkSide is offline
Miembro
 
Registrado: jun 2003
Ubicación: La Serena - Chile
Posts: 91
Poder: 24
DarkSide Va por buen camino
Muchas gracias por todo, ahora me voy a acostar porque es muy tarde y me dio mucho sueño .

Saludos.
Responder Con Cita
  #6  
Antiguo 05-08-2003
Avatar de DarkSide
DarkSide DarkSide is offline
Miembro
 
Registrado: jun 2003
Ubicación: La Serena - Chile
Posts: 91
Poder: 24
DarkSide Va por buen camino
Hola, de nuevo. Resulta que probando con una planilla Excel,
tuve que validar si las celdas estaban vacias o no, a traves del
siguiente codigo dentro del bucle de asignación:

Código:
val cConc: String; 
 ...
while not AdoDataSet1.Eof do begin
   if AdoDataSet1.Fields[14].Value = Null
      then cConc:= ''
      else cConc:= AdoDataSet1.Fields[14].Value;
   ...

   Table1.FieldByName('conc').AsString:= cConc;
   ...
end;
Pero resulta que sucedio algo extraño, habian celdas que tenian
información (valor numerico), y en la asignación aparecian con
valores nulos (Null), siendo que la celda anterior (misma columna)
se recuperaba el valor sin ningun problema, y en otra columna
simplemente no recuperaba su valor en todo el bucle.

Revise la planilla excel para ver si era el formato de la celda, pero
ambas tenian el mismo formato. Probe cambiando de Excel 2000
a Excel 97, pero no resulto. La unica diferencia que encontre es el
valor que contenian, la que me arrojaba el valor nulo tenia
5202006 y la anterior 1118084, pero como la recuperaba con la
sentencia:

Table1.FieldByName('cuenta').AsString:= AdoDataSet1.Fields[3].Value;

deberia devolverme un valor 'variants'. Desde ya agradesco su ayuda.
Responder Con Cita
  #7  
Antiguo 25-08-2003
Avatar de DarkSide
DarkSide DarkSide is offline
Miembro
 
Registrado: jun 2003
Ubicación: La Serena - Chile
Posts: 91
Poder: 24
DarkSide Va por buen camino
Esta vez me respondo yo mismo.

Resulta que el programa estaba bien, el problema era la planilla excel, que tenia datos con distinta alineación (izq. y derecha) en una misma columna, y esto por alguna razón que desconozco traspasaba valores nulos. La solución fue copiar "solo los valores" de la hoja (pegado especial), pegarlos en una hoja nueva y dar el formato de "texto" a todas las celdas.

En fin, cuando se trabaja con Excel hay que tener en cuenta estos inconvenientes.

Por mi parte cierro este hilo, y muchas gracias por todo.
Responder Con Cita
  #8  
Antiguo 30-03-2004
atirado atirado is offline
Miembro
 
Registrado: mar 2004
Posts: 41
Poder: 0
atirado Va por buen camino
Exclamation

Hola de nuevo! Hice nuevamente los pasos que le menciona Román a DarkSide y corregí algunos errores que tenía y logré por fin que el dbgrid se conectara a mi archivo de excel.
Sin embargo, no logro hacer que en el dbgrid me muestre la tabla. ¿Alguien sabrá por qué me marca un error al querer abrir la tabla que lo contiene?

Tengo los siguientes componentes en la forma:
1. Una ADOConnection llamado adcExcel cuya ConnectionString es la siguiente:

Código:
Provider=Microsoft.Jet.OLEDB.4.0;User ID=admin;
Data Source=C:\Documents and Settings\Administrador\Mis documentos\BD Pruebas XL-ADO\nomina.xls;
Mode=ReadWrite;Extended Properties=Excel 8.0;Jet OLEDB:System database="";
Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";
Jet OLEDB:Engine Type=35;Jet OLEDB:Database Locking
Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;
Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;
Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;
Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False
Manda llamar como provider a Microsoft.Jet.OLEDB.4.0 y el archivo es de Excel, llamado "nominas.xls"
2. Un ADODataSet llamado dsExcel que tiene las siguientes propiedades:
  • Connection => adcExcel.
  • Command type => cmdTableDirect
  • CommandText => Hoja1$ (donde está la tabla con los datos)
Este ADODataSet contiene todos los campos de la tabla de Excel, por ello comento que al parecer el enlace sí se logra.
3. Un DataSource llamado dsExcel cuyo DataSet es dsExcel.
4. Un ADOTable llamado tblExcel con las siguientes propiedades:
  • Connection => adcExcel
  • MasterSource => dscExcel
  • TableName => Hoja1$
Y al momento de tratar de abrir la tabla en tiempo de ejecución, me envía la excepción:

Código:
Project X.exe raised exception class EOleException with message 'Error de sintaxis en la cláusula FROM'. Process stopped. Use Step or Run to continue.

De antemano muchas gracias por su ayuda; realmente me ha servido mucho tener contacto con ustedes

Última edición por atirado fecha: 30-03-2004 a las 18:15:03. Razón: mensaje demasiado ancho
Responder Con Cita
  #9  
Antiguo 30-03-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
atirado

Por favor edita tu mensaje para cortar la línea del "connection string" ya que ocasiona que el ancho total de tu mensaje y por tanto de todos los demás se haga extremadamente ancho y muy difícil de leer.

En cuanto a tu pregunta no sé a qué se deba. Quizá tenga que ver con la versión de Excel. ¿Qué versión utilizas?

// Saludos
Responder Con Cita
  #10  
Antiguo 30-03-2004
atirado atirado is offline
Miembro
 
Registrado: mar 2004
Posts: 41
Poder: 0
atirado Va por buen camino
Lightbulb

Hola, Román! Sorry a todos, creo que se me fueron las 4 con lo del código, jeje

Respecto al problema, les paso aquí cómo lo solucioné, por si alguien más tiene ese problema:

Mi problema fue, precisamente, haber puesto un ADOTable, pues al querer conectar el DBGrid a dicho componente, era donde me marcaba el dichoso código
Código:
Error de sintáxis en la cláusula FROM
pues no le podía agregar los campos que tomaba el DataSource del archivo de EXCEL.
La solución fue tan simple y sencilla como borrar el ADOTable y conectar el DBGrid directamente al DataSource.
Es decir, sólo me quedé con lo siguiente:
  1. Un TADOConection, enlazado al archivo de Excel por medio de Microsoft Jet OLEDB 4.0 con el valor "Excel 8.0" en Extended Properties de la pestaña "All".
  2. Un TADODataSet con los valores:
    • Connection: adcNomina (el nombre de mi TADOConnection)
    • Command Type: cmdTableDirect
    • Command Text: Nomina$ (Nombre de la HOJA -no del libro- donde están los datos)
  3. Un DataSource con los siguientes valores:
    • DataSet : dsNomina (nombre de mi TADODataSet)
Espero que si alguien tiene un problema parecido, lo pueda resolver
Un enorme saludo a tod@s

Alejandro
Responder Con Cita
  #11  
Antiguo 23-05-2006
AntonioMM AntonioMM is offline
Miembro
 
Registrado: may 2006
Posts: 10
Poder: 0
AntonioMM Va por buen camino
Me falta algo?

Estoy intentando pasar este codigo a un programa.
Todo va de maravilla, pero a la hora de conectar el TADODataSet, la propiedad commandText, me da el siguiente error :
NO SE PUDO ENCONTRAR EL ARCHIVO ISAM INSTALABLE

Alguien me puede asesorar..

Muchas Gracias
Responder Con Cita
  #12  
Antiguo 20-12-2006
Avatar de oracle
oracle oracle is offline
Miembro
 
Registrado: feb 2005
Posts: 99
Poder: 22
oracle Va por buen camino
Saludos amigos:

He seguido los pasos de Roman al pie de la letra y hasta el momento todo bien.

Utilizo un ADOConection, un ADODataSet, un DataSource y un DBGrid. Siguiendo los pasos y adicionando además el DBGrid logro que los datos se muestren en el DBGrid en tiempo de diseño, pero cuando ejecuto el programa, me salé el siguiente error:

Cita:
Projet Project.exe Raised exception class EOLeException with message "Error Catástrofico. Process Stoped used....."
He probado estos pasos tanto en C++ (Borland C++ 6) y en Delphi y en ambos me sale exactamente el mismo error....

En espera de alguna sugerencia....

Saludos
__________________
El único hombre que no se equivoca es el que nunca hace nada.
Responder Con Cita
  #13  
Antiguo 24-12-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Pues el mensaje es bastante genérico como para poder decir algo sensato. Convendría que te fijases en qué línea de código te marca ese error.

// Saludos
Responder Con Cita
  #14  
Antiguo 24-12-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Lo de Error catastrófico lo he vivido también. Busca Updates de delphi.

Di la versión que tienes de delphi y si tienes algún Update pack instalado.

Creo recordar que había problemas al tener instalado C++ y Delphi al mismo tiempo en las versiones 6, tenías que bajar un parche de Borland.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 14:13:44.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi