Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Consejo sobre excel (https://www.clubdelphi.com/foros/showthread.php?t=74678)

CFPA86 04-07-2011 17:23:34

Consejo sobre excel
 
Hola amigos foristas, tengo un programa al cual le deseo IMPORTAR datos de un archivo de excel, el cual tiene dos hojas, recurro a ustedes para que me orienten como debo de hacerlo.
Chao

newtron 04-07-2011 17:37:40

Hola.

Aquí llevas un ejemplo.

Código Delphi [-]
procedure TFormImportaExcel.NTButton1Click(Sender: TObject);
var
  appExcel : Variant;
  N, Hoja : SmallInt;
  contenido : String;
begin
  appExcel := CreateOleObject('Excel.Application');
  appExcel.WorkBooks.Open('C:\ARCHIVO.XLS');
  Hoja:=1;
  N:=0;
  while true do begin
    Inc(N);
    Contenido := appExcel.WorkBooks[1].Worksheets[Hoja].Cells[N,1];
    if Contenido='' then break
  end;
  appExcel.Quit;
  appExcel := Unassigned;
end;

Espero que te sirva.
Saludos

CFPA86 04-07-2011 20:35:55

Gracias Newtron por el codigo, pero en el formulario o en el programa que debo de hacer para aplicar este codigo, que se es de mucha ayuda.
Chao

newtron 05-07-2011 08:42:13

A ver.

Si le echas un vistazo al código verás que se abre el archivo excel y lo va recorriendo linea por linea poniendo en la variable "contenido" el valor de la primera celda de la hoja número 1 hasta que se encuentra un valor vacío que se interpreta como el final de la hoja. Lo que debes de hacer es abrir tu tabla e ir añadiendo registros y asignando los campos de la hoja excel a los campos del registro que quieras insertar.

Saludos

CFPA86 06-07-2011 18:38:28

Que pena con todos ustedes, pero nuevamente les dijo no se como aplicar este codigo, entiendo lo que dice pero no se como o por medio de que componente(s) usarlo en el formulario, en esto de la importacion y exportacion de datos soy nuevo, nunca lo he realizado en mis aplicaciones. Es por esto que les pido nuevamente ayuda.
Gracias

newtron 08-07-2011 08:47:31

A ver.... empezamos desde el principio. Dices que tienes un programa, imagino que en tu programa abrirás la base de datos, insertarás registros, etc, ¿no?. ¿Qué base de datos usas? ¿de escritorio? ¿cliente/servidor? ¿qué componentes?.

CFPA86 08-07-2011 18:39:49

Correcto Newtron, en mi programa creo, inserto y modifico registros de una b.d. (paradox 7), hasta aca todo va bien, leyendo me he enterado de los componentes ado que hacen lo que requiero insertar datos de excel. ahi esta el problema no se como usarlos.
Gracias.

newtron 09-07-2011 09:12:05

No necesitas usar ado para esto, puedes usar el componente ttable e ir añadiendo registros de forma normal.

Código Delphi [-]
procedure TFormImportaExcel.NTButton1Click(Sender: TObject);
var
   appExcel : Variant;
   N, Hoja : SmallInt;
   contenido : String;
   begin
   appExcel := CreateOleObject('Excel.Application');
   appExcel.WorkBooks.Open('C:\ARCHIVO.XLS');
   Hoja:=1;
   N:=0;
   while true do begin
    if Contenido='' then break     Tabla.append;
    Inc(N);     Contenido := appExcel.WorkBooks[1].Worksheets[Hoja].Cells[N,1]; //codigo
    Tabla.FieldByname('CODIGO').AsString:=Contenido;
    Contenido := appExcel.WorkBooks[1].Worksheets[Hoja].Cells[N,2]; //Nombre
    Tabla.FieldByname('NOMBRE').AsString:=Contenido;
    // y así tantos campos como tengas por cada registro 
    Tabla.post;
   end;
   appExcel.Quit;
   appExcel := Unassigned;
 end;

CFPA86 11-07-2011 18:09:29

Les quiero agradecer a todos y especialmente a Newtron, fue de gran ayuda tus codigos, logre resolver mi problema, respecto a el codigo (ultimo) use la libreria ComObj (no sabia) ademas las instrucciones dentro del ciclo.
if Contenido = '' then
break;
Las coloque al final del mismo ciclo, lo expreso para referencias futuras de otros usuarios.
Reitero mis agradecimientos a todos.
Chao

alej.villa 19-07-2011 16:25:31

yo tengo un problema parecido con excel pero es mas complicado porque los datos que estan en la hoja no tienen una secuencia sino que son datos que los arroja un query de otro programa y me lo manda a excel de una manera desordenada, como puediera hacer para seleccionar solo los datos que necesito e irlos guardando en mi base de datos, Utilizo delphi 7 y motor de base MS SQL Server 2005

newtron 19-07-2011 18:11:31

Si los tienes en una query es como si estuvieran en una tabla, ¿no?, es cuestión de que los vayas cogiendo de un sitio e ir poniendolos en otro. No llego a entender el problema que comentas.

alej.villa 19-07-2011 18:26:34

he aqui el problema, los datos me los exportan desde otro programa que yo no estoy desarrollando (el programa que los exporta es macpac o algo asi) me los pasa a excel de una manera inentendible para poderlos importar a mi base de datos que esta enlazada con el programa que estoy desarrollando fijate [IMG]file:///C:/Documents%20and%20Settings/Jos%C3%A9%20Villarroel/Escritorio/Dibujo.JPG[/IMG]

alej.villa 19-07-2011 18:35:35

hay muchos espacios en blanco entre las columnas y luego siguen datos, por ejemplo
columna A | Columna B | Columna C |
L31 | | 10000 |
| 2 | 10000 |
| 2 | 10000 |
| 1 | 10000 |
L17 | | 20000 |
| 1 | 20000 |
| 1 | 20000 |

Y asi sucesivamente hasta tener 37000 registros los cuales debo ingresarlos a la base datos pero solo los datos que necesite para mi programa

alej.villa 19-07-2011 18:36:58

nose como subir una imagen para que veas mejor la problematica existente, si sabes como puedo montar una imagen seria estupendo asi entenderias mejor

Gracias!

newtron 19-07-2011 18:59:56

Pero yo pregunto, ¿los datos los tienes en una sola cadena o tienes un campo del query para cada campo de datos?

alej.villa 19-07-2011 20:12:05

Supongo que el query tiene campos para cada campo de datos, lo que pasa es que no puedo ver el codigo fuente de ese programa, te recuerdo que ese programa ya esta implementado y es una herramienta del programa que permite hacer un filtrado de datos para exportarlos a excel

mRoman 31-07-2011 04:58:42

Cita:

Empezado por alej.villa (Mensaje 406841)
Supongo que el query tiene campos para cada campo de datos, lo que pasa es que no puedo ver el codigo fuente de ese programa, te recuerdo que ese programa ya esta implementado y es una herramienta del programa que permite hacer un filtrado de datos para exportarlos a excel

Que tal Alej.villa

Mira parece ser que con la información que nos brindas no te podemos ayudar demasiado. Dejame si entiendo algo.

Tu quieres IMPORTAR algunos datos del archivo XLS que te genera el otro sistema, bien yo he exportado datos a archivos XLS usando un componente llamado TXLSExportFile. Lo que no he hecho es IMPORTAR desde un archivo de Excel a mi aplicación, pero lo que si hago es lo siguiente:

Uso plantillas de Excel y desde Delphi descargo los datos en el archivo XLS, el cual ya tiene un formato predefinido....bordes, negritas, tamaño de la fuente, etc. y lo grabo con otro nombre....talvez algo asi te pueda servir haciendo esto mismo pero al reves....

te paso algo de codigo.

Código Delphi [-]
procedure TfrmOpNumeralia.BitBtn1Click(Sender: TObject);
var
   XLS : TXLSFile;
   Libro, Excel:VAriant;
   cArchivo:String;
   nHoja,I,J,nCont,Lin,nBloque:Integer;
   Archivos_SQL:Array[0..13] of string;
begin
    Archivos_SQL[0] :=ExtractFilePath(Application.ExeName)+'\SQLS\num_lec_mas_venden_sub.sql';
En el codigo anterior declaro XLS como TXLSFile....

El el siguiente inicializo la variable XLS y le creo la clase
Código Delphi [-]
    if Application.MessageBox('Confirma la ejecucion del proceso','Confirmacion',mb_OkCancel+mb_IconQuestion)=idOk then
    begin
         nBloque:=0;
         XLS:=TXLSFile.Create;

Y aqui abro la plantilla de Excel e inicializo la variable nHoja a 0, ya que esta me servira para ir brincando las hojas del archivo de excel y vaciar datos.
Código Delphi [-]
         XLS.OpenFile(ExtractFilePath(Application.ExeName)+'\Plantillas\Numeralia_2010.xlt');
         nHoja:=0;

Un ejemplo de como vaciar datos a las celdas.
Código Delphi [-]
         xls.Workbook.Sheets[nHoja].Cells[3,0].Value:='Numeralia:'+cbxMes.Items[cbxMes.itemindex]+' '+mskAnio.Text;
         xls.Workbook.Sheets[nHoja].Cells[1,0].Value:=qryPAS.fieldbyname('descripcion').AsString;

Y despues lleno el archivo de Excel con un Query...componente TQuery

Código Delphi [-]
         For i:=0 to J do
         begin
              qryDatos.SQL.LoadFromFile(Archivos_SQL[i]);
              qryDatos.Close;
              qryDatos.ParamByName('MES').AsInteger:=cbxMes.ItemIndex+1;
              qryDatos.ParamByName('ANIO').AsString:=mskAnio.Text;
              qryDatos.Open;
              qryDatos.First;
              While not(qryDatos.Eof) do
              begin
                   With xls.Workbook.Sheets[nHoja] do
                   begin
                      Cells[Lin,1].Value := qryDatos.FieldByName('LECHER').AsInteger;
                      Cells[Lin,2].Value := qryDatos.FieldByName('NOMBRELECH').AsString;
                      Cells[Lin,3].Value := qryDatos.FieldByName('CANTIDAD').AsFloat;
                      Lin:=Lin+1;
                      pBar.Position:=pBar.Position+pBar.Step;
                      qryDatos.Next;
                   end;
              end;
              Lin:=Lin+4;
              nBloque:=nBloque+1;
              if nBloque=4 then
              begin
                 nHoja:=nHoja+1;
                 Lin:=8;
                 nBloque:=0;
              end;
         end;

Espero haberte ayudado.:)

