Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Error al leer celda de libro de Excel (https://www.clubdelphi.com/foros/showthread.php?t=78582)

axel.isr 02-05-2012 00:14:39

Error al leer celda de libro de Excel
 
Estimados,

Me encuentro realizando una aplicación en donde en uno de sus módulos tengo que importar datos de un libro de Excel.

Tengo mi DataModule (DMExcel) con un TExcelApplication, un TExcelWorkbook y un TExcelWorksheet. Cuando conecta con el libro de Excel no me aparece ningún error, el inconveniente surge al querer leer el contenido de una celda del mismo en esta parte:

Código Delphi [-]
DMExcel.Hoja.Cells.Item[Row, 1]
.

En esa parte, me aparece el siguiente error:
Cita:

Project Project1.exe raised exception class EIntfCastError with message 'Interface not supported'...
He estado buscando sobre este error, pero con resultados negativos sólamente...
Algunos datos mas:
Conecto por el BDE con SQL Server 2005 Express Edition, donde tengo mi tabla de stock que es a donde quiero pasar la información.


El código entero:

Código Delphi [-]
procedure TfrmIngresoStock.ConectarExcel(archivo:string);
var
  ok:boolean; row:integer;
begin
 ok:=true;
  try
    try
      ok:=true;
      //Iniciar ExcelApp
      DMExcel.ExcelApp.Connect;
      try
        //Abrir Workbook
        DMExcel.ExcelApp.Workbooks.Open(archivo,emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,
              emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,emptyparam,0  );
        DMExcel.Libro.ConnectTo(DMExcel.ExcelApp.Workbooks[1]);
        //DMExcel.Hoja.ConnectTo(DMExcel.Libro.Worksheets[1] as _worksheet);
      except
      on exception do
      begin
        //No se pudo abrir el archivo de Excel
        ShowMessage('No se ha podido abrir el archivo de Excel');
        ok:=false;
        DMExcel.Libro.Save;
        DMExcel.Libro.Close;
        Abort
      end
      end;
    except
    on exception do
    begin
      ShowMessage('No se ha podido abrir el archivo de Excel');
      ok:=false;
      DMExcel.Libro.Save;
      DMExcel.Libro.Close;
      Abort
    end
    end;
  finally
    if not(ok) then
    begin
      //No se pudo iniciar ExcelApp
      ShowMessage('Error al conectar con Excel.'+#13+'Póngase en contacto con su administrador.');
      DMExcel.Libro.Save;
      DMExcel.Libro.Close;
      Abort
    end
  end
end;

procedure TfrmIngresoStock.ImportarExcel();
var
  row:integer; ok:boolean;
begin
  ok:=true;
  try
    //Abrir tablas
    try
      DataModule1.tStock.Open;
      DataModule1.tProductos.Open;
      row:=2; //Empieza de la segunda fila

      while DMExcel.Hoja.Cells.Item[Row, 1] <> '' do
      begin
        DataModule1.tStock.Append;
        DataModule1.tStockCodProducto.Value := DMExcel.Hoja.Cells.Item[Row, 1];
        DataModule1.tStockIMEI.Value        := DMExcel.Hoja.Cells.Item[Row, 2];
        DataModule1.tStockEstado.Value      := 0;
        DataModule1.tStockF_alta.Value      := DateToStr(Today);
        DataModule1.tStock.Post;
        row:=row+1;
      end;

    except
      on exception do
      begin
        MessageBox(0,'No se ha podido conectar con la base de datos.','Error',MB_ICONWARNING);
        ok:=false;
        Abort
      end
    end; //Cierra segundo try
  finally
  begin
    if ok then
      MessageBox(0,'Datos importados correctamente','ImportData',MB_ICONINFORMATION)
    else
    begin
      MessageBox(0,'No se pudieron importar datos','Error',MB_ICONWARNING);
      Abort
    end;

    //Cierra Libro, App y tablas
    DMExcel.Libro.Save;
    DMExcel.Libro.Close;
    DMExcel.ExcelApp.Quit;
    DMExcel.ExcelApp.Disconnect;

    DataModule1.tStock.Close;
    DataModule1.tProductos.Close;
  end
end
end;

procedure TfrmIngresoStock.Button2Click(Sender: TObject);
begin
  if edtPath.Text <> '' then
  begin
    ConectarExcel(edtPath.Text);
    ImportarExcel;
  end
end;


Desde ya, les agradezco por su ayuda.
Saludos,
Axel.

kapcomx 02-05-2012 01:20:20

raro...
 
Amigo axel he hecho algunas importaciones de Excel y nunca he tenido problemas, te dejo un ejemplo donde paso el contenido de una hoja excel a un stringgrid a ver si te sirve..


Código Delphi [-]
 
procedure Tformma.abrirClick(Sender: TObject);
var
   i: integer;
begin
abrir.Execute ;
nombre:=abrir.FileName ;
  IF nombre='' THEN
 begin
 SHOWMESSAGE('NO SELECCIONO NINGUN ARCHIVO')  ;  
 end
 ELSE
 BEGIN
  Excelapplication1.Workbooks.Open(nombre,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,Empty  Param,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,0);
  Hoja := Excelapplication1.Worksheets.Item[1] as _WorkSheet;
   i := 1;
   si :='1';
     for I := 1 to Stringgrid1.RowCount - 1 do
     Stringgrid1.Rows[i].Clear;
     stringgrid1.ColCount:=20;
     stringgrid1.RowCount:=1000;
   //*****
    with StringGrid1 do
     begin
       // Título de las columnas
        Cells[0, 0] := '' ;
        Cells[1, 0] := 'A' ;
        Cells[2, 0] := 'B' ;
        Cells[3, 0] := 'C' ;
        Cells[4, 0] := 'D' ;
        Cells[5, 0] := 'E' ;
        Cells[6, 0] := 'F' ;
        Cells[7, 0] := 'G' ;
        Cells[8, 0] := 'H' ;
        Cells[9, 0] := 'I' ;
        Cells[10, 0] := 'J' ;
        Cells[11, 0] := 'K' ;
        Cells[12, 0] := 'L' ;
        Cells[13, 0] := 'M' ;
        Cells[14, 0] := 'N' ;
        Cells[0,1] := '1' ;

        for i:=1 to 1000 do
        begin
           si := IntToStr(i);
           Cells[0,I] := SI;
           Cells[1,i] := Hoja.Range['a'+si,'a'+si].Value2;
           Cells[2,i] := Hoja.Range['b'+si,'b'+si].Value2;
           Cells[3,i] := Hoja.Range['c'+si,'c'+si].Value2;
           Cells[4,i] := Hoja.Range['d'+si,'d'+si].Value2;
           Cells[5,i] := Hoja.Range['e'+si,'e'+si].Value2;
           Cells[6,i] := Hoja.Range['f'+si,'f'+si].Value2;
           Cells[7,i] := Hoja.Range['g'+si,'g'+si].Value2;
           Cells[8,i] := Hoja.Range['h'+si,'h'+si].Value2;
           Cells[9,i] := Hoja.Range['i'+si,'i'+si].Value2;
           Cells[10,i] := Hoja.Range['j'+si,'j'+si].Value2;
           Cells[11,i] := Hoja.Range['k'+si,'k'+si].Value2;
           Cells[12,i] := Hoja.Range['l'+si,'l'+si].Value2;
           Cells[13,i] := Hoja.Range['m'+si,'m'+si].Value2;
 
            // VarType( Excelapplication1.Range['c'+si,'c'+si].Value2 ) = VarEmpty
        end;
        end;
 
end;
         StringGrid1.Visible :=True;
end;










Saludos... :cool:

axel.isr 02-05-2012 17:24:08

Pensándolo bien, ahora se me ocurre que el error puede ser debido a que el exe se encuentra en una pc dentro de mi red. Y yo lo estoy ejecutando en mi máquina, donde selecciono un archivo que se encuentra en mi máquina.
Intentaré seleccionando algún archivo dentro de la misma pc donde esta el exe para ver si se soluciona. Ya que a mi también me parece muy raro porque este mismo procedimiento ya lo he utilizado en otra aplicación sin ningún tipo de problemas.

Por otro lado... no termino de comprender el stringrid... Con tu procedimiento, se pasan los datos del excel al string grid, cierto? Y si no me equivoco, luego tendria que pasar los datos del stringgrid a la base de datos, no?

Desde ya, te agradezco por tu colaboración.

axel.isr 02-05-2012 22:07:29

No me golpeen! Soy tan solo un noob :(

Bueno... el error surgía ya que jamás conectaba la hoja de Excel al fichero ya que tenía la siguiente línea comentada :P

Código Delphi [-]
//DMExcel.Hoja.ConnectTo(DMExcel.Libro.Worksheets[1] as _worksheet);

Desde ya, muchas gracias por tu ayuda kapcomx.
Saludos!

kapcomx 02-05-2012 23:52:54

error
 
amigo Axel, bien por que solucionaste tu error, no eres el unico que le pasa a mi me ha pasado tambien que tareas que crees tener dominadas, se te pasan y te hacen darte de topes un buen rato jejejeje :cool:


La franja horaria es GMT +2. Ahora son las 21:25:18.

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