Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Exportar a Excel (https://www.clubdelphi.com/foros/showthread.php?t=67021)

ycastilloa86 24-03-2010 16:40:10

Exportar a XLS sin instalar Excel
 
Hola: Tengo una aplicacion en la que exporto varias cosas de mi base de datos para ficheros Excel, utilizo SQL 2000-2005, ambos, la aplicacion debe correr sobre cualquiera de los dos. Para ello primeramente creo los ficheros xls y posteriormente inserto los datos utilizando la instruccion INSERT INTO OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database... El problema es que estoy obligado a tener instalado el Excel en el lugar donde se corra la aplicacion. Por favor si alguien tiene alguna solución o me pudiera brindar alguna idea de como solucionarlo, tal vez exista alguna biblioteca que se pudiera poner en vez de instalar el Excel...o quizas sea mejor exportar los datos a XML u otro formato...en fin cualquier idea. Nota: los datos que exporto necesito poderlos importar posteriormente, asi que el formato debe poderse cargar en la base de datos de alguna forma. Gracias de antemano por cualquier idea o sugerencia.

Neftali [Germán.Estévez] 25-03-2010 13:35:53

Revisa los hilos que tienes en la parte inferior de la página, seguro que hay alguno que puede ayudarte. Otra opción es realizar un búsqueda en los hilos del club, es un tema que ya hemos tratado otras muchas veces.

olbeup 13-04-2010 08:56:06

Estimado ycastilloa86,

Yo utilizo una función que he ido recopilando información hasta que he conseguilo lo que queria, bueno, aun me queda por refinarlo mas, pero me sirve.
Código Delphi [-]
unit FyPExportarExcel;

interface

uses
  SysUtils, DB, DBGrids, ComCtrls, ComObj, Excel2000;

  procedure ExportToExcel(FileNameXLS, SheetName: String;
    DBGrid: TDBGrid; ProgressBarXls: TProgressBar = nil);

implementation

procedure ExportToExcel(FileNameXLS, SheetName: String;
  DBGrid: TDBGrid; ProgressBarXls: TProgressBar);

  procedure ProgressBarInit;
  begin
    ProgressBarXls.Max := DBGrid.DataSource.DataSet.RecordCount;
    ProgressBarXls.Position := 0;
    ProgressBarXls.Visible := True;
  end;

const
  xlWBATworksheet = -4167;
var
  Excel, WorkBook, WorkSheet: OleVariant;
  I, J: Integer;
  PBookmark: TBookmark;
begin
  // Guardar la posición en la DB y desactivar que se mueva el registro
  PBookmark := DBGrid.DataSource.DataSet.GetBookmark;
  DBGrid.DataSource.DataSet.DisableControls;
  DBGrid.DataSource.DataSet.First;

  // Comprobar si existe el component TProgressBar
  if (ProgressBarXls <> nil) then
    ProgressBarInit;

  // Crear instancia de la aplicación Excel
  Excel := CreateOleObject('Excel.Application');

  // Evitar que nos pregunte si deseamos sobreescribir el archivo
  Excel.DisplayAlerts := False;

  // Agregar libro de trabajo
  WorkBook := Excel.Workbooks.Add(xlWBATWorksheet);

  // Tomar una referencia a la hoja creada
  WorkSheet := WorkBook.WorkSheets[1];

  // Se  describe el nombre de la hoja
  WorkSheet.Name := SheetName;

  // Llenamos las celdas
  //    Toma en cuenta que las columnas y filas empiezan en 1, y que en el
  // WorkSheet.Cells[I, J], I es la fila y J es la columna.

  //   Extrae los nombres de los campos del DBGrid y los coloca en el primer registro,
  // excluyendo los campos que están ocultos
  for J := 0 to DBGrid.FieldCount -1 do
    if DBGrid.Fields[J].Visible then
    begin
      // Poner la fuente de letra en Negrita
      WorkSheet.Cells[1, J +1].Font.Bold := True;
      // Centrar la celda
      WorkSheet.Cells[1, J +1].HorizontalAlignment := xlCenter;
      // Asignamos Valor del titulo del DBrid
      WorkSheet.Cells[1, J +1] := DBGrid.Columns[J].Title.Caption;
    end;

  // Guardar los registros
  for I := 0 to DBGrid.DataSource.DataSet.RecordCount -1 do
  begin
    // Identificamos los campos y lo grabamos según su tipo
    for J := 0 to DBGrid.FieldCount -1 do
      case DBGrid.Fields[J].DataType of
        ftAutoInc, ftBytes, ftInteger, ftSmallint, ftWord: // Auto o Numérico
          WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsInteger;
        ftBCD, ftFloat, ftCurrency: // Numérico con decimales
          WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsFloat;
        ftDateTime, ftDate, ftTime: // Fecha y Hora
          WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsDateTime;
        else // Todo lo demas caracteres
          WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsString;
      end;

    // Saltamos de registro
    DBGrid.DataSource.DataSet.Next;

    // Comprobar si existe el component TProgressBar
    if (ProgressBarXls <> nil) then
      ProgressBarXls.Position := ProgressBarXls.Position +1;
  end;

  // Comprobar si existe el component TProgressBar
  if (ProgressBarXls <> nil) then
    ProgressBarXls.Visible := False;

  // Redimensionar todas las celdas para que esten según su tamaño
  WorkSheet.Cells.Columns.AutoFit;

  // Guardar el archivo
  WorkBook.SaveAs(FileNameXLS);

  // Cierra el archivo
  WorkBook.Close(FileNameXLS);

  // Salir de Excel
  Excel.Quit;

  // posicionar el registro donde estaba
  DBGrid.DataSource.DataSet.GotoBookmark(PBookmark);
  DBGrid.DataSource.DataSet.FreeBookmark(PBookmark);
  DBGrid.DataSource.DataSet.EnableControls;
end;

end.
Un saludo.

P.D.: Si puedes aportar algo a esta función te lo agradecería.

ycastilloa86 13-04-2010 18:40:19

Gracias por responder olbeup, desgraciadamente con el codigo que me brindas no puedo resolver mi problema, puesto que para ello se necesita tener instalado el Excel, lo cual es mi principal problema. He buscado en todo el foro y no he podido encontrar una solucion que me sea factible. Si alguien tiene alguna sugerencia se lo agradeceria.

mRoman 05-07-2010 20:11:18

En mis hilos...esta la solucion
 
Hola....

Busca los hilos de mi usuario MRoman, yo he tratado el tema de exportacion a excel sin tener excel instalado....ahi puse una soluición....y tengo el componente para exportar, es facil....

Checalos y cualquier cosa me comentas....

Saludos

Jab 09-07-2010 13:44:55

Hola, puedes exportarlos a CSV separados por ";".
Al generarlo si lo cargas con un ordenador que tenga Excel lo abrirá convirtiendo cada trozo de separación en una columna.
Cada línea se traduce en un registro.

De esta manera como ejemplo:

CODIGO; NOMBRE; APELLIDO; DATOS; REF;
100;PEPIN; TRE; CÓMICO; REF1291

mRoman 10-07-2010 07:03:45

Csv.
 
Fijate que yo los exporte a hojas de calculo, desde un DataSet hacia una plantilla de Excel....este archivo lo genere efectivamente en Excel, pero mi aplicacion lo toma y con el componente q tengo logro exportar estos datos a la hoja de calculo o plantilla.

Este archivo al final puede ser abierto en OpenOffice y obvio en MS Office. Es mucho mejor que usar archivos CSV, ya q las plantillas puedes manejar el formato que usan los usuarios, lo unico que haces en llenar este formato con los datos del DataSet...

Si lo q quieres es exportar a archivos con CSV, existe un componente llamado XLSExportFile, el cual guarda la información en un archivo XLS, sin necesidad que lo conviertas primero a CSV y luego le dejes esta chamba al usuario....es decir que lo abra en una aplicacion office, mejor q genere el archivo listo para ser visto.

Visita esta pagina http://www.delphiner.webcindario.com/ aqui te dejare algunos componentes para q los instales y los cheuques esperando te sirvan....

mRoman 10-07-2010 07:33:31

Pagina WEB
 
Oye Disculpa....pero mi pagina esta dando problemas, la actualice, pero algo pasa con los archivos ZIP que subi.

En fin la otra opcion es buscar con nuestro amigo Google.

Saludos, nos comentas como te fué !

CoerveAbere 30-07-2010 21:24:36

Exportar a Excel
 
Hola a todos, espero que esten bien. es mi primer post en este foro... Bueno el problema que tengo es que necesito exportar unos archivos de audio en formato: WAV/G711 U-Law para un IVR de voicenote... al parecer el Audacity puede hacerlo pero no se donde, dice que debo bajar el FFmpeg, ya lo hice lo instale y nada... Me voy a preferencias/files formats/umcompressed export format/other y no veo ninguno que diga G711, por favot ayudenme ya que necesito entregar esto lo mas pronto posible y son demasiados archivos... Estoy trabajando en MAC OSX 10.6.4 Gracias, espero su pronta respuesta Saludos.

Neftali [Germán.Estévez] 02-08-2010 12:11:52

Cita:

Empezado por CoerveAbere (Mensaje 372161)
Hola a todos, espero que esten bien. es mi primer post en este foro...

Hola, bienvenido a los foros.
Nosotros también esperamos que estés bien.

Se nota que es tu primer post en el foro. Te recomiendo que revises la Guía de estilo, de los foros.

oscarac 13-06-2011 07:41:51

Cita:

Empezado por olbeup (Mensaje 360252)
Estimado ycastilloa86,

Yo utilizo una función que he ido recopilando información hasta que he conseguilo lo que queria, bueno, aun me queda por refinarlo mas, pero me sirve.

Código Delphi [-]unit FyPExportarExcel;

interface

uses
SysUtils, DB, DBGrids, ComCtrls, ComObj, Excel2000;

procedure ExportToExcel(FileNameXLS, SheetName: String;
DBGrid: TDBGrid; ProgressBarXls: TProgressBar = nil);

implementation

procedure ExportToExcel(FileNameXLS, SheetName: String;
DBGrid: TDBGrid; ProgressBarXls: TProgressBar);

procedure ProgressBarInit;
begin
ProgressBarXls.Max := DBGrid.DataSource.DataSet.RecordCount;
ProgressBarXls.Position := 0;
ProgressBarXls.Visible := True;
end;

const
xlWBATworksheet = -4167;
var
Excel, WorkBook, WorkSheet: OleVariant;
I, J: Integer;
PBookmark: TBookmark;
begin
// Guardar la posición en la DB y desactivar que se mueva el registro
PBookmark := DBGrid.DataSource.DataSet.GetBookmark;
DBGrid.DataSource.DataSet.DisableControls;
DBGrid.DataSource.DataSet.First;

// Comprobar si existe el component TProgressBar
if (ProgressBarXls <> nil) then
ProgressBarInit;

// Crear instancia de la aplicación Excel
Excel := CreateOleObject('Excel.Application');

// Evitar que nos pregunte si deseamos sobreescribir el archivo
Excel.DisplayAlerts := False;

// Agregar libro de trabajo
WorkBook := Excel.Workbooks.Add(xlWBATWorksheet);

// Tomar una referencia a la hoja creada
WorkSheet := WorkBook.WorkSheets[1];

// Se describe el nombre de la hoja
WorkSheet.Name := SheetName;

// Llenamos las celdas
// Toma en cuenta que las columnas y filas empiezan en 1, y que en el
// WorkSheet.Cells[I, J], I es la fila y J es la columna.

// Extrae los nombres de los campos del DBGrid y los coloca en el primer registro,
// excluyendo los campos que están ocultos
for J := 0 to DBGrid.FieldCount -1 do
if DBGrid.Fields[J].Visible then
begin
// Poner la fuente de letra en Negrita
WorkSheet.Cells[1, J +1].Font.Bold := True;
// Centrar la celda
WorkSheet.Cells[1, J +1].HorizontalAlignment := xlCenter;
// Asignamos Valor del titulo del DBrid
WorkSheet.Cells[1, J +1] := DBGrid.Columns[J].Title.Caption;
end;

// Guardar los registros
for I := 0 to DBGrid.DataSource.DataSet.RecordCount -1 do
begin
// Identificamos los campos y lo grabamos según su tipo
for J := 0 to DBGrid.FieldCount -1 do
case DBGrid.Fields[J].DataType of
ftAutoInc, ftBytes, ftInteger, ftSmallint, ftWord: // Auto o Numérico
WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsInteger;
ftBCD, ftFloat, ftCurrency: // Numérico con decimales
WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsFloat;
ftDateTime, ftDate, ftTime: // Fecha y Hora
WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsDateTime;
else // Todo lo demas caracteres
WorkSheet.Cells[I +2, J +1] := DBGrid.Fields[J].AsString;
end;

// Saltamos de registro
DBGrid.DataSource.DataSet.Next;

// Comprobar si existe el component TProgressBar
if (ProgressBarXls <> nil) then
ProgressBarXls.Position := ProgressBarXls.Position +1;
end;

// Comprobar si existe el component TProgressBar
if (ProgressBarXls <> nil) then
ProgressBarXls.Visible := False;

// Redimensionar todas las celdas para que esten según su tamaño
WorkSheet.Cells.Columns.AutoFit;

// Guardar el archivo
WorkBook.SaveAs(FileNameXLS);

// Cierra el archivo
WorkBook.Close(FileNameXLS);

// Salir de Excel
Excel.Quit;

// posicionar el registro donde estaba
DBGrid.DataSource.DataSet.GotoBookmark(PBookmark);
DBGrid.DataSource.DataSet.FreeBookmark(PBookmark);
DBGrid.DataSource.DataSet.EnableControls;
end;

end.



Un saludo.

P.D.: Si puedes aportar algo a esta función te lo agradecería.

buenas noches
me gustaria ayuda con esta funcion... yo la utilizo tambien para migrar datos de un Dbgrid a un excel...

pero se me ocurrio no utilizar los titulos (nombres de los campos), si no mas bien (lo que viene aqui es idea)... crear una matriz bidimensional (array) en el cual coloque los titulos y poder utilizar esa matriz en este procedimiento.... lo que no se es como pasar como parametro esa matriz :(

si alguien tuviera una idea... he revisado ejemplo de pasar matrices como parametros pero.... ninguno me funciono :(


La franja horaria es GMT +2. Ahora son las 15:24:13.

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