Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Exportar de delphi a un libro de exel (https://www.clubdelphi.com/foros/showthread.php?t=33345)

zvf 04-07-2006 17:45:40

Exportar de delphi a un libro de exel
 
HOLA A TODOS!!!

Con delphi, quiero crear un archivo que pueda ser abierto con exel correctamente, dividido por hojas, celdas y demas (claro en donde yo le indique).

Pero, como puedo hacerlo?

nemesio 04-07-2006 20:48:04

Revisa este truco:http://www.clubdelphi.com/trucos/ind...ll=0&scrollb=0

zvf 04-07-2006 23:19:00

MUCHAS GRACIAS!!!
Voy a revisarlo, y si tienen alguna otra sugerencia se los agradeceria mucho, porque creo que el truco solo sirve para crear una hoja, no un libro ¿o me equivoco? :confused:

zvf 05-07-2006 20:15:37

HOLA!!!!
Estoy checando el truco que me sugeriste, solo que no entiendo algunas partes porque no esta comentado. Lo intento correr y me marca algunos errores como:
- coinitialize y alltrim no esta inicializado
- if pos('/', alltrim(cells[i, linea - 1])) <> 0 then begin //aqui marca que los tipos son incompatibles


Código Delphi [-]
procedure ExportaExcel(pStringGrid : TstringGrid; c0,r0,c1,r1 : Integer);
var ExLin, ExCol, i, Linea, AuxInteger : Integer;
    AuxFloat : Double;
    AuxFecha : tDatetime;
    c : TCursor;
    Excel, ExcelDoc, WS : Variant;
begin
  c             := Screen.Cursor;
  Screen.Cursor := crHourGlass;
  with pStringGrid do begin
    try
      coinitialize(nil);
      Excel         := CreateOleObject('Excel.Application');
      ExcelDoc      := Excel.Workbooks.Add;
      WS            := ExcelDoc.ActiveSheet;
      Excel.Visible := true;
      ExCol         := 0;
      for i := c0 to c1 do begin
        inc(ExCol);
        ws.Cells.Item[1, ExCol]:= cells[i, 0];
      end;
      for linea := r0 to r1 do begin
        inc(ExLin);
        ExCol := 0;
        for i := c0 to c1 do begin
          inc(ExCol);
          try
            try
              if pos('/', alltrim(cells[i, linea - 1])) <> 0 then begin
                AuxFecha := strtodatetime(alltrim(cells[i, linea - 1]));
                ws.Cells.Item[ExLin, ExCol] := AuxFecha;
              end
              else AuxFecha := strtodatetime('GENERA EXCEPCION');
            except
              try
                AuxInteger := strtoint(alltrim(cells[i,linea-1]));
                ws.Cells.Item[ExLin,ExCol]:= AuxInteger;
              except
                try
                  AuxFloat := strtofloat(alltrim(cells[i,linea-1]));
                  ws.Cells.Item[ExLin,ExCol]:= AuxFloat;
                except
                  ws.Cells.Item[ExLin,ExCol]:= cells[i,linea-1];
                end;
              end;
            end;
          except end;
        end;
      end;
      ws.cells.entirecolumn.autofit;
    finally
      screen.Cursor := c;
    end;
  end;
end;


Código Delphi [-]
procedure ExportaExcel (pStringGrid : TstringGrid; c0,r0,c1,r1 : Integer);

Código Delphi [-]
ExportaExcel(StringGrid1, 0, StringGrid1.ColCount-1, 0, StringGrid1.RowCount-1);

No se si lo este mandando llamar bien o me equivoque en algo. O si me falta agregar alguna unit.

GRACIAS POR SU AYUDA!!!!!!!!

Bicho 06-07-2006 09:44:23

Hola, soy el autor del truco. Te pido disculpas tanto a tí como a todos los del foro y que han podido usar el truco, que seguro que no les ha funcionado. Para que la función coinitialize funcione hay que añadir al uses ActiveX, y la función Alltrim la he quitado ya que es una función propia de mi trabajo y la suelo usar para mis programas, pero básicamente consiste en quitarle todos los espacios que contenga el string que se le pasa por parámetro, tanto a la izquierda, derecha o en cualquier posición del string.

Ya he modificado el truco y espero que ahora os funcione.

Nuevamente pido disculpas por las molestias ocasionadas.

Saludos

aledieb 07-07-2006 18:46:31

Para reemplazar la función alltrim se puede utilizar la función TRIM de delphi que esta en SysUtils.

zvf 12-07-2006 19:29:55

Gracias a su ayuda, ya tengo claro como exportar los datos a una hoja de exel. Pero me queda una duda:
¿Como puedo decirle en que hoja lo ponga?, es decir si quiero que algunos datos los ponga en la hoja1 y otros en la hoja2 y asi sucesivamente.
Hasta ahorita tengo el siguiente codigo, que solamente me inserta todos los datos del stringGrid en la hoja1.


Código Delphi [-]
procedure TForm1.ExportaExcel(const StringGrid1 : TstringGrid; const c0,r0,c1,r1 : Integer);
var i, Linea : Integer;
    c : TCursor;
    Excel, ExcelDoc, WS : Variant;
begin
  c             := Screen.Cursor;
  Screen.Cursor := crHourGlass;
  with StringGrid1 do begin
    try
      coinitialize(nil);
      Excel         := CreateOleObject('Excel.Application');
      ExcelDoc      := Excel.Workbooks.Add;
      WS            := ExcelDoc.ActiveSheet;
      Excel.Visible := true;
      for linea:=r0 to r1 do begin
       for i := c0 to c1 do begin
        ws.Cells.Item[linea+1, i+1]:= cells[i, linea];
       end;
      end;
      ws.cells.entirecolumn.autofit;
    finally
      screen.Cursor := c;
    end;
  end;
end;

¿Que me faltaria agregarle para lograr lo que quiero?

kuan-yiu 13-07-2006 13:40:38

Código Delphi [-]
  ExcelDoc.workbooks[1].worksheets[hoja].Activate;
Donde "hoja" es el número de hoja de excel en el que quieres escribir.

Código Delphi [-]
  ExcelDoc.workbooks[1].worksheets[hoja].name := 'miNombre';
Y así si le quieres cambiar el nombre a la hoja, para que ponga otro en lugar del "hoja1" que pone por defecto.

kuan-yiu 13-07-2006 13:55:26

A ver, que creo que me he liado con los nombres de las variables. Es que yo genero un documento con múltiples hojas y parte del código no es mío, así que me lío un poco.
Código Delphi [-]
  ExcelApp,      // Excel application
  WorkBook,      // Excel workbook
  WorkSheet: Variant ; // Excel sheet in workbook
Código Delphi [-]
  // Inicializo variables.
// ...

  // Creo la instancia de Excel
      try
        ExcelApp := CreateOLEObject('Excel.Application') ;
      except
        MessageDLG('Imposible iniciar Excel',mtError,[mbOK],0) ;
        Raise ;
      end ;
      {$IFDEF IAMDEBUGGING}
      ExcelApp.Visible := True ;
      {$ENDIF}
      ExcelApp.WorkBooks.Add;

  // Ahora le añado tantas hojas como necesite.
// ...

  // Esto va dentro de un bucle porque proceso cada hoja de forma consecutiva
          ExcelApp.workbooks[1].worksheets[hoja].Activate;
          ExcelApp.workbooks[1].worksheets[hoja].name := nombre;
          WorkBook := ExcelApp.ActiveWorkBook ;   // Get the active workbook
          WorkSheet := WorkBook.ActiveSheet;      // Get the active sheet

  // Ahora relleno la hoja actual e incremento los contadores.
// ...

zvf 13-07-2006 17:48:09

Muchas gracias por tu ayuda!!!

Voy a probarlo y les vuelvo a molestar con mis dudas por aqui al rato.

GRACIAS POR SU TIEMPO!!!!!!!! :)

zvf 13-07-2006 18:31:48

GRACIAS, GRACIAS, GRACIAS !!!!

Ya lo probe y funciona de maravilla, gracias por su tiempo y por compartir sus conocimientos.

Gracias a todos!!!

zvf 13-07-2006 19:16:27

Por último, en donde puedo encontrar documentacion sobre los metodos, funciones y propiedades que se utilizan para abrir y trabajar con documentos en excel?

Gracias !!!

kuan-yiu 13-07-2006 19:27:17

Cita:

Empezado por zvf
Por último, en donde puedo encontrar documentacion sobre los metodos, funciones y propiedades que se utilizan para abrir y trabajar con documentos en excel?

¿?... Si te refieres para hacerlo desde Delphi puedes buscar en este mismo foro, hay varios mensajes en los que se referencian una serie de páginas que a mi me resultaron muy útiles.
Si te refieres al uso de excel puedes encontrarlo en casi cualquier biblioteca pública :D


La franja horaria es GMT +2. Ahora son las 20:20:39.

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