alej.villa 02-08-2011 22:27:16

hola mRoman gracias por el codigo enviado pero mi problema esta en que tengo un archivo de excel con muchos datos que necesito y otros datos basura (por asi llamarlo) el otro detalle es que tengo muchos campos en blanco entre los datos que necesito importar a mi sistema, quizas puedas decirme como hago para montar una imagen en el foro para que lo veas https://dl-web.dropbox.com/get/Foro/...JPG?w=b1802d31

mRoman 03-08-2011 21:07:44

Cita:

Empezado por alej.villa (Mensaje 408265)
hola mRoman gracias por el codigo enviado pero mi problema esta en que tengo un archivo de excel con muchos datos que necesito y otros datos basura (por asi llamarlo) el otro detalle es que tengo muchos campos en blanco entre los datos que necesito importar a mi sistema, quizas puedas decirme como hago para montar una imagen en el foro para que lo veas https://dl-web.dropbox.com/get/Foro/...JPG?w=b1802d31

Bueno nunca he puesto una imagen en el foro,pero vamos haciendo una prueba. En la parte final de cada comentario, del lado derecho, aparece un botòn que dice "Cita" ahi le di click.

Deja hago una prueba......

Fiajete que por aqui es muy complicado....sobre todo por el tamaño....no sè si por FTP del foro se pueda.

Algun moderador que nos pudiera auxiliar....

mRoman 03-08-2011 21:10:59

Hice una prueba por FTP....y se subio la imagen....solo que acepta archivos ZIP y RAR...
Checalo !!...envie una imagen de prueba....

Prometo quitarla despues de algunos dias....


La franja horaria es GMT +2. Ahora son las 07:18:42.

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