Aquí dejo cómo podemos exportar el resultado de un DataSet a un Archivo Excel, para quien le pueda ser útil, en mi caso utilicé el TFDQuery, pero es aplicable para cualquier otro, el código incluye una barra de progreso:
procedure TFInvGeneral.exportToExcel(AData: TFDQuery; AProgreso: TProgressBar); procedure ProgressBarInit; begin AProgreso.Max := AData.RecordCount; AProgreso.Position := 0; AProgreso.Visible := True; end; var ExcelApp, Libro: Variant; fila, i:integer; Columnas: TStringList; begin Columnas := TStringList.Create; Columnas.Add('Código'); Columnas.Add('Referencia'); Columnas.Add('Insumo/Pieza'); Columnas.Add('Marca'); Columnas.Add('Existencia'); Columnas.Add('Condición'); Columnas.Add('Area'); Columnas.Add('Costo'); //svGuardar es un SaveDialog para poder especificar la ruta del archivo svGuardar.Title := 'Exportando Reporte a Excel'; svGuardar.DefaultExt := '*.xlsx'; svGuardar.Filter := 'Archivos Excel (*.xls,*.xlsx)|*.xls;*.xlsx'; svGuardar.FilterIndex := 1; try svGuardar.Execute; if (svGuardar.FileName <> '') then begin // Comprobar si existe el component TProgressBar if (AProgreso <> nil) then ProgressBarInit; //Deshabilitamos los controles AData.DisableControls; //Creamos el archivo Excel ExcelApp := CreateOleObject('Excel.Application'); //Evitamos mostrar las alertas propias de Excel ExcelApp.DisplayAlerts := false; // Añadimos una Hoja ExcelApp.WorkBooks.Add(); // Colocamos el Nombre de la Hoja ExcelApp.WorkBooks[1].ActiveSheet.Name := 'Inventario'; // Activamos la hoja la cual trabajaremos Libro := ExcelApp.WorkBooks[1].ActiveSheet; // Orientación de página //1 - Vertical y 2 - Horizontal Libro.PageSetup.Orientation := 1; //Agregamos la primera fila con la cabecera for i:= 0 to Columnas.count - 1 do begin Libro.Cells[1,i+1] := Columnas.Strings[i]; Libro.Cells[1,i+1].Font.Bold := True; Libro.Cells[1,i+1].font.Size := 12; Libro.Cells[1,i+1].font.Color := clWhite; Libro.Cells[1,i+1].Interior.Color := clGray ; Libro.Cells[1,i+1].HorizontalAlignment := -4108; //-4108 corresponde al centralizado del texto end; // Ahora cargaremos los datos //Empezamos desde la segunda fila //Recordar que la primera es la cabecera fila := 2; //Lo dejamos en Segundo Plano ExcelApp.Visible := False; AData.First; while not AData.eof do begin //Código Libro.Cells[fila,1].NumberFormat := '0'; Libro.Cells[fila,1] := AData.FieldByName('INS_ID').AsInteger; //Referencia Libro.Cells[fila,2].NumberFormat := RPad('0', '0', Length(AData.FieldByName('INS_REF').AsString)); Libro.Cells[fila,2] := AData.FieldByName('INS_REF').AsString; //Insumo/Pieza Libro.Cells[fila,3].NumberFormat := RPad('0', '0', Length(AData.FieldByName('INS_NOMBRE').AsString)); Libro.Cells[fila,3] := AData.FieldByName('INS_NOMBRE').AsString; //Marca Libro.Cells[fila,4].NumberFormat := RPad('0', '0', Length(AData.FieldByName('INS_MARCA').AsString)); Libro.Cells[fila,4] := AData.FieldByName('INS_MARCA').AsString; //Existencia Libro.Cells[fila,5].NumberFormat := '0.00'; Libro.Cells[fila,5] := AData.FieldByName('INS_EXISTENCIA').asFloat; //Condicion Libro.Cells[fila,6].NumberFormat := RPad('0', '0', Length(getCondicion(AData.FieldByName('INS_CONDICION').AsInteger))); Libro.Cells[fila,6] := getCondicion(AData.FieldByName('INS_CONDICION').AsInteger); //Area Libro.Cells[fila,7].NumberFormat := RPad('0', '0', Length(getArea(AData.FieldByName('INS_AREA').AsInteger))); Libro.Cells[fila,7] := getArea(AData.FieldByName('INS_AREA').AsInteger); //Costo Libro.Cells[fila,8].NumberFormat := '0.00'; Libro.Cells[fila,8] := AData.FieldByName('INS_COSTE').AsFloat; //Autofijamos las columnas Libro.Cells.Columns.Autofit; //Siguiente Fila Inc(Fila); AProgreso.Position := AProgreso.Position + 1; AData.Next; end; AData.EnableControls; Libro.SaveAs(svGuardar.FileName); if AProgreso.Position = AData.RecordCount then begin MessageDLG('¡Se exportó correctamente!',mtInformation,[mbOk],0); ExcelApp.Visible := True; end; end; //if svGuardar.FileName <> '' except ExcelApp.Quit; AData.EnableControls; Showmessage('No se pudo crear el Archivo Excel.'); raise; end; Columnas.Free; end;
Saludos.