Bonjour,
Ce code permet de convertir un fichier excel en base paradox et inversement.
Pour ce faire le format du fichier excel doit être un peu specifique.
- Sur la première ligne il faut saisir le type du champ
Pour l'instant je n'ai pas incorporé tous les types de champ d'une base paradox uniquement les plus utilisés (à mon gout) :
'S' : FieldType := FtString; Type de champ en string (il faut saisir une valeur de 1 à 255 pour définir la taille du champ sinon si S est tout seul la taile du champ est de 16) exemple : S25 définire un champ de type string et de 25 caractères de taille.
'F' : FieldType := FtFloat; Type de champ floattant
'I' : FieldType := FtInteger; Type de champ integer
'D' : FieldType := FtDate; Type de champ date
'DT' : FieldType := FtDateTime; Type de champ datetime
'T' : FieldType := FtTime; Type de champ Time
'M': FieldType := FtMemo; Type de champ Memo.
- Sur la seconde ligne le nom du champ. Attention le nom du champ définitif sera la concatenation du type + nom par exemple S22_Username. N'oublier pas que les noms de champ d'une base paradox ne peut pas dépasser 26 chr. Si c'est le cas le programme le tronquera automatiquement.
Pour tester il y a dans le répertoire xls et db un fichier test de chaque. Je vous conseille d'ouvrir le fichier excel pour voir le format.
Remarques :
- Lors du passage de xls à db pour connaitre le nombre d'enregistrement le programme scan la totalité de la colonne A donc la colonne A doit toujours avoir une donnée.
- Lors du passage de db à xls le programme incorpore d'office une clef primaire vous avez uniquement le choix du nom.
Je suis désolé j'ai essayer de faire le ménage dans le code car j'ai récupérer quelques morceaux dans mes différents softs il se peux que j'ai oublié 2 ou 3 petits détails, je m'en excuse si c'est le cas.
Source / Exemple :
Voir le zip ci joint
Conclusion :
J'espera que ce code pourra aider du monde. J'attends vos commentaires.
Je réfléchis à une nouvelle évolution si vous avez des propositions n'hésitez pas.
5 juil. 2013 à 02:36
16 avril 2013 à 15:29
est ce que vous pouvez m'aider a transferer Excel a des tables interbase (IBTable) Merci .
20 déc. 2010 à 13:27
je vous propose ci dessous quelques améliorations pour la fonction DB vers Excel
{------------------------------------------------------------------------------}
{Programmeur : Jean-Marc PIRES 23/06/2004 }
{ Exportation de la table sous excel. }
{ Rectifié joliJoli 19/12/2010 }
{ - Extension aux TDataset pour pouvoir exporter une requete SQL }
{ - corrigée la fonction ColExcel (qui ne marche pas au delà de la ligne 52 }
{ - traitement par ligne au lieu de colonne pour améliorer les performances }
{ sur de grandes tables (on ne parcoure la table qu'une seule fois) }
{ - Fourniture d'un nom de fichier par défaut (Nomtable pour les tables, }
{ ou NomComposant pour les requêtes }
{------------------------------------------------------------------------------}
//Définition globale
const
cXLSext = '.xls'; //.xlsx
var RepSaveDbToXls : string;
//procedure ExtractionExcel(TableTemp : TTable; var MemoTemp : TMemo{; var GaugeTemp : TGauge});
procedure ExtractionExcel(TableTemp : TDataset; var MemoTemp : TMemo{; var GaugeTemp : TGauge});
var I, J, ndx : Integer;
OleApplication : Variant;
OleWorkBook : Variant;
TypeChampAr : array[0..511] of String;
TypeChamp
, ColXls
, NomTable
, NomChamp
, NomFichier : String;
Cond : Boolean;
SaveDialogDb : TSaveDialog;
//***********************************************************************
{Permet de retrouver les colonnes AA .. ZZ sous excel}
function ColExcel(Col : Integer) : ShortString;
begin
If Col > 25 then
//Result := format('%d %s', [Col, Chr(64 + Col div 26) + Chr(65 + Col mod 26)])
Result := Chr(64 + Col div 26) + Chr(65 + Col mod 26)
else
//Result := format('%d %s', [Col, Chr(65 + Col)]);
Result := Chr(65 + Col);
end;
//***********************************************************************
begin
{On récupère le nom de la table ou query}
if TableTemp is TTable
then NomTable := Ttable(TableTemp).TableName
else NomTable := TableTemp.Name;
{Création de la boite de sauvegarde}
SaveDialogDb := TSaveDialog.Create(nil);
Try
{Initialisation de la boite de sauvegarde}
SaveDialogDb.Title := 'Sauver le fichier excel';
SaveDialogDb.Filter := 'Fichiers Excel (*.xls)|*.xls';
SaveDialogDb.FileName := changefileext(NomTable, cXLSext);
SaveDialogDb.InitialDir := RepSaveDbToXls;
If SaveDialogDb.Execute then
begin
{Récupération des infos de la boite de sauvegarde et sauvegarde du repertoire dans l'ini}
RepSaveDbToXls := ExtractFilePath(SaveDialogDb.FileName);
//SaveIni;
{On récupère le nom du fichier}
NomFichier := ExtractFileName(SaveDialogDb.FileName);
{Barre de progression + Memo}
//GaugeTemp.Visible := True;
MemoTemp.Lines.Add( 'Extraction de la table dans ' +
RepSaveDbToXls +
NomFichier);
MemoTemp.Update;
{Connection à excel}
Try
{On bloque l'affichage}
TableTemp.DisableControls;
{On lance excel}
{Création du lien OLE pour la classe référencé par Excel dans la base de registre "Excel.Application"}
OleApplication := CreateOleObject('Excel.Application');
{On ouvre le fichier voulu}
OleWorkBook := OleApplication.Workbooks.Add;
{On sélectionne l'onglet dans lequel on va entrer les données}
OleWorkBook.Worksheets.Item['Feuil1'].Activate;
{On colorie la premiere ligne en jaune}
OleApplication.Range['A1:'+ColExcel(TableTemp.FieldCount)+'1'].Interior.ColorIndex := 6;
{On applique les filtres auto}
//OleApplication.Range['A2:'+ColExcel(I-1)+IntToStr(J)].AutoFilter;
{Initialisation de la progressbar}
//GaugeTemp.MaxValue := TableTemp.FieldCount;
//GaugeTemp.Progress := 1;
MemoTemp.Lines.Add( 'Extraction des colonnes');
ndx := MemoTemp.Lines.Count;
MemoTemp.Lines.Add( '');
//définit le format des données par colonnes
For I:= 0 to TableTemp.FieldCount-1 do
begin
//Recherche du type de champ
case TableTemp.Fields.Fields[I].DataType of
FtString : If TableTemp.Fields.Fields[I].Size = 16
then TypeChampAr[I] := 'S'
else TypeChampAr[I] := 'S' + IntToStr(TableTemp.Fields.Fields[I].Size);
FtFloat : TypeChampAr[I] := 'F';
FtInteger : TypeChampAr[I] := 'I';
FtDate : TypeChampAr[I] := 'D';
FtTime : TypeChampAr[I] := 'T';
FtDateTime : TypeChampAr[I] := 'DT';
FtMemo : TypeChampAr[I] := 'M';
//FtGraphic : TypeChamp := 'G';
end;
{Récupération du nom de ce champ}
NomChamp := TableTemp.Fields.Fields[I].FieldName;
ColXls := ColExcel(I);
OleApplication.Cells[1,ColXls].Formula := NomChamp;
MemoTemp.Lines[ndx] := Format( NomChamp+' %d/%d col:%s',
[I, TableTemp.FieldCount, ColXls]
);
MemoTemp.Update;
end;
//Exporte les données par ligne
Cond := TableTemp.FindFirst;
//Récupération du contenu de ces champs
J := 2;
While Cond do
begin
//On indique l'état d'avancement dans le memo
MemoTemp.Lines[ndx] := Format( 'Extraction de la ligne%d/%d',
[J-1, TableTemp.recordcount]
);
MemoTemp.Update;
for I := 0 to TableTemp.FieldCount-1 do
begin
if TypeChampAr[I] = 'F' then OleApplication.Cells[J,ColExcel(I)].NumberFormat := '0.000';
OleApplication.Cells[J,ColExcel(I)].Formula := TableTemp.Fields.Fields[I].AsString;
end;
Cond := TableTemp.FindNext;
Inc(J);
end;
{On renomme l'onglet}
OleWorkBook.Worksheets.Item['Feuil1'].Name := NomTable;
{On désactive les messages d'excel}
OleApplication.DisplayAlerts := False;
OleApplication.ActiveWorkBook.SaveAs(RepSaveDbToXls + NomFichier);
{On Réactive les messages d'excel}
OleApplication.DisplayAlerts := True;
Finally
{On rend excel visible}
OleApplication.Visible:=True;
{On réactive les mise à jour de la base}
TableTemp.EnableControls;
{On ferme le lien ole}
{Barre de progression}
//GaugeTemp.Visible := False;
{On confirme la fin de l'extraction et on initialise les boutons du menu}
MemoTemp.Lines.Add('Extraction de la table "' + NomTable + '" terminée.');
end;
end;
Finally
SaveDialogDb.Free; {On libère le mémoire}
end;
end;
10 févr. 2009 à 09:23
bon merci pour ton application, moi g'ai une application développée par delphi avec une base de donnée access, est ce que ce code va m'aider pour importer et exporter ver ma base access et que ce que je doit modifier comme code merci d'avance.
10 févr. 2009 à 09:20
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.