Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Servers (https://www.clubdelphi.com/foros/forumdisplay.php?f=9)
-   -   Exportar a excel (https://www.clubdelphi.com/foros/showthread.php?t=32736)

raf.rsr 14-06-2006 23:46:41

Exportar a excel
 
Hola,

Llevo un buen rato buscando y después de ver varias soluciones y probar con algunos componentes, he decidido preguntar:confused:. Quiero saber como se puede exportar a un archivo excel (sin necesidad de tener el excel en la pc) . Lo que quiero es exportar unos datos que estan en una base de datos para un archivo excel, pero esto no es lo más complicado, ya que lo logre hacer con un componente (Firesoft), pero que este archivo tiene que tener un formato especificio, con un encabezado de varias lienas(Bastante grandecito) y colores....algo que este componente no me permite

Muchas gracias por su atención....:)

Neftali [Germán.Estévez] 15-06-2006 11:55:18

¿Te sirve exportar a archivo separado por comas (CSV)? Si le colocas extensión CSV se abre con Excel sin problemas.

Haz la prueba:
Escribe en un archivo de texto lo siguiente:

1;2;3;4;5;6
Marcos;David;Emilio;Julián;Judit;Claudia


Grábalo con extensión .CSV y podrás abrilo desde excel sin problemas.

raf.rsr 15-06-2006 16:53:23

Neftali ya lo intente de esa forma:(, de hecho creo que es practicamente eso lo que hace el componente (Firesoft). Pero no me sirve ya que los datos que tengo que llenar tienen que tener cierto formato, y la exportacion a archivos CSV no le dan formato. Para explicarme mejor, el archivo excel resultado tiene que tener un encabezado con varias lineas de texto centradas con colores etc, luego vienen todos los datos de la base de datos, y los encabezados de columnas tambien tienen que tener formato...:confused:

Muchas Gracias por la ayuda

Neftali [Germán.Estévez] 15-06-2006 17:53:23

Cita:

Empezado por raf.rsr
...ya que los datos que tengo que llenar tienen que tener cierto formato

En ese caso, como bien dices no sirve.
He leído (seguro) sobre unos componentes para exportar a Excel, que no necesitan Excel; El problema es que no los recuerdo, pero si los buscas al final seguro que los encuentras. Lo que no se si permitirán realizar lo que necesitas.
Si recuerdo el nombre te lo escribiré.

delphi.com.ar 15-06-2006 17:57:36

Cita:

Empezado por raf.rsr
Llevo un buen rato buscando y después de ver varias soluciones y probar con algunos componentes, he decidido preguntar:confused:. Quiero saber como se puede exportar a un archivo excel (sin necesidad de tener el excel en la pc) . Lo que quiero es exportar unos datos que estan en una base de datos para un archivo excel, pero esto no es lo más complicado, ya que lo logre hacer con un componente (Firesoft), pero que este archivo tiene que tener un formato especificio, con un encabezado de varias lienas(Bastante grandecito) y colores....algo que este componente no me permite

Hola raf.rsr, te comento que el componente al que haces referencia es de mi autoría, y hace poco abrí los fuentes (expsuitsrc.zip). Puedes ver el código y verás que internamente la clase TDataToXLS utiliza otra clase llamada TBiffFile, precisamente esta clase esta separada para poder crear un archivo Excel sin el formato que impone TDataToXLS, puedes crear algo totalmente personalizado, con los formatos de un BIFF5 (Como en las versiones viejas de Excel).
Podrás ver que el diseño de la clase es algo arcaico, ya que esta programada para compilar en todas las versiones de Delphi, se aceptan sugerencias! :p

PD: Excepto lo de agregar filas antes de los datos, el resto puedes cambiar el formato con el TDataToXLS

Saludos!

rrf 13-03-2010 20:10:55

1 Archivos Adjunto(s)
Hola.

Reabro este hilo porque he encontrado una información de lo más interesante en los recursos que hay disponibles de Borland/Embarcadero: Creating excel file without OLE. Y me gustaría compartir esa información por si le resulta útil a alguien.

Son unos pocos procedimientos que permiten crear directamente hojas de cálculo Excel.

Parece tan poco (el código) que pensé que no funcionaría, pero lo hace bien.

Lo he adaptado un poco y lo adjunto con un ejemplo, como fichero para descargar.

Bueno, quizás el formato de la hoja de cálculo que se crea sea antíguo (el artículo tiene fecha de 1999), pero parece funcionar bien. Lo he probado con OpenOffice Calc y no daba problemas.

Una ventaja que me parece muy interesante es que no hay que añadir ningún componente. Lo hace todo por código.

El ejemplo está hecho en Delphi 7.

SAlu2 a to2.

Ramón

Neftali [Germán.Estévez] 18-03-2010 16:55:09

Excelente aporte.
¿Podrías subirlo al FTP? Así le puede servir a otras personas que busquen sobre el tema.

delphi.com.ar 18-03-2010 17:35:02

Cita:

Empezado por rrf (Mensaje 356871)
...Son unos pocos procedimientos que permiten crear directamente hojas de cálculo Excel....

Vi el código, y sigo recomendando utilizar la clase TBiffFile de la unit BiffFile de mis componentes. Básicamente es lo mismo, mucho mas extenso y prolijo, y embebido en una clase!

Saludos!

rrf 30-03-2010 16:02:28

Hola de nuevo.
Lamento haber tardado tanto en contestar, pero mi correo electrónico consideró el mensaje de aviso de que el tema había sido contestado como espam y lo acabo de descubrir y leer ahora mismo.
Neftali, gracias por tu comentario. Acabo de intentar acceder a FTP (en la parte alta de la página), pero me da error y no he podido.
Delphi.com.ar, la ventaja que tiene este código para mí es que no requiere instalar componentes pues, en la medida de lo posible, procuro evitar el utilizar componentes nuevos.
Saludos.
Ramón

delphi.com.ar 30-03-2010 16:23:11

Cita:

Empezado por rrf (Mensaje 358810)
Delphi.com.ar, la ventaja que tiene este código para mí es que no requiere instalar componentes pues, en la medida de lo posible, procuro evitar el utilizar componentes nuevos.

Los componentes no dejan de ser código, utilizar un fragmento de código bajado de la Web es lo mismo que utilizar un componente, con la salvedad que el componente lo tienes que instalar. Para usar la clase que te digo no es necesario instalar ningún componente, simplemente usar la unit BiffFile que tiene la clase TBiffFile al igual que utilizas la unit con ese código.

Saludos!

Wbarrantes 12-10-2010 20:15:36

problema en el ejemplo
 
cuando intento exportar en el ejemplo a excel... apareceun error,pues para un texto tan simple con wes, me pone caracteres extra;os entre las letras
w#e#s algo asi...

Neftali [Germán.Estévez] 13-10-2010 11:39:03

Tal vez deberías explicar mejor el error que te está dando.
¿Qué versión de Office utilizas?
¿Al generar al abrir?
....

Wbarrantes 13-10-2010 18:21:45

ok,... No genera un error de codigo, si no un error en el formato del archivo exportado... en cada celda de la hoja de excel que se escribio... el ejemplo original, se escribe en cada celda la palabra "CELL:" pero al abrir con Excell se ve C[?]E[?]L[?]L[?]:

[?]= [un simbolo de pregunta dentro de una cajita cerrada]

utilizo Office 2007... pero se supone que puede leer archivos de versiones anteriores....

Gracias portu ayuda,ne el foro de embarcadero algo estuve viendo al respecto de este mismo problema, pero no puedo abrir la pagina del foro... jejeje al unico foro que tengo derechos de ingreso es al del CLUBDELPHI, depues de una buena rogada que me pegue en el trabajo,pues para mi este foro es una herramienta muy importante....

jaimeh 19-11-2010 14:31:47

Mirando los componentes de delphi.com.ar y la unidad BiffFile, no veo que
se pueda poner color a las celdas. Me imagino que los Biff no lo permitiran.

yosvanyisel 19-11-2010 17:57:33

Excelente Ejemplo Tienes 100000000 Puntos
 
" RRF " EXCELNTE FELICIDADES

Para mucho nos habria sido interesanta que explicaras en detalle con comentarios que hacen los procedimientos, pero de igual modo me ha servido muchisimo.

Hay muchisima gente buscando eso graciasss saludos

rrf 20-11-2010 10:00:55

1 Archivos Adjunto(s)
Hola Yosvanyisel.

Como te ha servido y además te ha gustado, pues voy a añadir otra versión que hice en su tiempo y que no me animé a incluirla en el foro por temor a agotar la capacidad de subir archivos al foro que tengo.

Es ligeramente mejor que el anterior porque añade la opción de crear un "informe" más realista y la de cargar automáticamente la hoja de cálculo con el programa que para ello esté configurado en Windows.

Lo hice con la idea de que fuera más claro el código para personas que se inciaban en Delphi y de probarlo para usarlo a nivel personal.

Espero que te sirva a tí y a quien lo necesite.

Saludos.

vmorillos 14-01-2011 15:37:30

A 2007
 
Hola RRF, habrá forma de modificar el programa para que migra datos a excel 2007 para de esta forma soportar mas de 65536 filas.
Creo que la cosa va por las variables "CXls".

Gracias.
Saludos a todos.

dibe

cmoncada 14-01-2011 18:34:42

Gracias
 
Muchas Gracias rrf, estaba buscando como realizar esta parte, y esta muy claro y como funciona la exportacion a excel.

Gracias buen aporte.


Cita:

Empezado por rrf (Mensaje 382853)
Hola Yosvanyisel.

Como te ha servido y además te ha gustado, pues voy a añadir otra versión que hice en su tiempo y que no me animé a incluirla en el foro por temor a agotar la capacidad de subir archivos al foro que tengo.

Es ligeramente mejor que el anterior porque añade la opción de crear un "informe" más realista y la de cargar automáticamente la hoja de cálculo con el programa que para ello esté configurado en Windows.

Lo hice con la idea de que fuera más claro el código para personas que se inciaban en Delphi y de probarlo para usarlo a nivel personal.

Espero que te sirva a tí y a quien lo necesite.

Saludos.


rrf 14-01-2011 18:34:46

Cita:

Empezado por vmorillos (Mensaje 387543)
Hola RRF, habrá forma de modificar el programa para que migra datos a excel 2007 para de esta forma soportar mas de 65536 filas.
Creo que la cosa va por las variables "CXls".

Vmorillos, lo siento, no te puedo ayudar.

El código que hace el proceso no es mío y no comprendo como funciona.

Mi aportación en el archivo de descarga fue el incluir ese código en una sencilla aplicación que facilitara el probarlo. Como funciona, lo desconozco...

Recibe un saludo.

sintecsl 26-01-2011 09:35:52

Ejemplo de una unidad creada para exportar
 
1 Archivos Adjunto(s)
Esta unidad forma parte de un programa mucho mas extenso. Es por ello que algunos objetos no los tendras, pero lo puedes adaptar a lo que quieras y te dá las claves para realizar dicha exportación.

Código Delphi [-]

unit ExportaXLS;

interface

Uses Grids;

// Added by MANEL 31/10/2010 7:22:54
//Procedimiento que exporta la Tabla a XLS
procedure ExportarXLS(const Tabla : TStringGrid; const Fichero : String);

implementation

uses ComObj, Graphics, CARATULAS, { ShellApi,} Dlg_MensajeTransaccion,
     Configuracion, SysUtils, StrUtils, UtilidadSTR, UtilidadFiles;

procedure ExportarXLS(const Tabla : TStringGrid; const Fichero : String);
label Comienza;
const //Constantes cogidas del fichero ExcelXP.pas
  xlCenter = $FFFFEFF4;
  xlJustify = $FFFFEFDE;
  xlBottom = $FFFFEFF5;
  xlLeft = $FFFFEFDD;
  xlRight = $FFFFEFC8;
  xlTop = $FFFFEFC0;
var
  Excel, WorkBook, WorkSheet, Range : Variant;
  RangoIni, RangoFin : string;
  F, C : Integer; //Fila y columna de la Hoja XLS
  Row : Integer; //Fila de la Tabla
  ConPrecios : Boolean; //Determina si se imprimen los precios
procedure FuenteParaLaHoja(const NomFuente : string; TamFuente : Integer);
begin
     //Le daremos formato a toda la tabla
     RangoIni:='A1';
     RangoFin:='E'+IntToStr(Tabla.RowCount+6);
     Range:=WorkSheet.Range[RangoIni,RangoFin];
     Range.Font.Name:=NomFuente;
     Range.Font.Size:=TamFuente;
end;
procedure PonCabecera;
var
  c : Integer;
begin
     //Lo hacemos por rango
     RangoIni:='A'+IntToStr(F);
     RangoFin:='E'+IntToStr(F);
     Range:=WorkSheet.Range[RangoIni,RangoFin];
     Range.Font.Size:=12; //Tamaño fuente
     Range.Font.Bold:=True; //En negrita
     Range.Font.Underline:=True; //Subrayado
     Range.Interior.Color:=clSilver; //Fondo
     Range.VerticalAlignment:=xlTop;
     Range.HorizontalAlignment:=xlCenter;
     //Ponemos valores
     for C:=1 to Tabla.ColCount do
       WorkSheet.Cells[F, C]:=Tabla.Cells[C-1,0];
end;
{procedure FormatoCant;
begin
     WorkSheet.Cells[F, C]:=Tabla.Cells[C-1,Row];
     WorkSheet.Cells[F, C].NumberFormat:='###.###';
     WorkSheet.Cells[F, C].Font.Name:='Arial'; //Tipo fuente
     WorkSheet.Cells[F, C].Font.Size:=10; //Tamaño fuente
     WorkSheet.Cells[F, C].VerticalAlignment:=xlTop;
     WorkSheet.Cells[F, C].HorizontalAlignment:=xlCenter;
end;
procedure FormatoUD;
var
  Celda : string;                           
begin
     Celda:=Tabla.Cells[C-2,Row];
     if (Pos('*',Celda)>0)Or(Pos('@',Celda)>0) then Exit; //Clave de formato
     WorkSheet.Cells[F, C]:=Tabla.Cells[C-1,Row];
     WorkSheet.Cells[F, C].Font.Name:='Arial'; //Tipo fuente
     WorkSheet.Cells[F, C].Font.Size:=10; //Tamaño fuente
     WorkSheet.Cells[F, C].VerticalAlignment:=xlTop;
     WorkSheet.Cells[F, C].HorizontalAlignment:=xlCenter;
end; }
procedure FormatoConcepto;
var
  Celda : string;
begin
     //Esta parte es común para todos
     WorkSheet.Cells[F, C]:=Tabla.Cells[C-1,Row];
     Celda:=Tabla.Cells[C-2,Row];
     if (Pos('*',Celda)>0)Or(Pos('@',Celda)>0) then
       Begin //Formato especial
            WorkSheet.Cells[F, C].Font.Bold:=True; //En negrita
            if Pos('@',Celda)>0 then //Nota
               WorkSheet.Cells[F, C].Font.Color:=clGreen//clRed //Color fuente
            else WorkSheet.Cells[F, C].Font.Color:=clBlue; //Color fuente
            if Pos('**',Celda)>0 then //Subtotales, totales parciales y totales
               begin
                    WorkSheet.Cells[F, C].VerticalAlignment := xlBottom;
                    WorkSheet.Cells[F, C].HorizontalAlignment:=xlRight;
               end
       end;
end;
procedure FormatoTotal;
var
  Celda : string;
begin
     //Miramos que se imprime
     Celda:=Tabla.Cells[C-4,Row];
     if Pos('*',Celda)>0 then //Significa que hay algún tipo de total o resumen
        WorkSheet.Cells[F, C].Font.Bold:=True; //En negrita
     if (Config.Impresora.Total)and(Pos('***',Celda)>0) then  //Totales
        WorkSheet.Cells[F, C]:=Tabla.Cells[C-1,Row]
     Else
     if (Config.Impresora.SubTotales)and(Celda='**') then //SubTotales
        WorkSheet.Cells[F, C]:=Tabla.Cells[C-1,Row]
     else
     if (Celda='*')and(Config.Impresora.Total) then //Son del resumen
        WorkSheet.Cells[F, C]:=Tabla.Cells[C-1,Row]
     else
     if Config.Impresora.Totales then //Parciales
        WorkSheet.Cells[F, C]:=Tabla.Cells[C-1,Row];
end;
var
  Dir, FileTemp : string;
begin
      // Added by MANEL 30/10/2010 7:45:11
      //Importante podriamos poner la mayoría de las celdas de totales con fórmulas
      //con la siguiente instrucción Range.formula:='+A1*C1' o celda a celda con
      //WorkSheet.Cells[F, 4].formula:='+A1*C1'; por ejemplo

      ConPrecios:=ConfirmaPregunta('¿ PONER PRECIOS A LA HOJA DE CÁLCULO?' )=0;
    try
      // crear instancia de la aplicación Excel (requieres la unidad ComObj)

      Excel := CreateOleObject('Excel.Application');

      // evitar que nos pregunte si deseamos sobreescribir el archivo

   //   Excel.DisplayAlerts := false;  ****LA ELIMINAMOS PARA QUE LOS ERRORES SEAN VISIBLES

      // agregar libro de trabajo (El número es una constante)

      Workbook := Excel.Workbooks.Add(-4167);

      // tomar una referencia a la hoja creada y darle nombre

      WorkSheet := WorkBook.WorkSheets[1]; //1ª hoja
      WorkSheet.Name := 'PRESUPUESTO'; //Nombre de la hoja creada

      FuenteParaLaHoja('Arial',10); //Damos formato a toda la hoja

      //Llenamos las Celdas
      //(Toma en cuenta que las columnas y filas empiezan en 1, y que en el
      // WorkSheet.Cells[F,C]. F es la Fila y C es la Columna.)
      F:=2; //Apuntamos a la primera fila
      //Damos formato de ancho a las columnas
      WorkSheet.Cells[F, 1].ColumnWidth:=9;  //Cant
      WorkSheet.Cells[F, 2].ColumnWidth:=7;  //Ud
      WorkSheet.Cells[F, 3].ColumnWidth:=90; //Descripción
      WorkSheet.Cells[F, 4].ColumnWidth:=14; //Pu
      WorkSheet.Cells[F, 5].ColumnWidth:=16; //Totales

      //Rellenamos datos del presupuesto
      C:=3; //Columna donde introduciremos
      WorkSheet.Cells[F, C]:='PRESUPUESTO Nº : '+Caratula.LabeledEdit1.Text;
      //Damos formato
      WorkSheet.Cells[F, C].Font.Size:=14; //Tamaño fuente
      WorkSheet.Cells[F, C].Font.Bold:=True; //En negrita
      WorkSheet.Cells[F, C].Font.Color:=clRed; //Color fuente
      WorkSheet.Cells[F, C].Font.Underline:=True; //Subrayado
      Inc(F,2);
      WorkSheet.Cells[F, C]:='Ref. : '+Caratula.LabeledEdit2.Text;
      //Damos formato
      WorkSheet.Cells[F, C].Font.Size:=12; //Tamaño fuente
      WorkSheet.Cells[F, C].Font.Color:=clBlue; //Color fuente
      WorkSheet.Cells[F, C].VerticalAlignment:=xlTop; //Justificacion Vertical
      WorkSheet.Cells[F, C].HorizontalAlignment:=xlJustify; //Justificación Horizontal

      // Tomando desde el StringGrid "Tabla" pasado por valor a este objeto
      //Creamos cabecera *************************************
      Inc(F,2);
      C:=1;
      PonCabecera;
      //Fin cabecera ******************************************

      //Daremos formato por rango de las columnas. Es obvio que en los totales.
      //apartados, anotaciones etc, tendrán un formato concreto distinto
      Inc(F);
      //Congelamos el panel visual de cabecera
      WorkSheet.Cells[F,1].Select; //Posicionamos cursor en la primera
    //  WorkSheet.Rows[F].Select; //Selecciona toda una fila
      Excel.ActiveWindow.FreezePanes := True;
    //  WorkSheet.Cells.Select; //Selección de toda la hoja
      //Columna Cant
      RangoIni:='A'+IntToStr(F);
      RangoFin:='A'+IntToStr(F+Tabla.RowCount);
      Range:=WorkSheet.Range[RangoIni,RangoFin];
      Range.VerticalAlignment:=xlTop;
      Range.HorizontalAlignment:=xlCenter;
      Range.NumberFormat:='###.###,##';

      //Columna Ud
      RangoIni:='B'+IntToStr(F);
      RangoFin:='B'+IntToStr(F+Tabla.RowCount);
      Range:=WorkSheet.Range[RangoIni,RangoFin];
      Range.VerticalAlignment:=xlTop;
      Range.HorizontalAlignment:=xlCenter;

      //Columna Concepto
      RangoIni:='C'+IntToStr(F);
      RangoFin:='C'+IntToStr(F+Tabla.RowCount);
      Range:=WorkSheet.Range[RangoIni,RangoFin];
      Range.VerticalAlignment:=xlTop;
      Range.HorizontalAlignment:=xlLeft;
      Range.WrapText:=True; //Indica adaptación de línea al contenido

      //Columna Pu y Total
      RangoIni:='D'+IntToStr(F);
      RangoFin:='E'+IntToStr(F+Tabla.RowCount);
      Range:=WorkSheet.Range[RangoIni,RangoFin];
      Range.VerticalAlignment:=xlBottom;
      Range.HorizontalAlignment:=xlRight;
      Range.WrapText:=True; //Indica adaptación de línea al contenido
      Range.NumberFormat:='###.###,## €';

      //Con los anteriores formatos esta definido lo que es por defecto.
      //Ahora hay que determinar las filas que son especiales

      //Colocamos datos de la tabla
      DlgTransaccion.Barra.ValorMax:=Tabla.RowCount;
      DlgTransaccion.Show;
      for Row:=1 To Tabla.RowCount-1 do
        begin
             DlgTransaccion.Barra.Progress:=Row;
             C:=1; //Columna "Cant"
             WorkSheet.Cells[F, C]:=AnsiReplaceStr(Tabla.Cells[C-1,Row],'.','');
             C:=2; //Columna "Ud"
             WorkSheet.Cells[F, C]:= Tabla.Cells[C-1,Row];
             C:=3; //Columna "Concepto"
             FormatoConcepto; //En esta hay distintas alineaciones y formatos
             // A partir de aquí mirar si los precios son "visibles"
             if ConPrecios then //Ponemos las columnas de precios
               begin
                    C:=4; //Columna "PU"
                    if Config.Impresora.Pu then
                       WorkSheet.Cells[F, C]:=Tabla.Cells[C-1,Row];
                    C:=5; //Columna "Total"
                    FormatoTotal;
               end;
             Inc(F);
        end;
      // guardamos en archivo XLS la hoja generada
      DlgTransaccion.Close; //Cerramos dialogo transacción
      try //Esta parte es la mas delicada
        //Crearemos un temporal que eliminaremos
        Dir:=ExtractFilePath(Fichero);
        FileTemp:=DameFicheroTemp(Dir,'EXPORTACION PRESUPUESTO','.XLS');
        WorkBook.SaveAs(FileTemp);
        Excel.Quit;
        if not CopiaFichero(FileTemp,Fichero) then
           MensageError('No se pudo copiar el fichero :'#13+Fichero);
        BorraFichero(FileTemp); //Borramos el temporal
      except //Capturamos fallos principales de guardado o de apertura simultanea
            //Desconectamos
            Excel.Quit;
            DlgTransaccion.Close;
            Exit;
      end;
    finally // Si se produce algún error desconectar el objeto
         DlgTransaccion.Close;
         Excel.Quit;
    end
end;

end.

Espero que sea de ayuda.

Adjunto fichero.


La franja horaria es GMT +2. Ahora son las 08:07:44.

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