Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ayuda Importando Excel (https://www.clubdelphi.com/foros/showthread.php?t=68668)

Chewitta 28-06-2010 18:54:15

Ayuda Importando Excel
 
Hola...

Tendo una duda estoy importando un archivo de excel a firebird pero cuando me quiero cambiar de hoja, me marca error en el metodo Activate de la clase Range, el codigo q estoy usando es el siguiente:

Código Delphi [-]
  if EdtContacto.Text <> '' then
  begin
    if not FileExists(EdtContacto.Text) then
    begin
      Application.MessageBox(pchar(format('Error 001: No se encontró el archivo %s.'#13'Capture un archivo válido y vuelva a intentarlo.', [EdtContacto.Text])), pchar(self.Caption), MB_OK + MB_ICONERROR);
      EdtContacto.SetFocus;
      Exit;
    end;
  end;
  memLog.Lines.Add('Inicio de lectura de archivo de Prensa...');


  try

    Excel := CreateOleObject('Excel.Application');
    Excel.Workbooks.Open(EdtContacto.Text);

    Sheet := Excel.Workbooks[ExtractFileName(EdtContacto.Text)].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;

    CdsPrensa:=Tclientdataset.create(nil);

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

        if i = 1 then
        begin
          campoLetras:=TStringField.Create(self);

          with campoLetras do
          begin
            FieldName:=RangoMatriz[i,j];
            DataSet:=CdsPrensa;

            if j = CantCol  then
            begin
              CdsPrensa.Close;
              CdsPrensa.CreateDataSet;
            end;
          end;

        end
        else
        begin
          if i <> o then
            CdsPrensa.Append;
          CdsPrensa.Fields.Fields[j-1].AsString  :=RangoMatriz[i,j];
        end;
        o:= i;
      end;
    end;//for
    
    CdsPrensa.Post;
    dtsPrensa.DataSet:=CdsPrensa;
    aView.DataController.Filter.Clear;
    aView.DataController.DataSource := dtsPrensa;
    aview.BeginUpdate;
    RemoveAllColumns(aView);
    aView.DataController.CreateAllItems;
    aView.EndUpdate;
    memLog.Lines.Add('Termino la carga de Televisión...');

{$ENDREGION}

  memLog.Lines.Add('Inicio de lectura de archivo de Televisión...');

  try
    Excel := CreateOleObject('Excel.Application');
    Excel.Workbooks.Open(EdtContacto.Text);

    Sheet := Excel.Workbooks[ExtractFileName(EdtContacto.Text)].WorkSheets[2];
    Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate; "Aqui me marca el error"

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

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

    Cdstele:=Tclientdataset.create(nil);

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

        if i = 1 then
        begin
          campoLetras:=TStringField.Create(self);

          with campoLetras do
          begin
            FieldName:=RangoMatriz[i,j];
            DataSet:=CdsTele;

            if j = CantCol  then
            begin
              cdsTele.Close;
              cdsTele.CreateDataSet;
            end;
          end;

        end
        else
        begin
          if i <> o then
            cdsTele.Append;
          cdsTele.Fields.Fields[j-1].AsString  :=RangoMatriz[i,j];
        end;
        o:= i;
      end;
    end;//for

    cdsTele.Post;
    dtsTelevision.DataSet:=cdsTele;
    aViewTv.DataController.Filter.Clear;
    aViewTv.DataController.DataSource := dtsTelevision;
    aviewTv.BeginUpdate;
    RemoveAllColumns(aViewTv);
    aViewTv.DataController.CreateAllItems;
    aViewTv.EndUpdate;


  finally
    memLog.Lines.Add('Termino la carga de Televisión...');
    Excel.Quit;
end;

Les agradezco de antemano su ayuda... pasa la informacion de la primera hoja sin problema y al querer cargar la informacion de la segunda hoja me salta ese error...

Caro 28-06-2010 20:36:42

Hola Chewitta, por favor utiliza las etiquetas [ delphi] [ /delphi] para que tu codigo se entienda mejor. Sobre tu pregunta, prueba de esta forma.

Código Delphi [-]

Book : OLEVariant;
..............................................
try

    Excel := CreateOleObject('Excel.Application');
    Book := Excel.Workbooks.Open(EdtContacto.Text);

    Sheet := Book.WorkSheets[1]; 
    Sheet.Activate;

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

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

    ......................................................
    .........................................................
  try
    //Si es sobre el mismo documento, estas dos lineas estan demas 
    //Excel := CreateOleObject('Excel.Application');
    //Excel.Workbooks.Open(EdtContacto.Text);

    Sheet := Book.WorkSheets[2]; 
    Sheet.Activate;
    
    CantRow := Excel.ActiveCell.Row;
    CantCol := Excel.ActiveCell.Column;

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

    Cdstele:=Tclientdataset.create(nil);

    for i:=1 to CantRow do
    begin
    ....................................................
    ....................................................


Saluditos

Chewitta 28-06-2010 23:18:49

Muchas gracias por contestar caro..

ya cambie el codigo, solamente q no ma trae el rango, ya que en el cantRow, y CantCol, me lo toma con valor de 1 en los 2 campos???


y pues me pone error de argumento...

Caro 29-06-2010 16:12:00

Cita:

Empezado por Chewitta (Mensaje 368583)
ya cambie el codigo, solamente q no ma trae el rango, ya que en el cantRow, y CantCol, me lo toma con valor de 1 en los 2 campos???

Hola de nuevo, puedes hacer un ejemplo solo con la parte de importar a excel y el documento con el que estas probando y lo subes, así podremos ver mejor donde esta el error.

Saluditos

Chewitta 29-06-2010 17:00:17

Hola... caro

gracias por responder pero ya encontre lo que tenia mal... en el archivo de excel tengo q dejarlo en el ultimo registro para que me traiga el rango de la informacion. y ya me funciono.. de antemano gracias...

Chewitta 29-06-2010 17:00:52

Hola !!! caro

gracias por responder pero ya encontre lo que tenia mal... en el archivo de excel tengo q dejarlo en el ultimo registro para que me traiga el rango de la informacion. y ya me funciono..

Chewitta 29-06-2010 17:02:19

Hola! caro


agradezco la atencion y ya encontre mi error el archivo de excel, debo dejarlo en el ultimo registro para que me tome el rango...


de antemano gracias por todo... son super

emeceuy 08-08-2012 06:13:27

Hola como estan !

Una consulta, puedo trabajar leyendo o escribiendo archivos de Excel.

El problema que tengo está en la lectura. Puedo leer todo ok, pero el problema está en que el archivo que leo queda como abierto, y luego si intento abrirlo por fuera del programa me dice solo lectura, etc, etc, y tengo que terminar cerrando el proceso desde el administrador de tareas.

Me he dado cuenta que en mi programa no he colocado Excel.Quit. Pero cuando coloco esto me da el siguiente error: "Variant does not reference an automation object.".

Que estoy haciendo mal?

PD: utilizo Windows XP y Delphi 6, y tengo Office 2007 instalado.

Muchas gracias desde ya! Saludos. Marcelo.

roman 08-08-2012 08:40:49

¿Puedes poner un resumen del código que utilizas para abrir y leer el archivo? Por ejemplo, ¿dónde declaras el variant, cómo abres el archivo?

// Saludos


La franja horaria es GMT +2. Ahora son las 08:23:29.

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